4

私は次の問題を抱えています:

  1. 大きなメモリ プロセスを実行していますが、メモリ負荷を小さなチャンクに分割しているため、CPU タイムアウトの問題はありません。
  2. サーバーでは、サイズが約 100kb の .xml ファイルを作成していますが、それらは約 100+ で作成されます。
  3. 現在の主な問題は、ブラウザーが応答タイムアウトを表示し、IE が下 (ステータス バーのすぐ上) に .php ファイルのダウンロード メッセージを表示することです。
  4. この間、バックエンド (サーバー側) プロセスは引き続き実行され、.xml ファイルを増分順に作成し続けます。それで問題ありません。

次のphp.ini構成があります。

max_execution_time = 10000     ; Maximum execution time of each script, in seconds
max_input_time = 10000 ; Maximum amount of time each script may spend parsing request data
memory_limit = 2000M      ; Maximum amount of memory a script may consume (128MB)
; Maximum allowed size for uploaded files.
upload_max_filesize = 2000M

私はIEでサイトを運営しています。そして、PHP 5.3でZSCEを使用しています

この問題について誰かが適切な方法で私をリダイレクトできますか?

編集:

タイムアウトの画像をアップロードしているため、.php ファイルのダウンロードを要求しています。

ここに画像の説明を入力


編集2:

実行フローを簡単に説明します。

  1. 各クラス階層から Function1() の実行を開始するクラス階層のオブジェクトを含む 1 つの PHP ファイルがあります。
  2. クラスファイルがあります。
  3. まず、XML ファイルをチャンクで作成するロジックを含む Function1() が実行されるとします。
  4. 次に、Function2() が実行され、Function1() によって生成された出力が表示されるとします。

すべてがクラス階層方式で行われます。そのため、実行されるまで Function1() の実行を途中で終了することはできません。その後、 Function2() が呼び出されます。

編集3:

これは@hakre のための特別なものです

あなたがいくつかのクロス質問をしたので、私はいくつかの点に同意しますが、問題についてさらに詳しく説明させてください.

  1. 最初に、一度に約 100 MB 以上のサイズの XML ファイルを読み込んでいたため、ローカル セットアップのメモリがハングし、マシン上のすべてが停止し、CPU 時間が最大限のリソースを使用していました。

  2. 次に、この大きなサイズの XML ファイルを小さなサイズに分割しました (一度に 1 つの XML ファイルをロードし、使用後にアンロードしていることを意味します)。これにより、ローカル セットアップでのメモリの過負荷と CPU の問題を回避できました。

  3. 現在、バックエンド プロセスは CPU またはメモリの問題を実行していませんが、問題はブラウザのタイムアウトにあります。私もcURLを試しましたが、現在の構造によれば、クラス階層の問題のために適合しているようです。階層内に一連のクラスがあり、それらはすべて最初に Process 関数を実行し、次にすべて Output 関数を実行します。したがって、プロセス関数が実行されるまで、出力関数は表示されないため、ブラウザにタイムアウトが表示されます。

  4. @vortex が提案した指示にも従いましたが、ほとんど成功しませんでしたが、探しているものではありませんでした。処理機能が必要なXMLファイルを一括で作成するため、ブラウザへの出力に時間がかかりすぎてcURlを実装できなかった理由。プロセス関数はそれほど時間がかかるため、完了するまで出力をクライアントに割り当てることはできません。

cURL 出力:

URL....: myurl 

Code...: 200 (0 redirect(s) in 0 secs) 

Content: text/html Size: -1 (Own: 433) Filetime: -1 

Time...: 60.437 Start @ 60.437 (DNS: 0 Connect: 0.016 Request: 0.016) 

Speed..: Down: 7 (avg.) Up: 0 (avg.) 

Curl...: v7.20.0 

test.txt ファイルの内容

