2011-01-11 5 views
3

長時間実行されているスクリプトがあり、何の理由もなく死ぬ。それは8時間以上実行されるはずですが、1〜2時間後に消滅します。エラーはありません。私はCLIを介してhttpを介して、それを実行してみました。タイムアウト/メモリの問題ではなく、しばらくしてもスクリプトが壊れ続ける

私が設定以下のパラメータがあります。

set_time_limit(0); 
ini_set('memory_limit', '1024M'); 

私はメモリ使用量を監視してきた、そしてそれは

200Mの上には、私が欠けている何か他のものがあります行っておりません。なぜそれが消えてしまうのだろう?

+0

を死ぬときに実行されているディレクトリにコアダンプファイル(core.xxxx)を見つけるかどうかを確認ログファイルを含める? – acm

+0

あなたはどのプラットフォームでスクリプトを実行していますか? win/linux? –

+0

@andre:はい、 'error_log( 'test')'はそれらのログファイルに出力しますが、スクリプトがなくなるとエラーは発生しません。 – HyderA

答えて

6

一つの可能​​な説明を微調整する必要があります。それは、あなたがランダムなダイ・オフを見ている理由です。ガベージコレクタがオンになると、ルートバッファが満杯になるたびにサイクル探索アルゴリズムが実行されます。

PHP manual状態:

オンとオフのメカニズムを有効にすると、サイクルコレクションを自分で開始する能力の理論的根拠、あなたのアプリケーションのいくつかの部分は非常に時間に敏感かもしれないということです。

gc_disableを使用してPHPガベージコレクタを無効にすることができます。このマニュアルでは、バッファを解放する前にgc_collect_cyclesに電話することを推奨しています。

もう1つの説明はコードそのものです。 8時間のスクリプトは長いスクリプトで、複雑な場合は簡単にスクリプトが終了する原因となります。私は今あなたのトラブルシューティングのために、すべてerror_reporting(-1);を使用して報告するように間違いなくエラー報告をする必要があります。

また、スクリプトが他のサービス、たとえばデータベースなどと通信している場合は、問題の可能性があります。データベースサーバーのメモリが不足またはタイムアウトした場合、スクリプトがハングアップして停止する可能性があります。この場合、データベースへの接続を分割し、スクリプト中に特定の時間間隔で接続/切断することで、その接続を最新に保つことができます。コミュニケーションしている他のサービスにも同じ考え方を適用できます。

テスト目的でのみ、スクリプトが意図的に、成功した各クエリをログファイルに書き込んで、クエリが存在するときとクエリが終了したときのタイムスタンプを必ず含めてください。エラーは発生しないかもしれませんが、特定の問題の問合せがあるかどうか、または問合せが通常より長く停止しているかどうかを判断するのに役立ちます。また、あなたのMySQL接続が有効であることを確認し、それを知らせる何かをプリントアウトすることもできます。

例ログファイル:

[START 2011/01/21 13:12:23] MySQL Connection: TRUE [END 2011/01/21 13:12:28] Query took 5s 
[START 2011/01/21 13:12:28] MySQL Connection: TRUE [END 2011/01/21 13:12:37] Query took 9s 
[START 2011/01/21 13:12:39] MySQL Connection: TRUE [END 2011/01/21 13:12:51] Query took 12s 
+0

これは非常に良い提案です。 – Donovan

+0

いくつかの非常に良い点があります。エラーログはE_ALLでオンになっています。しかし、私はどんな誤りも見ない。ガベージコレクションを無効にしてテストします。また、現在のデータベースのタイムアウト設定を確認するにはどうすればよいですか?私はmysqlを使用しています。 – HyderA

+0

正直なところ、私はMySQLとの1対1の経験がないので、あなたのMySQL設定をチェックする方法を教えてくれませんでした。私自身のいくつかの調査を行うと、MySQLインストール用の設定パネルにアクセスできる場合にタイムアウトを延長する方法があるかもしれないことがわかります。 –

-1

は、Apacheはまた、独自のスクリプトのタイムアウトを持っている、あなたは、PHPのガベージコレクタは、スクリプトに干渉されている可能性があり、httpd.confファイルに

+2

OPはCLIまたはHTTPのいずれかを言った – ajreal

0

それはpropablyコードに関連する何か。

私は何ヶ月も問題なく実行しているスクリプトを持っています。

データベース接続がタイムアウトして出力エラーになることがあります。 接続やファイルを開くと、ファイル記述子が足りなくなる可能性もあります。または共有メモリ領域がいっぱいです。それはコードに依存します。

selinuxがあなたに迷惑をかけていないシステムログをチェックしてください。この方法では、スクリプトはエラーを出力しません。システムログから、システムリソースにユーザー制限を超えているかどうかがわかります(ulimitを参照)。

あなたがcliで実行しても何も得られず、segfaultでもないと本当に変です。あなたはstdoutとstderrの両方を見た?

0

多分それはsegafultsです。このように、スクリプトを起動してみ :

$ ulimt -c unlimited 
$ php script.php 

そして、あなたがいることを行い、「エラー」を言及していないとき、それは

関連する問題