1

完了までに時間がかかる php スクリプトがあり、実行タイムアウト (スクリプトの実行時間が長すぎる) またはネットワーク タイムアウトが原因で失敗します。

基本的に、スクリプトは各反復で 2 ~ 3 つのプロセスを実行する for ループを実行します。

  1. curl で外部サービスをリクエストする
  2. xml を解析する
  3. 応答をデータベースに挿入する

各反復が完了するまでに 1 ~ 2 秒かかるとします。

タイムアウトの問題を解決するために、0 に設定しようとしましmax_execution_timeoutdefault_socket_timeout。これが正しいかどうか教えてください。

注意すべき重要な点は、for ループが 70,000 レコードを処理する可能性があることです。これは基本的にバルク SMS システムです。

flush()またはを使用してブラウザーに部分的な応答を送信しようとしましたが、0ob_implicit_flush(true)に設定output_bufferingしましたが、部分的な応答ではなく、最終的な応答しか得られません。

(以下原文)


こんにちは、私は自分のプロジェクトの 1 つで支援を得たいと思います..問題を説明します..何をしているのか、長い php スクリプトを実行しています...実行を完了するのに長い時間がかかります..スクリプトの実行タイムアウトが発生していますおよびネットワークタイムアウトの問題....私のスクリプトでは..反復ごとに2〜3つのプロセスを実行するforループです...外部サービスを(curlを介して)要求し、応答を取得してxmlを挿入し、挿入していますデータベースへの応答...各反復に約1〜2秒かかると仮定します...タイムアウトの問題について、「max_execution_timeout」と「default_socket_timout」を0に設定しようとしました..何か問題があるかどうか提案してください。 .これは一時的なものですが...そして主な注意点はループです..70k以上のレコードがあるかもしれません....基本的にバルクSMSシステムです...このタイムアウトは主に、ブラウザがサーバーに苦情を申し立てたときに発生します..それは私が何時間もあなたの応答を待っており、私が寝る時間です..さようなら..これは私がこれまでに学んだことです...だから私はキューに入れることを考えましたレコードの長いリストを小さなチャンクに分割し、それらを実行してブラウザに応答を送信することで満足しています...しかし、数日間取り組んできた問題は、部分的な応答をブラウザに送信することです... flush() または ob_implicit_flush を使用して(true);...そしてoutput_bufferingを0に設定する...すべての可能性を試しました...しかし、部分的なものではなく最終的な応答しか得られません...そして私の唯一の意図は、プロセスをアクティブに保つことでした...これの可能性は何ですか...これに対する解決策...助けてください..さようなら..これは私がこれまでに学んだことです...だから、レコードのロングリストを小さなチャンクにキューイングし、それらを実行してブラウザに応答を送信することでそれを満足させることを考えました...しかし、問題は解決していません数日間、ブラウザーに部分的な応答を送信しています... flush() または ob_implicit_flush(true); を使用して...そして output_buffering を 0 に設定します...すべての可能性を試しました...しかし、最終的な応答しか得られず、部分的なものではありません...そしてアトラスの私の唯一の意図は、プロセスをアクティブに保つことでした...これの可能性は何でしょうか...これに対する解決策...助けてください..さようなら..これは私がこれまでに学んだことです...だから、レコードのロングリストを小さなチャンクにキューイングし、それらを実行してブラウザに応答を送信することでそれを満足させることを考えました...しかし、問題は解決していません数日間、ブラウザーに部分的な応答を送信しています... flush() または ob_implicit_flush(true); を使用して...そして output_buffering を 0 に設定します...すべての可能性を試しました...しかし、最終的な応答しか得られず、部分的なものではありません...そしてアトラスの私の唯一の意図は、プロセスをアクティブに保つことでした...これの可能性は何でしょうか...これに対する解決策...助けてください..しかし、私が数日間取り組んできた問題は、ブラウザーに部分的な応答を送信することです... flush() または ob_implicit_flush(true); を使用して...そして output_buffering を 0 に設定します...すべての可能性を試しました...しかし、私は部分的な応答ではなく、最終的な応答のみを取得します...そして、アトラスの私の唯一の意図は、プロセスをアクティブに保つことでした...これの可能性は何でしょうか...これに対する解決策は...助けてください..しかし、私が数日間取り組んできた問題は、ブラウザーに部分的な応答を送信することです... flush() または ob_implicit_flush(true); を使用して...そして output_buffering を 0 に設定します...すべての可能性を試しました...しかし、私は部分的な応答ではなく、最終的な応答のみを取得します...そして、アトラスの私の唯一の意図は、プロセスをアクティブに保つことでした...これの可能性は何でしょうか...これに対する解決策は...助けてください..

4

2 に答える 2

4

cron ジョブでそのようなことを行う必要があります。リモート サーバーで大幅な遅延が発生したり、ネットワーク エラーが発生したりすると、クライアント ブラウザーとの接続が簡単にタイムアウトになり、Web クライアント接続がクラッシュした後にゾンビ プロセスが実行されたままになる可能性があります。

于 2009-10-15T12:59:14.883 に答える
1

前述のように、スクリプトはcronとして実行する必要があります。

クライアントが何が起こっているかを半リアルタイムでプレビューする必要がある場合は、事前に決められた期間に AJAX を介してサーバーにクエリを実行し、データベースに保存された応答を更新する別の HTML ページを提案します。

物事を分離すれば、両方の長所を活かすことができます。

a) サーバーは長いクエリを独自に処理します - クライアントまたはクライアントが接続されていない b) クライアントは、必要に応じて、サーバーの作業の進行状況を確認します

于 2009-10-15T14:28:55.307 に答える