0

1つのサイトからWebスクレイピングを実行し、自分のWebサイトの入力を解析するPHPスクリプトを作成しました。

スクリプトは定期的にcronjobによって駆動され、すべてが共有Webサーバーでホストされます。

問題は、スクリプトが1日に数回終了し、エラーメッセージが表示されず、毎回コード内のランダムな場所で終了することです。

スクリプトは長く、他の国のWebサイトへの2つのHTTP取得と4つのHTTP投稿を実行します。各HTTP要求は、完了するまでに最大3秒かかります。また、MySqlデータベースとの間でファイルおよびr/wに書き込みます。

次のことを試した後、私はそれに固執しています:

1)私のホスティングサポート(IxWebHosting)と話します-彼らは私の時間を無駄にし、彼らの責任を否定し、cronjobを定期的に最大5分のレートに制限するようにアドバイスしました(3分間隔になる前ですが、何も変わりませんでした)。

2)cronjobコンテキストから実行する代わりに、次の方法に切り替えました。Cronjobは、5分ごとに「ローダーPHPスクリプト」を呼び出します。b。「ローダーPHPスクリプト」は、HTTP Getを使用して実際のPHPスクリプトを呼び出し、応答を待つ前に終了します。c。実際のPHPスクリプトは、約20秒のジョブを実行します(ここで、プログラムはランダムな場所で終了します)。

3)プログラムが実行ごとに終了した場所を確認するために、コードの多くの場所にログファイルのタイムスタンプを書き込みます。これにより、プログラムがコードのどこでも終了することがわかりました。

4)それが私のコード障害ではないことを証明するために、私は次のテストを実行しました。Cronjobは、別のローダーPHPスクリプトを呼び出します。b。PHPスクリプトは、別のテスト目的のPHPスクリプトに対してHTTP要求を実行し、応答を待たずに終了します。c。2番目のPHPスクリプトは、ダミーの20秒タスクを実行します。1秒間スリープし、タイムスタンプをログファイルに20回書き込みます。

結果:テストは成功しました!2番目のプログラムは失敗しませんでした...つまり、コードと実行しているWebサーバーに関係がありますが、毎回別の場所で失敗し、1日に10回しか失敗しないためです(実行時の288回から) 1日)それから私はそれがどこにあるかわかりません(そしてPHPのエラーメッセージはありません)。

事前に感謝します。長い説明をお詫び申し上げます。リクエストに応じて詳細をお知らせします。

4

3 に答える 3

1

プロセス内からログを書き込むのではなく、実際のプロセスをログに記録していますか? たとえば、cron ジョブは次のようになりますか。

* * * * * /home/user/myTroublesomeJob.php 2>&1 >/tmp/crash.log

これにより、プロセス自体の stdout/sterr がキャッチされます。また、親シェル スクリプトからスクリプトを呼び出す価値がある場合もあります。これにより、PHP プロセスの終了をキャッチし、終了コードをダンプできます (これは、コア ダンプ、キャッチされたシグナルなどを示します)。詳細については、こちらを参照してください。

于 2012-12-21T15:01:28.373 に答える
0

共有サーバーでスクリプトを実行している場合、実行時間の長いスクリプトを実行することはできません。

スクリプトに時間がかかる場合は、専用サーバーを使用してください。共有サーバーでは多くのユーザーが共有リソースを使用しているため、サーバーは余分なリソースを使用しているスクリプトを自動的に強制終了します。

..Amazon EC2 フリー パッケージを使用することをお勧めします。そこでは、実行時間の長いスクリプトを実行できます。

ありがとう

于 2013-04-13T11:08:37.710 に答える
0

スクリプトの開始時にタイムアウトを設定してみてください。

set_time_limit(1800); 

最近、スクリプトを手動で実行した場合は問題なく実行されましたが、Cron で実行した場合はタイムアウト エラーがスローされることがわかりました。この制限を設定すると役立ちました。

于 2012-12-21T15:06:51.463 に答える