2014-09-25 111 views
0

因此,一般来说,您可以在php中使用exec('MyCommand &> /dev/null &'),而MyCommand将作为单独进程执行,因此您的主要PHP执行可以继续进行。将Laravel Artisan命令作为一个新进程运行

奇怪的是,如果您尝试使用Laravel的Artisan来做这件事,那么事情就会变得横向。例如,令人惊讶的是,在这个过程中,exec('php artisan command &> /dev/null &')的结果仍然悬而未决,直到工匠指挥结束。如果将artisan命令封装在bash脚本中,它将根本不会执行。

这是为什么,我该如何在新的分离过程中执行工匠命令?

回答

1

你必须创建一个新的进程来运行它:

$pid = pcntl_fork(); 

switch($pid) 
{ 
    case -1: // pcntl_fork() failed 
     die('could not fork'); 

    case 0: // you're in the new (child) process 
     exec("php artisan command"); 

     // controll goes further down ONLY if exec() fails 
     echo 'exec() failed'; 

    default: // you're in the main (parent) process in which the script is running 
     echo "hello"; 
} 
+0

可悲的是,我不认为我可以用'pcntl_fork()'从Apache模块调用,按[这]( http://stackoverflow.com/questions/16826530/pcntl-fork-returning-fatal-error-call-to-undefined-function-pcntl-fork)问题。 – MirroredFate 2014-09-25 18:36:38

+0

你确定这不仅仅是因为你的php.ini文件禁用了pcntl_ *函数吗? – 2014-09-25 18:45:43

+0

他们被禁用了,我让他们出于好奇 - 然而,我发现了[this](http://stackoverflow.com/a/14737821/771665)答案的第一条评论,它明确指出这些功能是禁用的在Apache配置中,因为它们不起作用。 – MirroredFate 2014-09-25 23:29:59

相关问题