2017-08-09 24 views
0

WindowsでPHPスクリプトを別のスクリプトを非同期で起動させる方法を見つけようとしていましたが、popen()を使用して解決策を見つけました。最初はうまくいきませんでしたが、遅れを加えれば少し良くなったようです。しかし、さらなる調査では、主なスクリプトが終了した直後に、二次的プロセスが終了したようです。メインスクリプトの停止時に非同期PHPスクリプトが停止する

ここでは二次のスクリプトを起動し、コードの該当ビットが

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

これは単なる証拠オブです... ...

$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); 

そして二スクリプトの関連部分です概念のもの。基本的に、2番目のスクリプトはファイルを開き、1秒間隔で0〜99の数値を書き込みます。

問題は終了していないようです。睡眠が500msの場合は約15にしかなりません.200msの場合は約8時間になります。

私はそれが何らかのプロセス所有権問題であると推測しています。例えば。プライマリスクリプトが終了すると、それは子プロセスを強制終了しますが、私は確信が持てませんし、他に何を試みるべきかというアイデアがなくなりました。

(Windows 10上でIISを実行中)

ご意見はありますか?

答えて

1

あなたはそれがそうのようなWindows上で実行することができます使用して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を、CLI用に5.5を実行します。ユニットテストでは、そのバージョンに対してテストできます。 – ArtisticPhoenix

+0

変更方法がわからない場合は、https:// john-duganを参照してください。 com/add-php-windows-path-variable/ – ArtisticPhoenix

関連する問題