php - এমএল - পিএইচপি প্রজেক্ট




PDO মধ্যে স্থায়ী সংযোগ ব্যবহার অসুবিধা কি কি (6)

পিডিও তে, PDO::ATTR_PERSISTENT বৈশিষ্ট্য ব্যবহার করে একটি সংযোগ PDO::ATTR_PERSISTENT যেতে পারে। পিএইচপি ম্যানুয়াল অনুযায়ী -

স্থায়ী সংযোগগুলি স্ক্রিপ্টের শেষে বন্ধ হয় না, তবে একই ক্র্যাশেশিয়াল ব্যবহার করে অন্য স্ক্রিপ্ট সংযোগের অনুরোধ করে ক্যাশে এবং পুনরায় ব্যবহার করা হয়। ক্রমাগত সংযোগ ক্যাশে প্রতিটি স্ক্রিপ্টকে ডাটাবেসের সাথে কথাবার্তা করার সময় প্রতিটি সময় একটি নতুন সংযোগ স্থাপন করার উপরে ওভারহেড এড়ানোর অনুমতি দেয় যার ফলে দ্রুত ওয়েব অ্যাপ্লিকেশন হয়।

ম্যানুয়াল এছাড়াও পিডিও ওডিবিসি ড্রাইভার ব্যবহার করে চলমান সংযোগ ব্যবহার না সুপারিশ, কারণ এটি ODBC সংযোগ পুলিং প্রক্রিয়া ব্যাহত হতে পারে।

তাই দৃশ্যতঃ পিডিওতে স্থায়ী সংযোগ ব্যবহারে কোনও ত্রুটি দেখা দেয় না, শেষ ক্ষেত্রে ব্যতীত। যাইহোক, আমি জানতে চাই যে এই প্রক্রিয়াটি ব্যবহার করার অন্য কোনও অসুবিধা আছে, অর্থাৎ, এমন একটি পরিস্থিতি যেখানে এই প্রক্রিয়াটি কার্যকারিতা হ্রাস বা এরকম কিছু ফলাফলের মধ্যে ঘটে।


আমার পরীক্ষাগুলিতে আমার স্থানীয়হস্তে এক সেকেন্ডেরও বেশি সংযোগ সময় ছিল, এইভাবে আমি ধরে নিচ্ছি যে আমি একটি স্থায়ী সংযোগ ব্যবহার করতে পারি। আরও পরীক্ষা দেখানো হয়েছে এটি 'localhost' এর সাথে একটি সমস্যা ছিল:

সেকেন্ডের মধ্যে পরীক্ষার ফলাফল (পিএইচপি মাইক্রোটাইম দ্বারা পরিমাপ):

  • হোস্ট ওয়েব: সংযোগ DB: 0.0038912296295166
  • স্থানীয় হোস্ট: সংযোগ ডিবি: 1.0214691162109 (এক সেকেন্ডের বেশি: স্থানীয় হোস্ট ব্যবহার করবেন না!)
  • 127.0.0.1: সংযোগ ডিবি: 0.00097203254699707

আগ্রহজনকভাবে: 127.0.0.1 ব্যবহার করে নিম্নোক্ত কোডটি যত তাড়াতাড়ি দ্রুত হয়:

