পিএইচপি থেকে মাইএসকিউএলে সংযোগ করা অত্যন্ত ধীর


19

আমি সবেমাত্র এক্সএএমপিপি-র একটি নতুন ইনস্টল করেছি। পিএইচপিএমআইএডমিনটি প্রথম খোলার সময় আমি লক্ষ্য করেছি এটি অত্যন্ত ধীর ছিল। এটি কোনও ধারণা দেয়নি যে লোকালহোস্টে প্রতিটি পৃষ্ঠা খোলার জন্য প্রায় 5 সেকেন্ড সময় লাগবে। আমি পিএইচপিএমআইএডমিনকে দোষটি সরিয়ে দিতে একটি ছোট্ট পরীক্ষার কেস তৈরি করেছি:

$con = new PDO("mysql:host=localhost;dbname=mysql", "root", "");
$statement = $con->query('SELECT host,user,password FROM user;');
$users = $statement->fetchAll(PDO::FETCH_ASSOC);

উপরের স্ক্রিপ্টটি চালাতে প্রায় 3 সেকেন্ড সময় নেয় (যদিও এটি আমি প্রথম চালানোর সময় লোড করতে প্রায় 8 সেকেন্ড সময় নিয়েছিল।)

তারপরে এটির mysql_connectপরিবর্তে PDO এর দোষ ছিল কিনা তা খতিয়ে দেখার জন্য :

$con = mysql_connect("localhost", "root", "");
mysql_select_db("mysql", $con);
$result = mysql_query('SELECT host,user,password FROM user;');

শেষ করতে ঠিক দীর্ঘ সময় নেয়।

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

header("Content-Type: text/plain");

for($i = 0; $i < 5000; $i++)
{
    echo sha1(rand()) . "\n";
}

5000 sha1গণনা এবং পৃষ্ঠাটি আমার উইন্ডোটি রিফ্রেশ করার চেয়ে আরও বেশি প্রদর্শিত হবে।

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

সমস্যাটি অবশ্যই মাইএসকিউএল-এর সাথে পিএইচপি-র সংযোগ হতে পারে - এটি আমি যতটা যুক্তি করতে পেরেছি। পিএইচপি ধীর হওয়া বা মাইএসকিউএল ধীর হওয়া সম্পর্কে আমি প্রচুর পরিমাণে স্টাফ পেতে পারি তবে পিএইচপি + মাইএসকিউএল অত্যন্ত ধীর হওয়া সম্পর্কে কিছুই নেই।

যে কেউ আমাকে এই সমাধান করতে সাহায্য করতে পারে ধন্যবাদ!


আমি win32 এর জন্য XAMPP 1.8.0 ব্যবহার করছি ( ডাউনলোড লিঙ্ক )
পিএইচপি সংস্করণ: 5.4.4
মাইএসকিউএল সংস্করণ: 14.14


সম্পাদনা: সময় নির্ধারণের পরে, এটি দেখা যাচ্ছে যে এটি সংযোগ ফাংশন যা এত বেশি সময় নিচ্ছে:

$time = microtime(true);

$con = mysql_connect("localhost", "root", "");
mysql_select_db("mysql", $con);

$con_time = microtime(true);

$result = mysql_query('SELECT host,user,password FROM user;');

$sel_time = microtime(true);

printf("Connect time: %f\nQuery time: %f\n",
       $con_time-$time,
       $sel_time-$con_time);

আউটপুট:

কানেক্ট সময়: 1.006148
প্রশ্নের সময়: 0.000247

পিএইচপি ডাটাবেসের সাথে সংযোগ করতে অনেক সময় ব্যয় করতে পারে? সিএলআই ক্লায়েন্ট, হাইডিএসকিউএল এবং মাইএসকিউএল ওয়ার্কব্যাঞ্চ তাত্ক্ষণিকভাবে সংযোগ স্থাপন করে


পিএইচপি -m আউটপুট দয়া
thinice

উত্তর:


17

এমন কি এটি হতে পারে যে আপনি যখনই সংযুক্ত হন তখন আপনার মাইএসকিএল রেভ-ডিএনএস কোয়েরি চালানোর চেষ্টা করে? my.cnf, বিভাগ mysqld এ যুক্ত করার চেষ্টা করুন: নাম ছেড়ে দিন-সমাধান করুন


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

মাইএসকিএল পরিচালনার জন্য কি 'ফ্যাট অ্যাপ্লিকেশন' - যেমন মাইএসকিএল ওয়ার্কবেঞ্চ - ধীর?
pQd

মাইএসকিউএল Workbench থেকে একই ক্যোয়ারী চালনা CLI ক্লায়েন্ট হিসাবে ঠিক যেমন দ্রুত, এবং তাই HeidiSQL হয়
Hubro

