تنفيذ تعدد الخيوط في PHP؟ عندما ترى هذا العنوان، يجب أن تعتقد أنني مجنون... ولكن في الواقع، أنا أفعل ذلك حقًا،
إليك بعض الأساليب التي تم اختبارها،
ونحن نعلم
ذلكأن PHP نفسها لا تدعم سلاسل المحادثات المتعددة، لكن خادم الويب الخاص بنا يدعم سلاسل المحادثات المتعددة،
وبعبارة أخرى، يمكن لعدة أشخاص الوصول إليها في نفس الوقت. وهذا أيضًا هو الأساس بالنسبة لي لتنفيذ سلاسل المحادثات المتعددة لنفترض
أننا نقوم بتشغيل الملف a.php الآن، لكنني أطلب أيضًا من خادم الويب تشغيل ملف b.php آخر في البرنامج
،
بحيث يتم تنفيذ الملفين في نفس الوقت
يتم إرساله، وسيقوم خادم الويب بتنفيذه، بغض النظر عما إذا كان العميل قد خرج أم لا.)
في بعض الأحيان، ما نريد تشغيله ليس ملفًا آخر، بل جزءًا من التعليمات البرمجية الموجودة في هذا
الملف يمكن استخدام المعلمات للتحكم في البرنامج الذي يتم تشغيله بواسطة a.php،
وهذا مثال:
//a .php
كود PHP:---------------------------------------------- - ----------------------------------
<?php
وظيفة تشغيل الموضوع ()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); // المعلمة الثانية هنا هي رأس الطلب المحدد في بروتوكول HTTP
// إذا لم تفهم، يرجى الاطلاع على التعريف في RFC
fClose($fp);
}
الدالة أ()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in' . Date('h:i:s', time()) . (double)microtime() . "rn");
fClose($fp);
}
الدالة ب()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in' . Date('h:i:s', time()) . (double)microtime() . "rn");
fClose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
إذا($_GET['act'] == 'أ')
{
runThread();
أ()؛
}
else if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
افتح result_a.log وresult_b.log وقارن أوقات الوصول للملفين وستجد أن هذين الملفين يعملان بالفعل في سلاسل رسائل مختلفة.
في بعض الأحيان يكون الأمر نفسه تمامًا،
ما ورد أعلاه مجرد مثال بسيط، ويمكنك تحسينه إلى أشكال أخرى.
الآن بعد أن أصبح تعدد الخيوط متاحًا في PHP، ظهرت مشكلة وهي المزامنة. نحن نعلم أن PHP نفسها لا تدعم تعدد الخيوط، لذلك لا توجد طريقة مثل
المزامنة في Java 1.
حاول عدم الوصول إلى نفس المورد لتجنب التعارضات، ولكن يمكنك تشغيل قاعدة البيانات في نفس الوقت، نظرًا لأن قاعدة البيانات تدعم العمليات المتزامنة،فلا تكتب البيانات إلى نفس الملف
في PHP متعدد الخيوط
إذا لزم الأمر تريد الكتابة، استخدم طرقًا أخرى للمزامنة، على سبيل المثال، استدعاء القطيع لقفل الملف، وما إلى ذلك. أو قم بإنشاء ملف مؤقتوانتظر اختفاء الملف في مؤشر ترابط آخر while(file_exits('xxx')); أي ما يعادل وجود هذا الملف المؤقت، يعني أن مؤشر الترابط يعمل بالفعل
. إذا لم يكن هناك مثل هذا الملف، فهذا يعني أن مؤشرات الترابط الأخرى قد أصدرته
2. حاول عدم قراءة البيانات من هذا المقبس بعد تنفيذ runThread لتحقيق تعدد الخيوط، من الضروري استخدام وضع عدم الحظر، أي أنه يتم إرجاعه فورًا عند استخدام وظيفة
مثل
fgets ، لذلك ستكون هناك مشاكل عند قراءة البيانات وكتابتها ليس متعدد الخيوط، ويجب عليه انتظار الإرجاع أعلاه قبل تنفيذالبرنامج التالي، لذلك إذا كنت بحاجة إلى تبادل البيانات، فيمكنك أخيرًا استخدام ملفات أو بيانات خارجية لإكماله. $fp) لتحقيق ذلك.
بعد أن قلت الكثير، هل لهذا أي أهمية عملية؟ متى يكون من الضروري استخدام هذه الطريقة؟
الجواب هو نعم، كما نعلم جميعًا، في التطبيق الذي يقرأ موارد الشبكة باستمرار، تكون سرعة الشبكة بمثابة عنق الزجاجة باتباع هذه الطريقة، يمكنك
قراءة صفحات مختلفة ذات مواضيع متعددة في نفس الوقت.
لقد قمت بإنشاء برنامج يمكنه البحث عن المعلومات من مواقع مراكز التسوق مثل 8848 وsoaso. يوجد أيضًا برنامج يقرأ المعلومات التجارية وأدلة الشركة من موقع علي بابا ويستخدم
هذه التقنية أيضًا. لأن كلا البرنامجين يجب أن يتصلا بشكل مستمر بخوادمهما لقراءة المعلومات وحفظها في قاعدة البيانات. يؤدي استخدام هذه التقنية إلى التخلص من اختناق انتظار الرد.