2017-08-09 179 views
0

我花了一些時間嘗試在Windows上找到一種方式,讓PHP腳本異步啓動另一個腳本,並遇到了使用popen()的建議解決方案。起初它似乎沒有工作,但是當我加入延遲時似乎工作得更好一些。但經過進一步調查,似乎在主要腳本結束後不久,二級進程就被殺死了。當主腳本停止時,異步PHP腳本停止

下面是啓動二級腳本代碼的相關位...

$cmd = <<<EOT 
start "php" /b "C:\\Program Files (x86)\\iis express\\PHP\\v7.1\\php.exe" -f="$script" $args 
EOT; 
$p = popen($cmd, 'r'); 
usleep(500000); 
pclose($p); 

和輔助腳本的相關部分...

$fp = fopen($argv[1] . '.txt', 'w'); 
for ($i = 0; $i < 100; $i++) { 
    fwrite($fp, $i ."\n"); 
    sleep(1); 
} 
fclose($fp); 

這只是證明OF-概念的東西。基本上,第二個腳本打開一個文件,然後以1秒爲間隔寫入0到99之間的數字。

問題是它似乎沒有完成。如果睡眠時間爲500ms,則只能達到大約15.對於200ms,它會達到大約8,等等。

我猜測這是某種流程所有權問題。例如。當主腳本終止時,會終止子進程,但我不確定,並且已經沒有什麼可嘗試的想法了。

(在Windows 10運行IIS)

有什麼建議?

回答

1

你可以像這樣的窗口中運行它:使用COM和WScript.Shell

$WshShell = new COM('WScript.Shell'); 
$cmd = 'cmd /C php '.$script; 
$oExec = $WshShell->Run($cmd, 0, false); 

在Windows這隻作品,在Linux可以運行它。

$cmd = 'php -f '.$script.' > /dev/null &'; 
exec($cmd, $oExec); 

兩者都運行非阻塞的後臺進程。這確實假設您在Windows中爲環境變量添加了php.exe的路徑,如果不是,則可以使用可執行文件的完整路徑。

不要問我花了多少小時來解決這個問題,只有幾個小時。至於popen好吧,我從來沒有得到過這個工作,但是通過管道發送信息或者不是我所關心的。

+0

太棒了!我設法讓它只用「php」工作,但實際上並不是我現在想運行的版本,而使用完整路徑似乎消失了。有任何想法嗎? – xtempore

+0

不是PHP的版本?,請檢查你的環境變量(路徑)中分配了什麼php.exe。就我個人而言,我運行Apache 7和Apache 5.5,所以當我單元測試時,我可以測試它對該版本lol – ArtisticPhoenix

+0

如果你不知道如何改變它,你可以參考這個https:// john-dugan。 com/add-php-windows-path-variable/ – ArtisticPhoenix