2012-03-02 10 views
0

私は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:

  1. 開いているページとJavaScriptが実行されているので、backend.phpへのリクエストがあります。
  2. ログファイルを監視する - 1秒ごとに新しい行が表示されます
  3. ページ上のリンク/メニューを押してブラウザを起動し、次のページを読み込みます。コンソール(firebugまたはchromeコンソール)では、ajaxリクエストが中止されたことがわかります。
  4. ログファイルを監視します.1秒ごとに新しい行があるため、サーバー上の接続は中止されません。
  5. http://localhost/server-statusを開いて、ステータス「W」の返信を送信できます。
  6. しばらくお待ちください(毎回違うかもしれませんが、ほとんどの場合30〜60秒程度)接続が閉じられているので、ログファイルには中断メッセージが表示されます。
  7. 次のページが

をロードされている、私は非常に単純なケースを作成する - あらゆる秒のバックエンドの復帰時間を()。ページブラウザの更新時: - ログファイルの中止メッセージが表示されるまで約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構成のものかもしれません。ここ

答えて

0

問題は2つです:

まず:次のページの遅いロード - すべてのページに、私はsession_start()を使用するためです。私がbackend.phpでセッションを開始すると、セッションは閉じられ、スクリプトの終了後に保存されます。これは、次のページが遅く開かれる理由です(次のページもsession_start()を使用してください)。この問題を解決するには、backend.phpからsession_start()を削除しますが、 'session_write_close()'を追加すると問題が解決されるはずです。

2番目: backend.phpは実行を停止しません - これはmod_phpを使用し、phpがブラウザのdisconnectct/closeを検出できないためです。ブラウザの切断phpスクリプトを検出するには、いくつかの出力を送信する必要があります。 backedn.phpでは、サイクル中に毎回実行されるecho '0'; flush(); ob_flush();を追加します。したがって、backend.phpは毎回「0」を出力し、ブラウザが切断されたとき(他のページを開くか停止ボタンが押されたか)を検出するか、閉じて実行を停止します。クライアント側では.replace(/^0*/, '');を置き換えますので、不要な出力はすべて削除します。

これは問題を解決します。ブラウザが別のページを開こうとしたときにバックエンドスクリプトが実行を停止し、(このサーバー上の)次のページが適時に開きます。

0

私は同じ問題を抱えていたが、

$(function(){ 
    setTimeout('updateFeed()',10000); 
}); 

のようなページのロード時、私は10秒後に私の彗星のAjaxの機能と呼ばれ、それが魅力の

のように動作します
関連する問題