2

phpスクリプトにこれを設定して、mysqlクエリを解析および実行し、100,000行を超える画像をフェッチする必要がある限り実行されるようにします。

ignore_user_abort(true);
set_time_limit(0);
#begin logging output
error_reporting(E_ALL);
ini_set('memory_limit', '512M');

シェルで次のようなコマンドを実行します。

nohup php myscript.php > output.txt

約8〜10時間実行した後、このスクリプトは引き続き実行されますが、実行は停止します...これ以上の出力はありません。これは、私がトップで確認したゾンビプロセスではありません。メモリー制限も満たしていないので、もしそうなら終了しませんか?

何が起こっている?このスクリプトをベビーシッターして、それに沿って微調整するカスタムコードを書くのは本当に苦痛です。何が起こっている?私はunixでゾンビをクリーンアップすることを読みましたが、それはゾンビではありません。私はそれがphp設定ではないことを知っています..そしてそれはウェブサーバーを介して実行されていませんそれはコマンドラインからのみなので、何が得られますか。

4

3 に答える 3

4

プロセスを正しく切り離していないようです。現在、プロセスの親が停止すると、プロセスも停止します。プロセスをバックグラウンドに配置する(実際のデーモンを作成する)場合、scuhの問題は発生しません。

この方法でPHPを実行して、実際にPHPを切り離すことができます。

php myscript.php > output.txt 2>&1 &

ご参考までに :

> output.txt

標準出力(つまり、エコー、印刷など)をoutput.txtファイルにリダイレクトします

2>&1

エラー出力を標準出力にリダイレクトし、同じoutput.txtファイルに書き込みます

&

あなたの場合で最も重要なことです:それはあなたのプロセスを切り離して実際のデーモンを作成します。

編集:シェルの切断中に問題が発生した場合、最も簡単なのは、スクリプトをbashスクリプトに配置することです。例run.sh

#!/bin/bash
php myscript.php > output.txt 2>&1 &

そして、次のようにスクリプトを実行します。

bash run.sh &

このような場合、シェルは、phpデーモンの最後ではなく、シェルスクリプトの最後でプログラムが終了したと「考え」ます。

于 2012-10-22T15:57:40.643 に答える
0

長時間実行されるPHPスクリプトは、理由なく死んだりハングしたりしてはなりません。6か月以上継続して実行されるスクリプトがあります。スクリプト本体の内部で何か他のことが起こっている必要があります。

于 2012-10-22T15:46:32.327 に答える
0

私はこれに答えるためにコメントを使うべきであることを知っています、しかし私はそれをするのに十分な評判がありません...

プロセスがCPUを100%消費している可能性があります。ループの最後に、またはwhileを呼び出さずにループに問題が発生しました。sleep()usleep()

于 2017-01-27T16:10:57.187 に答える