PDFをPDF2SWFで変換し、XPDFでインデックスを作成しています。execを使用しています。これだけで、実行時間が非常に長くなる必要があります。
バックグラウンドプロセスとして実行し、変換が完了したらスクリプトを起動することはできますか?
PDFをPDF2SWFで変換し、XPDFでインデックスを作成しています。execを使用しています。これだけで、実行時間が非常に長くなる必要があります。
バックグラウンドプロセスとして実行し、変換が完了したらスクリプトを起動することはできますか?
一般的に、phpはスレッドを実装していません。
しかし、あなたに適しているかもしれないZFクラスがあります:
http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html
ZendX_Console_Process_Unixを使用すると、開発者はオブジェクトを新しいプロセスとして生成できるため、コンソール環境で複数のタスクを並行して実行できます。その特定の性質により、 Linux、Solaris、Mac/OSxなどのnixベースのシステムでのみ動作します。さらに、このコンポーネントを実行するには、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';
。
exec()の代わりにpopen()を使用してみてください。
このハックは、Windowsでも、追加のライブラリを必要とせずに、標準のPHPインストールで機能します。Yoは、この方法で生成するプロセスのすべての側面を実際に制御することはできませんが、これで十分な場合もあります。
$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の実行がブロックされません。
他のもの(PHPスクリプトで実行しているもの)が終了したら、パイプでpclose()を呼び出すことができます。これにより、終了するプロセスが終了するまでスクリプトの実行が一時停止します。次に、スクリプトは他のことを実行できます。
これらのスクリプトが終了するまで、PHPは終了またはdie()しないことに注意してください。スクリプトの最後に到達するか、die()を呼び出すと、スクリプトは待機します。
コマンドラインから実行している場合は、pcntl_forkを使用してphpプロセスをフォークできます。
同じトリックを実行するデーモンクラスもあります。
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.
}