私はajax彗星に問題があります - ページがロードされた後、すべてがgreateしますが、同じホスト(いくつかのメニューまたはリンク)で他のページを開こうとすると、時間(非常に遅い)。クライアントでAjax彗星 - 遅い次のリンク
<?php
function my_abort_handler() {
write2file(connection_status() . ' SD Aborted!!!');
}
register_shutdown_function('my_abort_handler');
try {
error_reporting(0);
session_start();
if (!isUserLogedIn()) {
$return['message'] = "Login required";
$return['error'] = true;
echo json_encode($return);
exit();
}
if (empty($_SESSION['return'])) {
$_SESSION['return'] = false;
}
connectToDB();
while (!connection_aborted()) {
write2file(connection_status() . ' SD Aborted!!!');
$return = collectDataFromDB();
$d1 = array_diff_assoc($return, $_SESSION['return']);
$d2 = array_diff_assoc($return, $_SESSION['return']);
if ((!empty($d1)) || (!empty($d2))) {
$_SESSION['vote_return'] = $return;
echo json_encode($return);
flush();
ob_flush();
exit();
}
sleep(1);
}
} catch (Exception $e) {
$return['message'] = $e->getMessage();
$return['error'] = true;
echo json_encode($return);
}
:
Serverは、Slackwareの13.37のApache/2.2.20 PHP 5.3.8およびスクリプトがbackend.phpです
var xhReq = false;
function runComet() {
xhReq = GetXmlHttpObject();
xhReq.open("GET",'backend.php',true);
xhReq.onreadystatechange=consoleinfo;
xhReq.send(null);
}
function consoleinfo() {
if (xhReq.readyState == 4) {
if (xhReq.status == 200) {
console.info(xhReq.responseText);
} else {
console.info("Error Status:" + xhReq.status);
}
runComet();
}
runComet();
Seteps:
- 開いているページとJavaScriptが実行されているので、backend.phpへのリクエストがあります。
- ログファイルを監視する - 1秒ごとに新しい行が表示されます
- ページ上のリンク/メニューを押してブラウザを起動し、次のページを読み込みます。コンソール(firebugまたはchromeコンソール)では、ajaxリクエストが中止されたことがわかります。
- ログファイルを監視します.1秒ごとに新しい行があるため、サーバー上の接続は中止されません。
- http://localhost/server-statusを開いて、ステータス「W」の返信を送信できます。
- しばらくお待ちください(毎回違うかもしれませんが、ほとんどの場合30〜60秒程度)接続が閉じられているので、ログファイルには中断メッセージが表示されます。
- 次のページが
をロードされている、私は非常に単純なケースを作成する - あらゆる秒のバックエンドの復帰時間を()。ページブラウザの更新時: - ログファイルの中止メッセージが表示されるまで約30〜60秒待ちます。 または ログファイルには中止はありません。すべてのリロードはhttp://localhost/server-statusに新しいワーカーを追加し、ログファイルに追加された行はワーカーと同じです。
これをCentOS 5.5サーバーで試してみましたが、結果は同じでした。 defautl apacheの設定を使用します(仮想ホストをいくつか追加してサーバステータスを有効にするだけです)。
私はコンフィギュレーションに問題があると思いますが、どこで理解できません。この問題を解決するのに手伝ってくれますか?
更新日: 私は何が起きているかを確認するためにnetstatを使用します。要求がアクティブの場合netstatの出力は次のようになります。
tcp 0 0 127.0.0.1:35518 127.0.0.1:80 ESTABLISHED 2660/firefox off (0.00/0/0)
とxhReq.abort()
netstatの出力がされた後:
tcp 1 0 127.0.0.1:80 127.0.0.1:35518 CLOSE_WAIT 3174/httpd keepalive (7167.02/0/0)
ので、この場合の接続は7167秒、バックグラウンドスクリプトのキープアライブが7167秒に動作しますでしょう。これはOS構成のものかもしれません。ここ