0

ajax.phpcURL を使用して XML をダウンロードするファイルに Ajax 要求を送信しています。

//ajax.php

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD,       USERNAME.':'.PASSWORD);
curl_setopt($ch, CURLOPT_POSTFIELDS,    getData());
curl_setopt($ch, CURLOPT_URL,       $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,    1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,    5);
curl_setopt($ch, CURLOPT_FRESH_CONNECT,     true);
$data = curl_exec($ch);

echo $data;

ユーザーはこのプロセスについて確認されておらず、Web ページを更新する可能性があります。

時々curl_exec($ch)長い時間がかかり、timeoutエラーが発生します。このエラーにより、スクリプトが続行できなくなります。この問題を解決するための正確な解決策を検索しましたが、見つかりませんでした。

ここで、より大きな問題は、この場合、ajax 要求がバックグラウンドで処理され、ユーザーがページを更新している間、ajax 要求がタイムアウトするか終了するまで更新されないことです。

ページが更新されたときにそのcURLリクエストを中止することは一時的な解決策としては良いと思いましたが、その方法がわかりません。

注: Ajax リクエストは jQuery を使用してセットアップされており、中止してajax.abort()も問題は解決しませんでした。

4

2 に答える 2

0

アプリケーションがこの機能を処理する方法を変更する必要があります。ajax 呼び出しと実際の計算プロセスの間に別の抽象化レイヤーを配置しようとします。

たとえば、ajax 呼び出しは、PHP のバックグラウンド プロセスを初期化したり、ワーカーを使用してさらに優れたミドルウェア メッセージ キューを初期化したりすることができます。それに応じて、顧客のジョブ ID を指定します (または、ユーザー ID と一緒にリンクされたデータベースに保存します)。次に、onTimeout() は ajax リクエストを実行してジョブのステータスを取得します。その間、バックグラウンド プロセスまたはミドルウェア ワーカーがタスクを処理し、応答を同じジョブ ID でデータベースに保存します。

したがって、エンド カスタマーはジョブを初期化し、その後はそのジョブのステータスを確認するだけです。ジョブが終了すると、サーバー側でそれがわかります。したがって、次の ajax リクエストでは、実際のジョブ結果で応答します。Javascript は結果を含む応答を受け取り、クライアント側で作業を継続しているコールバック関数を実行しています。

于 2012-12-03T14:24:03.407 に答える
-1

try/catch ブロックを使用して、この (または他の) エラーが発生したときに対処できる何かを返すことができます。

于 2012-12-01T12:38:59.410 に答える