我花了一些時間嘗試在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)
有什麼建議?
太棒了!我設法讓它只用「php」工作,但實際上並不是我現在想運行的版本,而使用完整路徑似乎消失了。有任何想法嗎? – xtempore
不是PHP的版本?,請檢查你的環境變量(路徑)中分配了什麼php.exe。就我個人而言,我運行Apache 7和Apache 5.5,所以當我單元測試時,我可以測試它對該版本lol – ArtisticPhoenix
如果你不知道如何改變它,你可以參考這個https:// john-dugan。 com/add-php-windows-path-variable/ – ArtisticPhoenix