$host = gethostbyname('localhost');
// echo "<p>$host</p>";
$db = new PDO("mysql:host=$host;dbname=" . DATABASE . ';charset=utf8', $username, $password,
    array(PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

আমার মনে হচ্ছে একটি ধারাবাহিক সংযোগ আরো সিস্টেমের সম্পদ খায়। হয়তো একটি তুচ্ছ পরিমাণ, কিন্তু এখনও ...


চার্লস সমস্যা উপরে প্রতিক্রিয়া,

থেকে: http://www.php.net/manual/en/mysqli.quickstart.connections.php -

স্থায়ী সংযোগ সম্পর্কে একটি সাধারণ অভিযোগ হল যে তাদের রাষ্ট্র পুনঃব্যবহারের পূর্বে পুনরায় সেট করা হয় না। উদাহরণস্বরূপ, খোলা এবং অসম্পূর্ণ লেনদেন স্বয়ংক্রিয়ভাবে ফিরে ঘূর্ণিত হয় না। কিন্তু, পুলের মধ্যে সংযোগ স্থাপন এবং পুনঃব্যবহারের মধ্যে সময় যা ঘটেছিল তা অনুমোদন পরিবর্তনগুলি প্রতিফলিত হয় না। এটি একটি অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া হিসাবে দেখা যেতে পারে। বিপরীতভাবে, স্থায়ী নামটি এমন প্রতিশ্রুতি হিসাবে বোঝা যায় যে রাষ্ট্রটি স্থির থাকে।

Mysqli এক্সটেনশান একটি স্থায়ী সংযোগের উভয় ব্যাখ্যা সমর্থন করে: রাষ্ট্র স্থির, এবং পুনঃব্যবহার করার আগে রাষ্ট্র রিসেট। ডিফল্ট রিসেট করা হয়। একটি স্থায়ী সংযোগ পুনঃব্যবহৃত হওয়ার আগে, mysqli এক্সটেনশানটি state-reset করতে mysqli_change_user() কে mysqli_change_user() কল করে। ব্যবহারকারীর কাছে ক্রমাগত সংযোগটি খোলা থাকলে মনে হয়। পূর্ববর্তী ব্যবহার থেকে কোন হস্তনির্মিত দৃশ্যমান হয়।

mysqli_change_user() ফাংশন একটি ব্যয়বহুল অপারেশন। সেরা পারফরম্যান্সের জন্য, ব্যবহারকারীরা কম্পাইল ফ্ল্যাগ MYSQLI_NO_CHANGE_USER_ON_PCONNECT সেট করে এক্সটেনশনটি পুনরায় কম্পাইল করতে চাইতে পারে।

নিরাপদ আচরণ এবং সেরা পারফরম্যান্সের মধ্যে চয়ন করার জন্য এটি ব্যবহারকারীর কাছে ছেড়ে দেওয়া হয়। উভয় বৈধ অপ্টিমাইজেশান লক্ষ্য। ব্যবহার সহজতর করার জন্য, সর্বাধিক কর্মক্ষমতা ব্যয় নিরাপদ আচরণ ডিফল্ট করা হয়েছে।


স্থায়ী সংযোগ একটি বড় কর্মক্ষমতা boost করা উচিত। আমি দৃঢ়তার সাথে একমত নই যে আপনাকে অবশ্যই "এড়িয়ে চলতে হবে"।

এটি উপরের মত অভিযোগগুলিকে মাইআইএএসএমএম টেবিলগুলি ব্যবহার করে এবং তাদের টেবিলে লকগুলি ধরে রেখে লেনদেনগুলির নিজস্ব সংস্করণগুলিতে হ্যাকিংয়ের মাধ্যমে চালিত হয় .. মনে হচ্ছে আপনি ডেলlock করতে যাচ্ছেন! PDO এর প্রারম্ভিক ট্রান্সঅ্যাকশন () ব্যবহার করুন এবং আপনার টেবিলগুলিকে InnoDB এ সরান।


স্থায়ী সংযোগগুলি ব্যবহারের ব্যাখ্যাটি সম্ভবত অন্যান্য উপাত্তগুলির তুলনায় MySQL এর সাথে তুলনামূলকভাবে দ্রুততর থাকা সত্ত্বেও, ব্যয়বহুল নয় এমন সংযোগগুলির পরিমাণ কমিয়ে আনছে।

স্থায়ী সংযোগ সঙ্গে খুব প্রথম সমস্যা ...

আপনি যদি প্রতি সেকেন্ডে 1000 এর সংযোগ তৈরি করেন তবে সাধারণত এটি নিশ্চিত হয় না যে এটি অনেকক্ষণ খোলা থাকে তবে অপারেশন সিস্টেমটি করে। টিসিপি / আইপি প্রোটোকলের উপর ভিত্তি করে পোর্টগুলি অবিলম্বে পুনর্ব্যবহৃত করা যাবে না এবং পুনঃব্যবহৃত হওয়ার আগে "FIN" পর্যায়ে অপেক্ষা করতে হবে।

দ্বিতীয় সমস্যা ... অনেক MySQL সার্ভার সংযোগ ব্যবহার করে।

অনেক লোক সহজেই বুঝতে পারছেন না যে আপনি * max_connections * পরিবর্তনশীলকে বৃদ্ধি করতে এবং মাইএসকিউএলগুলির সাথে 100 টিরও বেশি সমবর্তী সংযোগগুলি অর্জন করতে পারবেন। পুরোনো লিনাক্স সমস্যাগুলির দ্বারা মাইএসকিউএল এর সাথে 1024 টিরও বেশি সংযোগ প্রকাশ করতে ব্যর্থতার কারণে পুরানো লিনাক্স সমস্যাগুলি হারাবে।

MySQLi সম্প্রসারণে কেন স্থায়ী সংযোগগুলি নিষ্ক্রিয় করা হয়েছিল তা নিয়ে আলোচনা করার অনুমতি দেয়। আপনি সর্বদা সংযোগগুলি অপব্যবহার করতে পারেন এবং দুর্বল কর্মক্ষমতা অর্জন করতে পারেন যা মূল কারণ নয়। প্রকৃত কারণ হল - আপনি এটি দিয়ে অনেক বেশি সমস্যা পেতে পারেন।

মাইএসকিউএল 3.2২ / 3.23 এর পুরো সময়গুলিতে পিএইচপিগুলিতে স্থায়ী সংযোগ স্থাপন করা হয়েছিল যখন মাইএসকিউএল এত কঠিন ছিল না যার মানে আপনি কোন সমস্যা ছাড়াই সহজেই সংযোগগুলি পুনঃসাইকেল করতে পারে। পরবর্তী সংস্করণে সমস্যাগুলির পরিমাণ যদিও আসছে - যদি আপনি এমন সংযোগটি পুনঃসাইকেল করতে চান যা আপনার অসুবিধাজনক লেনদেনগুলি নিয়ে আসে। আপনি যদি কাস্টম চরিত্র সেট কনফিগারেশনের সাথে সংযোগগুলি পুনঃচলন করেন তবে আপনি আবার বিপদে আছেন, সেইসাথে সম্ভবত প্রতি সেশন ভেরিয়েবল রূপান্তরিত হয়।

স্থায়ী সংযোগ ব্যবহার করে একটি সমস্যা এটা সত্যিই ভাল যে স্কেল না। যাদের কাছে 5000 জন লোক সংযুক্ত আছে তাদের জন্য আপনার 5000 টি স্থায়ী সংযোগ দরকার। দৃঢ়তার জন্য প্রয়োজনীয়তা দূর করার জন্য, আপনার কাছে সংযোগের সমান পরিমাণে 10000 জনকে সেবা করার ক্ষমতা থাকতে পারে কারণ তারা যখন তাদের সাথে না থাকে তখন ব্যক্তি সংযোগগুলি ভাগ করার অবস্থানে থাকে।


নীচের এই উত্তরটি অনুগ্রহ করে নিশ্চিত করুন, এখানে বর্ণিত সমস্যাগুলিকে হ্রাস করার বিশদ উপায় কোনটি।

পিডিও ব্যবহার করে পিডিও ব্যবহার করে একই পিএইচপি ব্যবহার করে যেটি অন্য কোন পিএইচপি ডাটাবেস ইন্টারফেস যা ক্রমাগত সংযোগ করে: যদি আপনার স্ক্রিপ্ট ডেটাবেস অপারেশনগুলির মাঝামাঝি অপ্রত্যাশিতভাবে বন্ধ হয়ে যায় তবে পরবর্তী অনুরোধটি বামে সংযোগটি পায় যেখানে মৃত স্ক্রিপ্টটি বন্ধ থাকবে। সংযোগ ব্যবস্থাপক পর্যায়ে সংযোগটি খোলা হয় (mod_php এর জন্য Apache, আপনি FastCGI ব্যবহার করছেন, যদি FastCGI প্রক্রিয়া, ইত্যাদি), পিএইচপি স্তরের উপর না, এবং পিএইচপি পিতামাতার প্রক্রিয়া মরা যখন সংযোগ মারা দেয় না স্ক্রিপ্ট অস্বাভাবিকভাবে terminates।

মৃত স্ক্রিপ্ট টেবিল লক করা থাকলে, সংযোগগুলি মরা না হওয়া পর্যন্ত সেসব সারণী লক থাকবে এবং পরবর্তী স্ক্রিপ্ট যা সংযোগ পায় সেগুলি নিজেই টেবিলগুলি আনলক করে।

যদি মৃত লিপি একটি লেনদেনের মাঝখানে থাকে, তবে ডেডলক টাইমারটি সরাতে না হওয়া পর্যন্ত অনেকগুলি সারণি ব্লক করতে পারে এবং এমনকি, ডেডলক টাইমার সমস্যাটির কারণে পুরানো অনুরোধের পরিবর্তে নতুন অনুরোধটি হত্যা করতে পারে।

মৃত লিপি একটি লেনদেনের মাঝখানে থাকলে, পরবর্তী সংযোগটি যে সংযোগ পায় সেটিও লেনদেনের অবস্থা পায়। এটি খুব সম্ভব (আপনার অ্যাপ্লিকেশন ডিজাইনের উপর নির্ভর করে) যে পরবর্তী স্ক্রিপ্টটি প্রকৃতপক্ষে বিদ্যমান লেনদেনটি করার চেষ্টা করবে না, বা যখন এটি না থাকা উচিত সেটি করবে না বা এটি না থাকা অবস্থায় ফিরে আসবে।

এই শুধুমাত্র বরফ এর টিপ। এটি সর্বদা প্রতিটি একক স্ক্রিপ্ট অনুরোধে একটি নোংরা সংযোগের পরে পরিষ্কার করার চেষ্টা করে একটি সীমাতে সঙ্কুচিত করা যেতে পারে, তবে এটি ডাটাবেসের উপর নির্ভর করে ব্যথা হতে পারে। যতক্ষণ না আপনি আপনার স্ক্রিপ্টের মধ্যে একটি সমস্যা হিসাবে ডেটাবেস সংযোগগুলি তৈরি করতে শনাক্ত করেছেন (এর অর্থ হল আপনি xdebug এবং / অথবা xhprof ব্যবহার করে কোড প্রোফাইলিং সম্পন্ন করেছেন), আপনি কোনও সমাধান হিসাবে স্থায়ী সংযোগগুলি বিবেচনা করা উচিত নয়

উপরন্তু, বেশিরভাগ আধুনিক ডাটাবেস (পোস্টগেস এসকিউএল সহ) সংযোগ পুলিংয়ের নিজস্ব পছন্দের উপায়গুলি রয়েছে যা প্লেইন ভ্যানিলা পিএইচপি-ভিত্তিক স্থায়ী সংযোগগুলিকে অবিলম্বে ত্রুটিযুক্ত করে না।

একটি বিন্দু স্পষ্ট করার জন্য, আমরা আমার কর্মস্থলে স্থায়ী সংযোগ ব্যবহার করি, কিন্তু পছন্দ অনুসারে নয়। আমরা অদ্ভুত সংযোগ আচরণ সম্মুখীন হয়েছিলাম, যেখানে আমাদের অ্যাপ্লিকেশন সার্ভার থেকে আমাদের ডেটাবেস সার্ভারের প্রাথমিক সংযোগটি ঠিক তিন সেকেন্ড সময় নিচ্ছিল, যখন এটি একটি সেকেন্ডের ভগ্নাংশের ভগ্নাংশটি গ্রহণ করেছিল। আমরা এটি একটি কার্নেল বাগ মনে। আমরা এটির সমস্যা সমাধান করার চেষ্টা ছেড়ে দিয়েছিলাম কারণ এটি এলোমেলোভাবে ঘটেছে এবং চাহিদাতে পুনরুত্পাদন করা যায়নি এবং আমাদের আউটসোর্সড আইটিটিতে এটি ট্র্যাক করার জন্য কংক্রিট ক্ষমতা ছিল না।

তথাপি, গুদামে লোকেরা কয়েক শত আসন্ন অংশ প্রক্রিয়াকরণ করছে এবং প্রতিটি অংশটি অর্ধেক সেকেন্ডের পরিবর্তে সাড়ে তিন সেকেন্ড সময় নেয়, আমাদেরকে অপহরণ করার আগে আমাদের ব্যবস্থা নিতে হয়েছিল এবং আমাদেরকে তাদের সাহায্য করতে হয়েছিল। সুতরাং, আমরা আমাদের বাড়ির উত্পাদিত ইআরপি / সিআরএম / সিএমএস monstrosity মধ্যে কয়েক বিট flipped এবং প্রথম সংযোগ প্রথম ক্রিয়াকাণ্ডের ভয়াবহ অভিজ্ঞ। র্যান্ডম সময়ে আপাতদৃষ্টিতে ঘটেছে যে সব সূক্ষ্ম সামান্য সমস্যা এবং উদ্ভট আচরণ ট্র্যাক নিচে আমাদের সপ্তাহ লাগছিল। এটি প্রমাণিত হয়েছে যে একবারে সপ্তাহের মারাত্মক ত্রুটিগুলি আমাদের ব্যবহারকারীরা আমাদের অ্যাপ্লিকেশন থেকে সঙ্কুচিত হয়ে লক করা টেবিল, পরিত্যক্ত লেনদেনগুলি এবং অন্যান্য দুর্ভাগ্যজনক জান্তি রাজত্বগুলি ছেড়ে চলে যাচ্ছিল।

এই sob- গল্প একটি বিন্দু আছে: এটা জিনিস ভেঙ্গে যে আমরা বিরতি আশা, কর্মক্ষমতা নামে সব। ট্রেডফোনের মূল্য ছিল না, এবং আমরা উদ্বিগ্নভাবে অপেক্ষা করছি যে আমরা আমাদের ব্যবহারকারীদের কাছ থেকে দাঙ্গা ছাড়াই স্বাভাবিক সংযোগগুলিতে ফিরে যেতে পারব।





pdo