PHP إطلاق البرنامج النصي بعد اكتمال عملية الخلفية؟

StackOverflow https://stackoverflow.com/questions/2414498

سؤال

أقوم بتحويل PDF مع PDF2SWF وفهرسة مع XPDF .. مع Exec .. هذا فقط يتطلب وقت التنفيذ أن يكون مرتفعا حقا.

هل من الممكن تشغيله كعملية خلفية ثم قم بتشغيل برنامج نصي عند تحويله؟

هل كانت مفيدة؟

المحلول

بشكل عام، لا ينفذ PHP المواضيع.

ولكن هناك فئة ZF التي قد تكون مناسبة لك:

http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html.

يسمح ZENDX_CONSOLE_PROCESS_UNIX للمطورين بتفعيل كائن كعملية جديدة، وكذلك القيام بمهام متعددة بالتوازي في بيئات وحدة التحكم. من خلال طبيعتها الخاصة، فإنه يعمل فقط على أنظمة NIX القائمة على Linux، Solaris، Mac / OSX ومثل هذا. بالإضافة إلى ذلك، shmop_, وحدات PCNTL_ * و POSIX_ * مطلوبة لهذا المكون. إذا لم يتم استيفاء أحد المتطلبات، فسيتم إلقاء استثناء بعد إنشاء عنصر.

مثال مناسب:

class MyProcess extends ZendX_Console_Process_Unix
{
    protected function _run()
    {
        // doing pdf and flash stuff
    }
}

$process1 = new MyProcess();
$process1->start();

while ($process1->isRunning()) {

    sleep(1);

}

echo 'Process completed';

.

نصائح أخرى

حاول استخدام Popen () بدلا من Exec ().

سيعمل هذا الاختراق على أي تثبيت PHP القياسي، حتى على Windows، لا حاجة إلى مكتبات إضافية. لا يمكن أن تتحكم حقا في جميع جوانب العمليات التي تفرخ بها بهذه الطريقة، لكن في بعض الأحيان يكون هذا كافيا:

$p1 = popen("/bin/bash ./some_shell_script.sh argument_1","r");
$p2 = popen("/bin/bash ./some_other_shell_script.sh argument_2","r");
$p2 = popen("/bin/bash ./yet_other_shell_script.sh argument_3","r");

سيتم تشغيل البرامج النصية الثلاثة المستأجرة في وقت واحد، طالما أنك لا تفعل pclose ($ P1) (أو P2 أو P2 $ P3) أو حاول أن تقرأ من أي من هذه الأنابيب، فلن يحظر تنفيذ PHP الخاص بك.

عند الانتهاء من الأشياء الأخرى الخاصة بك (الشخص الذي تقوم به مع البرنامج النصي PHP الخاص بك)، يمكنك استدعاء PCLOSE () على الأنابيب، وسيؤدي ذلك إلى إخراج تنفيذ البرنامج النصي الخاص بك حتى يتم تشغيل العملية التي تقوم بها PCLASS. ثم البرنامج النصي الخاص بك يمكن أن تفعل شيئا آخر.

لاحظ أن PHP الخاص بك لن تختتم أو يموت () حتى تنتهي هذه النصوص. الوصول إلى نهاية البرنامج النصي أو الدعوة يموت () سيجعله ينتظر.

إذا كنت تقوم بتشغيلها من سطر الأوامر، فيمكنك شوكة عملية PHP باستخدام pcntl_fork.

هناك أيضا فصول الخفي التي من شأنها أن تفعل نفس الخدعة:

http://pear.php.net/package/system_daemon.

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {

     //We are the parent, exit
exit();

} else {

// We are the child, do something interesting then call the script at the end.

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top