5

かなり長い間実行する必要があるphpスクリプトがあります。

スクリプトの機能:

  • mysqlに接続します
  • 100から100,000のcURLリクエストを開始します
  • 各cURLリクエストは、1〜2000の不動産リストのコンパクトにデコードされたデータを返します-私はpreg-match-allを使用してすべてのデータを取得し、リストごとに1つのmysql挿入を実行します。各クエリが1MBを超えるデータを超えることはありません。

そのため、多くのループ、mysql挿入、およびcurlリクエストが実行されています。phpセーフモードがオフになっていて、max-execution-timeをばかげたものに正常にini_setして、スクリプトを最後まで実行できるようにすることができます。

さて、私の問題は、スクリプトまたはapacheか、スクリプトの途中でストロークがあり、画面が「サーバーへの接続がリセットされました」画面に移動することです。

何か案は?

4

6 に答える 6

4

ええと、100,000のcURLリクエストを試みることは絶対に正気ではないという事実を無視すると、おそらくメモリ制限に達しています。

メモリ制限をより合理的なものに設定してみてください。

ini_set('memory_limit', '256M');

また、補足として、実行時間をばかげたものに設定しないでください。最終的には、このようなスクリプトでそれを実行する方法が見つかる可能性があります。;]

代わりに、に設定するだけで0、実行制限を完全にオフにするのと機能的に同等です。

ini_set('max_execution_time', 0);
于 2009-10-22T22:59:01.410 に答える
3

たくさんのアイデア:

1)HTTPリクエスト内でそれを行わないでください。それを駆動するためのコマンドラインphpスクリプトを記述します。必要に応じて、Webにバインドされたスクリプトを使用して開始できます。

2)max_execution_timeをゼロに設定(またはset_time_limit(0)を呼び出す)して、制限時間を超えてシャットダウンされないようにする必要があります

3)これをもっと正気なものにリファクタリングしたいようです。小さなジョブキューイングシステムをセットアップし、すべての作業をかみ砕くように数人の子供をフォークするphpスクリプトを用意することを検討してください。

Joshが言うように、error_logを見て、なぜ今シャットダウンされているのかを確認してください。使用しているメモリの量を把握してみてください。これは問題になる可能性があります。max_execution_timeをゼロに設定してみてください。多分それはあなたがすぐにいる必要があるところにあなたを連れて行くでしょう。

しかし、長期的には、1つのhttpリクエスト内で行うにはあまりにも多くの作業が必要なようです。httpから取り出して、分割統治してください。

于 2009-10-22T22:54:17.190 に答える
1

PHP.iniを変更し、スクリプト実行変数を設定することで、タイムアウトを不定に設定できます。

ただし、アーキテクチャのわずかな変更を検討することもできます。まず、100,000のcurlリクエストを取得する際の「起動して忘れる」アプローチを検討します。次に、curlの代わりに「wget」を使用することを検討してください。

単純な「wget URL -o UniqueFileName &」を発行できます。これにより、Webページが取得され、「一意の」ファイル名に保存され、すべてバックグラウンドで実行されます。

次に、ファイルのディレクトリを反復処理し、データをgrep(preg_matching)し、DB呼び出しを行うことができます。処理しながらファイルをアーカイブに移動し、ファイルがなくなるまで繰り返します。

ディレクトリを「キュー」と考えて、1つのプロセスでファイルを処理するだけです。2番目のプロセスを実行して、Webページのデータを取得します。独立して動作し、スナップショット統計を報告するだけの「監視」が可能な3番目のプロセスを追加できます。他の2つは、インターフェースのない「Webサービス」にすることができます。

このタイプのマルチスレッドは非常に強力で、非常に十分に活用されていないIMHOです。私にとって、これはWebの真の力です。

于 2009-10-22T22:59:57.900 に答える
1

ウムラウトä、ö、ü、アンパサンドなどの特殊文字を含むPHP経由でMySQLからデータを取得するときにも同じ問題が発生しました。接続がリセットされ、apacheログとphpログのどちらにもエラーは見つかりませんでした。まず、PHPで、次のコマンドを使用してDBに設定されている文字に正しくアクセスしていることを確認しました。

mysql_query("SET NAMES 'latin1' COLLATE 'latin1_german2_ci'");

mysql_query("SET CHARACTER SET 'latin1'");

Then, finally, I resolved the problem with this line in PHP:

mysql_query("SET character_set_connection='latin1'");
于 2012-02-16T14:00:28.220 に答える
0

apache error_logには何が含まれていますか?メモリ制限に達していますか?

編集:メモリ制限に達しているようです。PHP.iniにアクセスできますか?もしそうなら、あなたはそこでmemory_limitを上げることができます。execそうでない場合は、または関数を使用してcurlまたはwgetバイナリを実行してみてください。そうすれば、shell_execPHPのメモリを使用せずに、別々のプロセスとして実行されます。

于 2009-10-22T22:48:50.893 に答える
0

100,000のcURLリクエスト??? あなたは正気ではありません。そのデータを分割してください!

于 2009-10-22T22:52:50.640 に答える