أولًا..
لا، إنها ليست سلاسل رسائل حقيقية ، وفقًا لتعريفات CS، لكن لا يمكنك حقًا معرفة الفرق. سأضع الأمر على هذا النحو - هذه المكتبة أقرب إلى الشعور بالخيوط الحقيقية من فطيرة الهامبرغر الجديدة "McPlant" من ماكدونالدز إلى لحم البقر. ؟
إذا كنت مثلي، فأنت تحب لغة PHP! أنت تحب مرونة اللغة وقوتها - حرية كتابة تعليمات برمجية غير متقنة (أنا لا أدافع عن ذلك، لكنني سأدافع حتى الموت عن الحق في كتابة تعليمات برمجية غير متقنة)، أو إنشاء أعمال فنية منطقية جميلة بلا منازع! الآن، بالنسبة لجميع مبرمجي C (وC++، على ما أعتقد)، لديك مكتبة ليس فقط لإظهار قوة PHP، ولكن أيضًا لتعزيز مشروعك التالي!
تتيح لك هذه المكتبة إجراء عملية متوازية بكفاءة عالية بطريقة تشبه إلى حد كبير مؤشرات POSIX المتعددة. يمكنك مشاركة المتغيرات العامة بين جميع phpthreads ، وتمرير القيم/الكائنات/المصفوفات إلى PHPTHread الخاص بك عند الإنشاء، ومشاركة القيم/الكائنات/المصفوفات بسهولة بين تشغيل phpthreads ، وتلقي قيم الخروج/الكائنات/المصفوفات من PHPThread عندما ينتهي كل PHPThread عبر phpthread_join()
عائلة الوظائف.
لقد صممت هذه المكتبة لأنني أردت أن أكتب خادم WebSocket عالي الأداء للتعامل بسهولة مع آلاف الاتصالات المتزامنة التي يمكن من خلالها نقل كميات كبيرة من البيانات بسرعة (فكر في الصور أو الفيديو). نعم، إنه في الأساس خادم fork()
، ولكن طبقة PHPThread الموجودة في الأعلى تجعل من السهل جدًا نشره مع توفير آلية لسهولة (وشبيهة الخيوط) IPC. كان بإمكاني استخدام لغة C والحصول على أداء أفضل، ولكن بالنسبة لي، بدا هذا أكثر سهولة في النقل وسهل النشر أثناء إنشاء الخوادم، والآن أصبح الأمر كذلك.
بالنسبة لكم أيها الأشخاص الأكثر تقنية، لا يتم إعاقة هذه المكتبة مؤقتًا بسبب الحاجة إلى استخدام "علامات التجزئة". وهذا جزء مما يجعلها سريعة جدًا. تستخدم المكتبة إشارات (مثل SIGUSR1 وSIGUSR2) داخليًا لمقاطعة التنفيذ وتبديل السياق بسلاسة شديدة. نعم، نحن نعتمد على SIGUSR1 و2، لذا إذا كان مشروعك يستخدم هذه الإشارات، ففكر في استخدام phpthread_send_message()
لوظيفة معالج رسائل معينة (راجع: example/messages1.php وexamples/messages2.php). يجب أن يناسب غرضك تمامًا.
هناك أمثلة يمكنك تشغيلها في دليل "الأمثلة". لا تتردد في وضع ملفات shebang لتسهيل تنفيذها، أو تشغيلها عن طريق إضافة بادئة لها بـ php <filename>
. لم أكملها كلها بعد، لكني أنهيت عددًا لا بأس به منها. على الأقل ما يكفي للحصول على فهم جيد للقدرات.
يتطلب phpthreads امتدادات PHP التالية:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);