2014-09-25 253 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

相關問題