كيف يمكن للمرء استخدام خيوط متعددة في تطبيقات PHP


Answers

لماذا لا تستخدم popen ؟

for ($i=0; $i<10; $i++) {
    // open ten processes
    for ($j=0; $j<10; $j++) {
        $pipe[$j] = popen('script2.php', 'w');
    }

    // wait for them to finish
    for ($j=0; $j<10; ++$j) {
        pclose($pipe[$j]);
    }
}
Question

هل هناك طريقة واقعية لتنفيذ نموذج متعدد الخيوط في PHP سواء حقا ، أو مجرد محاكاة ذلك. بعض الوقت كان هناك اقتراح بأنك تستطيع إجبار نظام التشغيل على تحميل نسخة أخرى من PHP القابل للتنفيذ والتعامل مع العمليات المتزامنة الأخرى.

المشكلة في هذا هو أنه عندما انتهى رمز PHP تنفيذ نسخة PHP يبقى في الذاكرة لأنه لا توجد طريقة لقتلها من داخل PHP. لذلك إذا كنت تحاكي عدة خيوط يمكنك تخيل ما سيحدث. لذلك أنا لا أزال أبحث عن طريقة يمكن عمل خيوط متعددة أو محاكاة فعالة من داخل بي. أيه أفكار؟




قد أفتقد شيء ما ولكن exec لم يعمل بشكل غير متزامن بالنسبة لي في بيئة Windows التي استخدمتها في النوافذ وعملت مثل السحر ؛)

$script_exec = "c:/php/php.exe c:/path/my_ascyn_script.php";

pclose(popen("start /B ". $script_exec, "r"));



يمكنك استخدام exec () لتشغيل برنامج نصي لسطر الأوامر (مثل سطر الأوامر php) ، وإذا قمت بتوجيه الإخراج إلى ملف ، فلن ينتظر البرنامج النصي حتى ينتهي الأمر.

لا يمكنني تذكر بنية php CLI ، لكنك تريد شيئًا مثل:

exec("/path/to/php -f '/path/to/file.php' | '/path/to/output.txt'");

أعتقد أن عددًا قليلاً من خوادم الاستضافة المشتركة يكون exec () معطلاً بشكل افتراضي لأسباب أمنية ، ولكن قد يستحق المحاولة.




أنا أعرف أن هذا سؤال قديم ولكن بالنسبة للأشخاص الذين يبحثون ، هناك ملحق PECL مكتوب في C والذي يعطي قدرة PHP متعددة الخيوط الآن ، فهو موجود هنا pthreads




لن يعمل pcntl_fork في بيئة خادم الويب إذا كان الوضع الآمن قيد التشغيل. في هذه الحالة ، ستعمل فقط في إصدار CLI لـ PHP.




على الرغم من أنه لا يمكنك إجراء عملية الخيط ، إلا أن لديك درجة معينة من التحكم في العملية في php. مجموعتي الوظائف المفيدة هنا هي:

وظائف التحكم في العمليات http://www.php.net/manual/en/ref.pcntl.php

وظائف POSIX http://www.php.net/manual/en/ref.posix.php

هل يمكن أن شوكة العملية الخاصة بك مع pcntl_fork - إرجاع PID للطفل. بعد ذلك يمكنك استخدام posix_kill لترتيب ذلك PID.

ومع ذلك ، إذا قمت بقتل عملية أحد الوالدين ، فيجب إرسال إشارة إلى عملية الطفل لإبلاغه بالموت. إذا لم تتعرف php على هذا فيمكنك تسجيل وظيفة لإدارتها وإجراء خروج نظيف باستخدام pcntl_signal.




أنا أعلم أن هذا هو وسيلة قديمة ، ولكن هل يمكن أن ننظر إلى http://phpthreadlib.sourceforge.net/

وهو يدعم الاتصالات ثنائية الاتجاه بين الخيوط وأيضا بدمج الحماية لقتل خيوط الطفل (منع اليتامى).




ماذا عن pcntl_fork؟

تحقق من الصفحة دليلنا للحصول على أمثلة: PHP pcntl_fork