apcahe サーバーで、php ファイルをバックグラウンドで開始し、ファイルの開始直後に終了する cron として PHP スクリプトを実行したいのですが、スクリプトが完了するまでに約 60 分かかるため、スクリプトが完了するのを待ちません。これはできますか?
3 に答える
PHP にはスレッドがないことを知っておく必要があります。ただし、Unix/Linux システムで実行している場合は、プログラムを実行して簡単に切り離すことができます。
$command = "/usr/bin/php '/path/to/your/php/to/execute.php'";
exec("{$command} > /dev/null 2>&1 & echo -n \$!");
仕事をするかもしれません。少し説明しましょう:
exec($command);
/usr/bin/php '/path/to/your/php/to/execute.php' を実行します: スクリプトが起動されますが、Apache は実行の終了を待ってから次のコードを実行します。
> /dev/null
標準出力(つまり、エコー、印刷など)を仮想ファイルにリダイレクトします(それに書き込まれたすべての出力が失われます)。
2>&1
エラー出力を標準出力にリダイレクトし、同じ仮想ファイルと存在しないファイルに書き込みます。これにより、たとえば apache2/error.log にログが記録されるのを回避できます。
&
あなたのケースで最も重要なことです:それは $command の実行を切り離します:したがって、 exec() はすぐにあなたのphpコードの実行を解放します.
echo -n \$!
切り離された実行の PID を応答として提供します。それは exec() によって返され、それを操作できるようになります (たとえば、この pid をデータベースに入れ、ゾンビを避けるためにしばらくしてからそれを強制終了します)。
プログラムをバックグラウンド プロセスとして実行するには、「&」記号を使用する必要があります。
$ php -f file.php &
これにより、このコマンドがバックグラウンドで実行されます。
shスクリプトを書くことができます
#!/bin/bash
php -f file.php &
そして、このスクリプトを crontab から実行します。
これは、特定の問題に対する最善の解決策ではない場合があります。しかし、記録として、PHP には Threads があります。
https://github.com/krakjoe/pthreads
スレッドの使い方を知っていると仮定しています。これは私が自分で書いた非常に若いコードですが、スレッドやミューテックスなどの経験がある場合は、この拡張機能を使用して問題を解決できるはずです。
これは明らかに私自身のプロジェクトの恥知らずなプラグインであり、ユーザーが拡張機能をインストールするために必要なアクセス権を持っていない場合、それは役に立ちませんが、多くの人がstackoverflowを見つけて、他の問題を解決することは間違いありません...