* About to connect() to mylocalhost port 80 (#0)

*   Trying 127.0.0.1... * connected

* Connected to mylocalhost (127.0.0.1) port 80 (#0)

\> GET myurl HTTP/1.1
Host: mylocalhost
Accept: */*

< HTTP/1.1 200 OK

< Date: Tue, 06 Aug 2013 10:01:36 GMT

< Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8o

< X-Powered-By: PHP/5.3.9-ZS5.6.0 ZendServer

< Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/

< Cache-Control: private

< Transfer-Encoding: chunked

< Content-Type: text/html

< 
* Connection #0 to host mylocalhost left intact

* Closing connection #0

免責事項: この質問に対する回答は、選択された回答に基づく最初の小さな成功に基づいて選択されます。この種の質問が発生した場合、@Hakre からの解決策も実行可能です。しかし、今のところ、私の質問を解決する答えはありませんが、少しです。ハクレの答えは、この種の問題についての詳細を見つけた人にとってはより詳細です。

4

8 に答える 8

10

サーバー側のすべての変更を行ったので、サーバーのタイムアウトを回避すると仮定すると[上記で説明したほとんどすべてを見ました]、ブラウザーのタイムアウトを回避するには、次のようなことを行うことが重要です

<?php
set_time_limit(0);
error_reporting(E_ALL);
ob_implicit_flush(TRUE);
ob_end_flush();

経験上、インターネット エクスプローラーは、時々コンテンツを出力する限り問題はありません。私は毎日 30 GB のデータベースの更新を行っています [これには約 2 ~ 4 時間かかります]。コンテンツ出力を無視するブラウザは Opera だけのようです。「ob_implicit_flush」を設定しない場合は、すべてのコンテンツの後に「ob_flush()」を実行する必要があります。

参考文献

  1. ob_implicit_flush

  2. ob_flush

前に書いたように、スクリプトの先頭で ob_implicit_flush を使用しない場合は、次のようにする必要があります。

<?php
echo 'dummy text or execution stats';
ob_flush();

実行ループ内

于 2013-08-05T08:16:30.560 に答える
4

1. BIG メモリ プロセスを実行していますが、メモリ負荷を小さなチャンクに分割しているため、CPU タイムアウトの問題はありません。

これは勝手な推測です。そもそもどうやってそれが CPU タイムアウトの問題だと分かったのですか? あなたもしましたか?もしそうなら、あなたのテストは今何を与えますか? そうでない場合、これがタイムアウトの問題ではないことをどのようにテストしますか?

特定の問題はないと述べているにもかかわらず、あなたはそれを証明しておらず、多くの疑問が未解決のままです. これは、トラブルシューティング(ここで行っている)にとって逆効果である推測を招きます。

ここに記述した内容は、チャンク メモリにコードを記述したことを意味しますが、これはCPU タイムアウトの問題をテストするものではありません。1つはコードを書いており、もう1つはテストです。2つを混ぜないでください。また、勝手な思い込みをしないでください。問題はテスト用です。それ以外の場合は発生しませんでした。

トラブルシューティングを行うときは、事実 (モニター、テスト、プロファイル、ステップデバッグ) を探し、仮定を実行しないことを示すために、最初のポイントはこれで終わりです。そうしないと、間違った場所を見て、間違った質問をすることになります。


クライアント(ブラウザ)の動作について説明したことから、これはそれ自体がタイムアウトの問題ではありません。あなたが抱えている問題は、ヘッダーの応答と本文の応答の間の応答が、ブラウザの味のために長くかかることです. 一方のブラウザーはタイムアウトを想定しており (このような境界値がトリガーされており、これは私にはより正確に見えるため)、もう一方のブラウザーは何かが発生していると想定しているため、保存しないでください。

したがって、ここでは単に処理の問題があります。この動作を変更するために変更できる設定値については、インターネット ブラウザ (HTTP クライアント) のメニューを参照してください。たとえば、コマンドラインで curl-request を使用して、リクエストに実際にかかる時間を監視します。次に、測定した時間内にそのサーバーに接続するときにタイムアウトしないようにブラウザーを構成します。たとえば、Internet Explorer を使用している場合: http://www.ehow.com/how_6186601_change-internet-timeout-options.htmlまたは Mozilla Firefox を使用している場合: http://forums.mozillazine.org/viewtopic. php?f=7&t=102322&start=0

サーバー側でコードを表示しなかったので、クライアント設定でこの問題を解決したいと思います。Curlは、そのようなリクエストにかかる秒数を測定するのに役立ちます。(Verbose) スイッチを使用し-vて、要求に関する詳細情報を取得します。

クライアントでこれを解決したくない場合でも、curl は重要なデータを測定し、基になるサーバー関連のタイミングの問題を簡単に再現するのに役立ちます。したがって、特に応答ヘッダーを調べると、(再び)難解な Internet Explorer の動作を引き起こす原因が明らかになる可能性があるため、いずれの場合もコマンドラインで Curl を使用する必要があります。繰り返しますが、スイッチはリクエスト ヘッダーレスポンス ヘッダー-vを明らかにします。

このようなテストを PHP スクリプトで自動化したい場合は、PHP Curl 拡張機能を使用することもできます。これについては、次の文書で概説されています。

于 2013-08-06T08:17:59.937 に答える
1

問題は、ブラウザではなく、Web サーバーにあります。

Apache を使用している場合は、httpd.conf または仮想ホスト構成でタイムアウト値を調整する必要があります。

于 2013-07-25T07:53:11.347 に答える
1

3ページあります

  1. プロセス - XML ファイルを作成し、プロセスが完了したことを示すデータベース値を更新します。

  2. プロセス完了データベース値のステータスに基づいて {true} または {false} を返す PHP ページ

  3. プロセスが完了したかどうかを確認するために数秒ごとにページ 2 をポーリングする ajax フロント エンド

ロングポーリング

于 2013-07-31T13:08:59.147 に答える
0

「CPU タイムアウトの問題」とは何ですか?

この問題を解決する正しい方法は、別のセッション グループ(Web サーバー プロセス ツリーではない)で重い処理を非同期に実行することです。

于 2013-07-31T12:16:03.157 に答える
0

まだ処理中のスクリプトからブラウザーに出力を送信することはできますか? もしそうなら、それはタイムアウトカウンターをリセットするはずです。

それが不可能な場合は、レジストリで IE のタイムアウトを増やす必要があります。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

ReceiveTimeout が必要です。存在しない場合は、dword として作成し、値をミリ秒単位で設定します。

于 2013-07-25T08:00:46.283 に答える
0

大きなcsvファイルを読み取ってデータベースに入れるときに、この問題が何度か発生しました。私はそれを解決し、データベースの読み取りと挿入のプロセスを小さな部分に分割しました。同様に、新しいテーブルを作成して、読み取られて挿入されたデータの量をログに記録し、次にページがリロードされてその位置から開始されるようにします。したがって、1回の試行で1つのxmlを作成し、ページをリロードして次のフォームから開始することでそれを行うことができます。このようにして、ブラウザが使用するメモリがリフレッシュされます。それが役立つことを願っています。

于 2013-07-25T08:01:24.363 に答える