পিএইচপি তে কিছু সময় যুক্ত করুন এবং এটি জিজ্ঞাসা করছে যে এটি খুব বেশি সময় নেয় এমন সংযোগটি সংযুক্ত করছে বা চলছে if
pQd

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

30

এটি আমার উত্তর থেকে প্রায় ভার্চাটিমে নেওয়া হয়েছে , তবে আমি জানি যে আমরা এসও-তে কেবলমাত্র লিঙ্ক-উত্তরগুলিতে ভ্রান্ত হয়েছি তাই আমি কল্পনা করি আপনি ছেলেরাও করবেন :-)

আপনার যদি সমস্যা হয় এবং উইন্ডোজ 7 এর আগে উইন্ডোজের একটি সংস্করণ ব্যবহার করা হয় তবে এটি সম্ভবত আপনার সমস্যার উত্তর নয়।

ইহা কি জন্য ঘটিতেছে?

এই সমস্যার কারণ আইপিভি 4 বনাম আইপিভি 6 v

আপনি যখন কোনও আইপি ঠিকানার পরিবর্তে হোস্টের নামটি ব্যবহার করেন, মাইএসকিউএল ক্লায়েন্ট প্রথমে AAAAনামের জন্য একটি (আইপিভি 6) হোস্ট লুকআপ চালায় , এবং যদি এই ঠিকানাটি কোনও আইপিভি 6 ঠিকানায় নামটি সফলভাবে সমাধান করে তবে প্রথমে এই ঠিকানাটি চেষ্টা করে। যদি কোনও পদক্ষেপ ব্যর্থ হয় (নাম রেজোলিউশন বা সংযোগ) তবে এটি আইভিভি 4-এ ফ্যালব্যাক হবে, একটি Aঅনুসন্ধান চালাচ্ছে এবং পরিবর্তে এই হোস্টটি চেষ্টা করছে।

বাস্তবে এর অর্থ হ'ল যদি আইপিভি 6 localhostলুকআপ সফল হয় তবে মাইএসকিউএল আইপিভি 6 লুপব্যাকের সাথে আবদ্ধ না হয়, আইপিভি 4 ফ্যালব্যাক ঘটে এবং সংযোগটি সফল হওয়ার আগে আপনাকে একটি সংযোগের টাইমআউট চক্রের জন্য অপেক্ষা করতে হবে।

এটি উইন্ডোজ to এর আগে কোনও সমস্যা ছিল না, কারণ localhostরেজোলিউশনটি হোস্ট ফাইলের মাধ্যমে করা হয়েছিল, এবং এটি কেবল পূর্বনির্ধারিতভাবে এসেছে 127.0.0.1- এটি আইপিভি counter অংশের সাথে আসে নি ::1

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

ওটা সুন্দর. ইতিমধ্যে এটি ঠিক করতে কিভাবে আমাকে বলুন!

আপনার স্বল্প কিছু সু্যোগ আছে। ইন্টারনেট ঘুরে দেখলে, সাধারণ "সমাধান" থেকে মনে হয় নামের পরিবর্তে আইপি ঠিকানাটি স্পষ্টভাবে ব্যবহার করা হবে, তবে এটি না করার কয়েকটি কারণ রয়েছে, উভয় বহনযোগ্যতা সম্পর্কিত, উভয়ই তাত্পর্যপূর্ণভাবে গুরুত্বপূর্ণ নয়:

  • আপনি যদি স্ক্রিপ্টটিকে অন্য কোনও মেশিনে সরান যা কেবলমাত্র আইভিভি 6 সমর্থন করে, আপনার স্ক্রিপ্ট আর কাজ করবে না।

  • আপনি যদি আপনার স্ক্রিপ্টটিকে * নিক্স-ভিত্তিক হোস্টিং পরিবেশে নিয়ে যান, ম্যাজিক স্ট্রিংয়ের localhostঅর্থ মাইএসকিউএল ক্লায়েন্ট কোনও ইউনিক্স সকেট ব্যবহার করতে পছন্দ করবে যদি কোনওটি কনফিগার করা থাকে তবে এটি আইপি লুপব্যাক ভিত্তিক সংযোগের চেয়ে আরও কার্যকর

তারা যদিও বেশ গুরুত্বপূর্ণ মনে হচ্ছে?

তারা না। আপনার অ্যাপ্লিকেশনটি ডিজাইন করা উচিত যাতে এই ধরণের জিনিসটি একটি কনফিগারেশন ফাইলে সংজ্ঞায়িত করা হয়। আপনি যদি আপনার স্ক্রিপ্টটিকে অন্য পরিবেশে নিয়ে যান, তবে অন্যান্য জিনিসগুলিও কনফিগার করার দরকার হয়।

