كيف يمكن للمرء استخدام خيوط متعددة في تطبيقات 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. لذلك إذا كنت تحاكي عدة خيوط يمكنك تخيل ما سيحدث. لذلك أنا لا أزال أبحث عن طريقة يمكن عمل خيوط متعددة أو محاكاة فعالة من داخل بي. أيه أفكار؟




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




ماذا عن pcntl_fork؟

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




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

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




على الرغم من أنه لا يمكنك إجراء عملية الخيط ، إلا أن لديك درجة معينة من التحكم في العملية في 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.




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




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

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

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

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




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

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

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



Links