バックグラウンドプロセスが完了した後にPHPスクリプトを起動しますか?
-
19-09-2019 - |
質問
PDF2SWFでPDFを変換し、XPDFでインデックスを作成しています。幹部と一緒に。。この場合のみ、実行時間が非常に長くなります。
バックグラウンドプロセスとして実行し、変換が完了したらスクリプトを起動することは可能ですか?
解決
一般的に、PHPはスレッドを実装していません。
しかし、あなたのために適切であるZF-クラスがあります:
http://framework.zend.com /manual/en/zendx.console.process.unix.overview.htmlする
ZendX_Console_Process_Unixことができます 開発者は新しいように、オブジェクトを起動するには プロセス、及びそうで複数のタスクを実行します コンソール環境に平行です。 その具体的な性質によって、それがあります 唯一ののnixのベースのシステムに取り組んで Linuxでは、Solaris版、マック/ OSXなどのように。 また、SHMOP _ の、pcntl_ *と posix_ *モジュールは、このために必要とされます 実行するコンポーネント。の1つが 要件が満たされていない、それがスローされます インスタンス化後の例外 部品ます。
の適当な例
class MyProcess extends ZendX_Console_Process_Unix
{
protected function _run()
{
// doing pdf and flash stuff
}
}
$process1 = new MyProcess();
$process1->start();
while ($process1->isRunning()) {
sleep(1);
}
echo 'Process completed';
他のヒント
(popenのを使用してみてください)の代わりにEXECの()。
このハックでもWindows上で、任意の標準PHPインストール上で動作する、追加のライブラリは必要ありません。ヨは本当にあなたがこの方法を生み出すプロセスのあらゆる側面を制御することはできませんが、時々これで十分です。
$p1 = popen("/bin/bash ./some_shell_script.sh argument_1","r");
$p2 = popen("/bin/bash ./some_other_shell_script.sh argument_2","r");
$p2 = popen("/bin/bash ./yet_other_shell_script.sh argument_3","r");
3は、シェルスクリプトが同時に実行されます生み出し、そして限り、あなたはpclose($のP1)(または$ P2または$ P3)を行うか、これらのパイプのいずれかから読み取るしようとしないように、彼らはあなたをブロックしませんPHPの実行ます。
あなたは他のものあなたはパイプにpclose()を呼び出すことができます(あなたのPHPスクリプトで行っている1)で行われていて、それはあなたが終了するpclosingているプロセスまで、スクリプトの実行を一時停止しますとき。次に、あなたのスクリプトは、何かを行うことができます。
これらのスクリプトが終了するまで、あなたのPHPは()を締結またはダイないことに注意してください。 )(スクリプトの終わりに達したかのダイを呼び出すと、それは待つようになります。
コマンドラインから実行している場合は、次を使用して php プロセスをフォークできます。 pcntl_fork
同じトリックを実行するデーモン クラスもあります。
http://pear.php.net/package/System_Daemon
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
//We are the parent, exit
exit();
} else {
// We are the child, do something interesting then call the script at the end.
}