0

私はすでに同様の質問をここに投稿しましたが、私の問題を解決する応答を得ることができませんでした。また、問題が少し変わったので、私は再投稿し、助けを得るために必死です!

前の質問へのリンク:

mysqlを使用したajaxロングポーリング

現在のコード:

JS(私はphpから実行します):

$oldIDq = mysql_query("SELECT * FROM messages ORDER BY id DESC LIMIT 1");
while($oldrow = mysql_fetch_array($oldIDq)){
$oldID = $oldrow['id'];    
}

$func = '
var oldID = '.$oldID.';

function wait() {
$.ajax({
    type: "GET",
    url: "../scripts/msg_scripts/msg.php?oldid=" + oldID,
    async: true,
    cache: false,

    success: function (data){

        if(data != \'1\'){
            var json = eval(\'(\' + data + \')\');
             if (json[\'msg_content\'] != "") {
                  alert("new meassage added"); 
                  } 
                  oldID = json[\'oldID\']; 
                  setTimeout(\'wait()\',1000); }

    },

    disconnect: function()
    {
        return false;
        setTimeout(\'wait()\',1000);
    },

    error: function(XMLHttpRequest, textStatus, errorThrown){
      alert("error: " + textStatus + "(" + errorThrown + ")");  
      setTimeout(\'wait()\',1000);
    }

});
}

$(document).ready(function(){

    wait();
});
';

サーバ:

    $connect = mysql_connect ("localhost", "root", "")

or die ("couldnt connect");
mysql_select_db ("***") or die ("not found"); //if db was not found die
mysql_query("SET NAMES 'utf8'");

$oldID = $_GET['oldid']; 

if($oldID == "") {

die('timeout');
}
else{

$result = mysql_query("SELECT id FROM messages ORDER BY id DESC LIMIT 1");
while($row = mysql_fetch_array($result))
{
    $last_msg_id = $row['id']; 
}
while($last_msg_id <= $oldID)
{
    usleep(10000);
    clearstatcache();
    $result = mysql_query("SELECT id FROM messages ORDER BY id DESC LIMIT 1");
    while($row = mysql_fetch_array($result))
    {
        $last_msg_id = $row['id'];
    }
}



$response = array();
$response['msg_content'] = 'new';
$response['oldID'] = $last_msg_id;
echo json_encode($response);
}

今、私はプロセスのサーバー側でセッションを実行していましたが、長いポーリングにはセッションに問題があることを理解したので、今のところそれを削除しました。セッションを削除したので、ajaxリクエストを送信するページでもセッションを実行しています。私の問題はある意味で改善されました。今起こっていることは、基本的に自分のWebサイトのリンクをクリックしてページを終了し、エラーが発生することですが、4〜5回以上実行すると、クリックごとにブラウザーがフリーズします。どのリンクでもajax関数を再実行すると、別のエラーが発生します。リクエストのページを更新すると、2番目のエラーが発生し、ブラウザがフリーズします。また、ブラウザを閉じてサイトの任意のページを再度開こうとすると、サーバーを再実行しない限り(現在ローカルホストで動作している)、chromeとffで試してみないと、まったく読み込まれません。

誰かが私に解決策を教えてもらえますか?

4

1 に答える 1

1

-すべての新しいメッセージを取得するために再度更新されました

コードを読んで、最後のメッセージだけを返したい場合は、whileループはこの場合はかなり役に立ちません。oldIDとデータベースに挿入された最後のIDの間に、スキップする「新しい」メッセージがさらにある可能性があることに注意してください。このコードも同様です。

$connect = mysql_connect ("localhost", "root", "")
or die ("couldnt connect");
mysql_select_db ("***") or die ("not found"); //if db was not found die
mysql_query("SET NAMES 'utf8'");

$oldID = trim($_GET['oldid']);

// empty response, you may fill it with a default msg
$response = array(
  'msg_content' => 'none',
  'oldID' => $oldID
);

// this if statement will prevent to return a valid 
// JSON string to the ajax request
if(empty($oldID)) {
 die('timeout');
}
else {
  $result = mysql_query("SELECT id FROM messages WHERE id > ".addslashes($oldID)." ORDER BY id DESC");
  $index = 1;
  // check if results have new messages
  if(($num_rows = mysql_num_rows($result) > 0) {
    $response['msg_content'] = 'new';
    while($row = mysql_fetch_array($result)) {
      $response['new_msgs'][] = $row['id']
      if($index == $num_rows)
        $response['oldID'] = $row['id']; // set oldID to last record
  }
}
echo json_encode($response);  

-

session_write_closeを正しく使用する方法についてのコメントに。

session_start(); 
  $var_id = $_SESSION['id']; 
  $var_fn = $_SESSION['firstname']; 
  $var_ln = $_SESSION['lastname']; 
  $var_mail = $_SESSION['email']; 
// close write to session here to release it for other sources 
session_write_close();

if (!loggedin()){
  header ("Location: index.php");} 
  if ($_GET['id']) {
    $id = mysql_real_escape_string($_GET['id']);} 
  // you are using session here, use the localized $var_id
  else if (isset($var_id)) {
    $id = mysql_real_escape_string($var_id);
}

session_start()呼び出されると、その時点でのセッションは、現在のスコープ(実行の.phpファイル)を除いて、他のソースへの書き込みのためにロックされます。これは、セッション値の読み取り中に値が変更されないようにするためです。

ドキュメントから

セッションデータは通常、スクリプトが終了した後、session_write_close()を呼び出さなくても保存されますが、セッションデータは同時書き込みを防ぐためにロックされているため、一度に1つのスクリプトのみがセッションを操作できます。フレームセットをセッションと一緒に使用すると、このロックによりフレームが1つずつ読み込まれることがあります。セッション変数へのすべての変更が完了したらすぐにセッションを終了することにより、すべてのフレームをロードするために必要な時間を短縮できます。

行き詰まる問題については、whileループは無限だと思います。ブラウザからページをリクエストして、何http://example.com/pathto/scripts/msg_scripts/msg.phpが起こるかを確認してください。

$counter = 0;
while($last_msg_id <= $oldID)
{
    usleep(10); // changing to be a bit faster
    clearstatcache();
    $result = mysql_query("SELECT id FROM messages ORDER BY id DESC LIMIT 1");
    $row = mysql_fetch_array($result);
    $last_msg_id = $row['id'];
    $counter++;

    if($counter > 100)
      break;
}
echo "counted: {$counter}";
exit();
于 2012-09-12T16:04:50.393 に答える