সংক্ষেপে, আইপি ঠিকানা ব্যবহার করা সেরা সমাধান নয়, তবে এটি সম্ভবত একটি গ্রহণযোগ্য।

তাহলে সবচেয়ে ভাল সমাধান কি?

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

আপনার মাইএসকিউএল 5.5.3 বা তার পরে চালানো দরকার এবং আপনাকে --bind-address=কমান্ড লাইন যুক্তি দিয়ে মাইএসকিউএল শুরু করতে হবে । আপনি যা করতে চান তার উপর নির্ভর করে আপনার কাছে 4 টি বিকল্প ডক্স রয়েছে :

  • আপনি সম্ভবত যার সাথে পরিচিত এবং আপনি সম্ভবত (কার্যকরভাবে) ব্যবহার করছেন 0.0.0.0,। এটি মেশিনে থাকা সমস্ত উপলব্ধ IPv4 ঠিকানার সাথে আবদ্ধ b আপনি যদি আইপিভি 6 এর বিষয়ে চিন্তা না করেন তবে এটি সম্ভবত সেরা কাজ নয়, কারণ এটি একই সুরক্ষার ঝুঁকিতে পড়ে ::

  • একটি স্পষ্ট IPv4 বা IPv6 ঠিকানা (উদাহরণস্বরূপ 127.0.0.1বা ::1লুপব্যাকের জন্য)। এটি সার্ভারটি সেই ঠিকানার সাথে এবং কেবলমাত্র সেই ঠিকানার সাথে আবদ্ধ করে ।

  • ম্যাজিক স্ট্রিং ::। এটি মাইএসকিউএলকে আইপিভি 4 এবং আইপিভি 6 মোডে উভয় লুপব্যাক এবং ফিজিক্যাল ইন্টারফেস ঠিকানাগুলিতে মেশিনের প্রতিটি ঠিকানার সাথে আবদ্ধ করবে। এটি সম্ভাব্যরূপে একটি সুরক্ষা ঝুঁকি, কেবলমাত্র এটি করুন যদি আপনার দূরবর্তী হোস্টের সংযোগ গ্রহণের জন্য মাইএসকিউএল প্রয়োজন হয়।

  • একটি আইপিভি 4-ম্যাপযুক্ত IPv6 ঠিকানা ব্যবহার করুন । এটি 4 -> 6 রূপান্তরের সময় পিছনের সামঞ্জস্যের জন্য আইপিভি 6 এ নির্মিত একটি বিশেষ প্রক্রিয়া এবং এটি আপনাকে একটি নির্দিষ্ট আইপিভি 4 ঠিকানার সাথে আবদ্ধ করতে দেয় এবং এটি আইপিভি 6 সমতুল্য। এটি "ডুয়াল লুপব্যাক" ঠিকানা ব্যতীত অন্য যে কোনও কিছুর জন্য আপনার পক্ষে কার্যকর হতে পারে না ::ffff:127.0.0.1। এটি সম্ভবত লুপব্যাকের সাথে আবদ্ধ তবে আইপিভি 4 এবং আইপিভি 6 সংযোগ উভয়কেই অনুমতি দেয় বেশিরভাগ মানুষের পক্ষে এটি সর্বোত্তম সমাধান solution

আমার কি হোস্ট ফাইলটি পরিবর্তন করতে হবে?

কোন । হোস্ট ফাইলটি পরিবর্তন করবেন না। ডিএনএস রেজোলভার কী করতে হবে তা জানে localhost, পুনরায় সংজ্ঞায়িত করার সর্বোপরি কোনও প্রভাব পড়বে না এবং সবচেয়ে খারাপ দিক থেকে সমাধানটি ছাড়াই জাহান্নামকে বিভ্রান্ত করবে।

কি হবে --skip-name-resolve?

এটি সম্পর্কিত তবে কিছুটা ভিন্ন কারণে সমস্যাও সমাধান করতে পারে।

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

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

আপনি যদি এটি করতে যাচ্ছেন তবে আপনাকে নামের পরিবর্তে আইপি ঠিকানা ব্যবহার করতে আপনার সমস্ত অনুদান কনফিগার করতে হবে।


2
অবশেষে! ধন্যবাদ ধন্যবাদ! সবশেষে আমি সমস্ত কারণ, সম্ভাব্য সমাধান এবং তাদের পাল্টা সংস্থার সঠিক, সম্পূর্ণ এবং স্পষ্ট ব্যাখ্যা পেয়েছি। আপনার এটি সম্পর্কে একটি বই লিখতে হবে!
tobia.zanarella

