10

PHPスクリプトを実行するcronジョブがあります。cron は毎分実行するように設定されています。これはテスト目的でのみ実行されます。実行中の PHP スクリプトは、ユーザーがサーバーにアップロードした動画をフラッシュ形式 (.flv など) に変換するように設計されています。スクリプトは、コマンドラインから手動で実行すると正常に実行されますが、cron から実行すると正常に開始されますが、1 分後に停止します。

次のcronが実行されると、最後のcron実行が「殺される」ようです。次の PHP 関数を追加しました。

ignore_user_abort(true);

最後の実行が中止されないことを願って、cron を 5 分ごとに実行するように設定してテストしました。これは正常に動作しますが、ビデオの変換には 5 分以上かかる場合があるため、別の cron が実行されたときに停止する理由を理解する必要があります。実行されました。

どんな助けでも大歓迎です。

ありがとうございました!

編集:私のcronは次のようになります:

*/1 * * * * php /path_to_file/convert.php
4

3 に答える 3

18

cron がプロセスを強制終了するとは思わない。ただし、cron は長時間実行されるプロセスにはあまり適していません。ここで発生している可能性があるのは、スクリプトが複数回実行されると、スクリプトが全体的に踏みにじられることです。たとえば、両方の PHP プロセスが同時に同じファイルに書き込もうとしている可能性があります。

まず、php エラー ログを確認するだけでなく、PHP ファイル自体から出力をキャプチャするようにしてください。例えば:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log

convert.php が複数回実行されないようにするために、単純なロックファイルを使用することもできます。何かのようなもの:

if (file_exists('/tmp/convert.lock')) {
    exit();
}

touch('/tmp/convert.lock');
// convert here
unlink('/tmp/convert.lock');
于 2009-05-12T09:29:03.440 に答える
4

cronそれ自体は実行中のジョブの以前のインスタンスを停止しないため、問題が発生した場合は、PHP で何かが実行されていることがほぼ確実です。そのコードを投稿する必要があります。

于 2009-05-12T09:23:31.653 に答える
2

いいえ、それはしません。スクリプトが実行ごとにチェックするロックファイルを作成することにより、2番目のプロセスが実行されないようにすることができます。ファイルが存在する場合、実行されません。また、必要に応じて、これを最大実行時間と組み合わせて使用​​し、1つのプロセスが将来の実行を無期限に停止しないようにする必要があります。ロックファイルは、/ tmp/foo.lockという名前の空のプレーンテキストファイルにすることができます。

于 2009-05-12T12:22:11.197 に答える