2013-03-01 2 views
0

Следующий код делает загрузку в сети как 10 минут, и я не знаю почему!Длинный опрос JQUERY чата, используя сон()

function chatheartbeat(){ 
    include("config.php"); 
    $useradn = $_SESSION['displayname']; 
    $query = "select * from chat where (userbdn = '".$useradn."' AND isread = 1) order by id ASC"; 
    $result = mysql_query($query , $link); 
    $num_rows = mysql_num_rows($result); 
    if ($num_rows >= 1) { 
     $items = array(); 
     $i='1'; 
     while($chat = mysql_fetch_array($result)){ 
      $items[$i]['from']=$chat['useradn']; 
      $items[$i]['msg']=$chat['msg']; 
      $items[$i]['timee']=date("H:i" ,$chat['timee']); 
      $i++; 
     } 
     $query = "update chat set isread = 0 where userbdn = '".$useradn."' and isread = 1"; 
     mysql_query($query , $link); 
     header('Content-type: application/json'); 
     echo json_encode($items); 
     exit; 
    }else{ 
     sleep(2); 
     chatheartbeat(); 
    } 
} 

Любые предложения?

+3

0 Я думаю, что ответ никогда не кончится, вернее, никогда , – 2013-03-01 20:42:02

+3

@pst До тех пор, пока он не достигнет переполнения стека: P – TimWolla

+0

Как выглядит 'config.php'? Вероятно, вы должны потребовать его, чтобы убедиться, что вы получаете соединение sql. – jeroen

ответ

2

Вы вызываете свою функцию рекурсивно, и поскольку переменная сеанса не изменяется между вызовами функций, если в первый раз она переходит в часть else, она будет идти туда каждый раз, создавая бесконечный цикл.

Кстати, если вы хотите использовать опрос, вы должны установить таймер в клиентской части (javascript) и не использовать рекурсивную функцию на стороне сервера.

+0

второй параметр находится в «config.php» – GuyChabra

+0

@ user2124281 Я так много вычислил и удалил эту часть ... См. Мой комментарий ниже вашего вопроса. – jeroen

+0

Я сделал setimeout на стороне JS, но я хочу держать запросы до тех пор, пока не появится новая информация. – GuyChabra

2

Функция никогда не вернется, пока не будут получены некоторые результаты из первого выбора.

Я бы предположил, что вы вернетесь после прохода n (например, 5), даже если результатов нет. Затем клиент может повторно отправить вызов ajax для опроса.

Кроме того, это не очень хорошая идея сделать это рекурсивным образом. Я бы предложил сделать это в цикле for вместо этого.

1

Есть несколько вещей, на которые вы хотите обратить внимание при выполнении любых длинных методов опроса.

  1. Вам необходимо выйти после определенного предопределенного периода времени. Ожидание на сервере до тех пор, пока у вас есть что ответить, приведет к таймаутам выполнения.

  2. Знайте, что происходит с данными вашей СЕССИИ. PHP по умолчанию будет использовать сеансы на основе файлов и блокирует файл в течение ходатайства (если вы не вмешиваетесь)

Смежные вопросы