غير متزامن قذيفة exec في PHP


Answers

اعتدت على ذلك ، لأنه يبدأ حقا عملية مستقلة.

<?php
    `echo "the command"|at now`;
?>
Question

لقد حصلت على برنامج PHP النصي الذي يحتاج إلى استدعاء برنامج نصي شل لكنه لا يهتم على الإطلاق عن الإخراج. يجعل برنامج shell النصي عددًا من مكالمات SOAP وهو بطيء في الاكتمال ، لذا لا أريد إبطاء طلب PHP أثناء انتظار الرد. في الواقع ، يجب أن يكون طلب PHP قادراً على الخروج دون إنهاء عملية shell.

لقد بحثت في exec() ، و shell_exec() ، و pcntl_fork() ، وما إلى ذلك ، ولكن يبدو أن أيا منها لا يقدم ما أريده بالضبط. (أو ، إذا فعلوا ذلك ، ليس من الواضح لي كيف.) أي اقتراحات؟




كما أنني وجدت مكون Symfony Process مفيدًا لهذا الغرض.

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
// ... run process in background
$process->start();

// ... do other things

// ... if you need to wait
$process->wait();

// ... do things after the process has finished

انظر كيف يعمل في الريبو GitHub .




اعتدت هذا ...

/** 
 * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
 * Relies on the PHP_PATH config constant.
 *
 * @param string $filename  file to execute
 * @param string $options   (optional) arguments to pass to file via the command line
 */ 
function asyncInclude($filename, $options = '') {
    exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}

(حيث PHP_PATH هو define('PHP_PATH', '/opt/bin/php5') مثل define('PHP_PATH', '/opt/bin/php5') أو ما شابه)

يمر في الحجج عبر سطر الأوامر. لقراءتها في PHP ، راجع argv .




يمكنك أيضًا تشغيل البرنامج النصي لـ PHP على هيئة daemon أو cronjob : #!/usr/bin/php -q




لجميع مستخدمي ويندوز: لقد وجدت طريقة جيدة لتشغيل برنامج PHP غير المتزامن (في الواقع أنه يعمل مع كل شيء تقريبا).

يعتمد على أوامر popen () و pclose (). ويعمل بشكل جيد على كل من Windows و Unix.

function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
} 

الكود الأصلي من: http://php.net/manual/en/function.exec.php#86329




في Linux ، يمكنك بدء عملية في سلسلة محادثات مستقلة جديدة بإلحاق علامة العطف في نهاية الأمر

mycommand -someparam somevalue &

في Windows ، يمكنك استخدام الأمر "start" DOS

start mycommand -someparam somevalue



Related