4
আমি বাইন্ড-ঠিকানাটি পরিবর্তন না করা পর্যন্ত লোকালহোস্টে মাইএসকিউএলে সংযোগ করার জন্য আমার 1 সেকেন্ড বিলম্ব ছিল ::1। দুর্ভাগ্যক্রমে ::ffff:127.0.0.1আমাকে 1 সেকেন্ড বিলম্ব অব্যাহত রেখেছে (ব্যবহার skip-name-resolveনা করুক না কেন), কোনও ধারণা কেন? (উইন্ডোজ 8.1 এ)
সাইমন ইস্ট

1
@ সিমন সন্ধান ছাড়াই একটি সূত্র নয়, তবে ডিবাগের প্রথম পদক্ষেপটি হ'ল আইপিভি 6 লুপব্যাক এবং আইপিভি 4 লুপব্যাক উভয়ের সাথে সরাসরি স্পষ্ট ঠিকানা ব্যবহার করে মাইএসকিউএল আসলে শুনছে এবং উভয় স্ট্যাকের সাথে সংযোগযোগ্য, এবং সেখান থেকে ডিবাগিংয়ের সাথে সংযোগ স্থাপনের চেষ্টা করা হবে ।
ডেভর্যান্ডম

1
হ্যাঁ, :: এফএফএফ: 127.0.0.1 কাজ করে না ...
রাহেল হাসান

যদি আমি এটি :: 1 এর সাথে আবদ্ধ করি তবে স্ক্লিয়োগ কাজ করে না ... কি করব ??
রাহেল হাসান

13

সাধারণত যখন মাইএসকিউএল ব্যবহার করে সার্ভারে আইপিভি 6 সক্ষম হয় তখন localhostঅত্যন্ত ধীর হয়।

127.0.0.1সমস্যাটি সমাধানের জন্য স্ক্রিপ্টে মাইএসকিএল সার্ভারের ঠিকানা পরিবর্তন করা ।


+1 এটি আমার জন্য সঠিক উত্তর ছিল। আমার ধারণা উইন্ডোজ ৮-এ তারা localhostডিএনএস রেজলভারটিতে রেজোলিউশনটি সরানো হয়েছে যে কারণে @ ডেভর্যান্ডম লিঙ্ক করেছেন: সার্ভারফল্ট
প্রশ্ন

এটি আমার পক্ষে কাজ করেছে: ডি
ফোসঅভান্স

এটি অন্যান্য সার্ভারের ক্ষেত্রেও ঘটতে পারে localhost। ফর্মটিতে একটি সার্ভারের ঠিকানার জন্য আমার একই বিলম্বের সমস্যা ছিল xx.xxxx.xxxxx.xxxxx.com। একবার আমি সার্ভারের নামটি তার আইপি ঠিকানায় পরিবর্তন করলে সমস্যাটি চলে যায়।
গ্রুবার

1
mysql_connect("localhost", "root", "");

ঠিক আছে, কারণটি কি তা পুরোপুরি স্পষ্ট। পিএইচপি কিছু জিনিসগুলিতে সত্যই ভাল, তবে 'লোকালহোস্ট' কে সরাসরি '127.0.0.1' তে অনুবাদ করে নয়। আপনার অবশ্যই এটি চেষ্টা করতে হবে, এটি আপনার সামগ্রিক ওয়েবসাইট পৃষ্ঠাটি লোডিংয়ের সময়কে কমিয়ে দেবে, কারণ এটি পিএইচপি আপনার HOSTS ফাইল পরীক্ষা করে পিছনে রাখে এবং 'লোকালহোস্ট' এর পিছনে আসল আইপি ঠিকানা পেতে কী করছে না


আপনি কী সমস্যাটি বোঝাতে চাইছেন তা আমি বুঝতে পারি না।
কাস্পারড

@ ক্যাস্পার্ড ডিএনএস 'লোকালহোস্ট'-এর সমাধান করছেন
জিসাউ

'17 - মাইএসকিএল_ * ফাংশন থেকে নোট এখনই অবচয় করা হয়েছে এবং পিএইচপি 7
ট্রেবেকে

1

আপনার হোস্ট ফাইলটিতে এই লাইনটি যুক্ত করা আমার জন্য সমস্যার সমাধান করেছে

127.0.0.1 localhost

বিস্তারিত উত্তরটি এই থ্রেডে পাওয়া যাবে: /programming/13584360/php-with-mysql-is-slow


0

আপনি আপনার ডিবি সংযোগ ভেরিয়েবলের (যা আশাযোগ্যভাবে বহনযোগ্যতার জন্য আপনার স্ক্রিপ্টগুলি থেকে পৃথক ফাইলে রয়েছে) একটি ছোট সামঞ্জস্য করে ক্যোরির মন্দাটি দূর করতে পারেন। হোস্টের মানটি "লোকালহোস্ট" এর পরিবর্তে "127.0.0.1" এ পরিবর্তন করুন। এটি লোকালহোস্টের জন্য লম্বা ডিএনএস লুপকে বাইপাস করে।

আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.