ajax, jquery и symfony (проблема с длительным опросом)

#jquery #ajax #long-polling

#jquery #ajax #длительный опрос

Вопрос:

Я пытаюсь реализовать длительный опрос в php-скрипте чата, однако длительный опрос переводит все отправляемые мной ajax-запросы в спящий режим в ожидании исходного.

Кстати, я работаю с фреймворком symfony.

Есть идеи?

— ОБНОВИТЬ —

Вот несколько фрагментов кода

Javascript :

 function whosTyping(person_id){
 $.ajax({
     type:'POST',
     url:'/chat/whoisTyping',
     data:'person_id=' person_id
     dataType:'json',
     success:function(resp){
         if(resp == 'true') $('.is_typing').show();
         else $('.is_typing').hide();
         setTimeout(function(){
             whosTyping(person_id)
         },1000)
     }
 })
}
  

PHP:

 public function executeWhoisTyping(sfWebRequest $request) {
    $this->setLayout(false);
    $this->setTemplate(false);
    sfConfig::set('sf_web_debug', false);
    $person_id = $request->getParameter('person_id');
    $target_person_id = $this->getUser()->getGuardUser()->getPerson()->getId();
    $check = Doctrine_Core::getTable('Typing')->findByPersonIdAndTargetPersonId($person_id)->toArray();
    while(empty($check)){
        usleep(1000);
        clearstatcache();
        $check = Doctrine_Core::getTable('Typing')->findByPersonIdAndTargetPersonId($person_id)->toArray();            
    }
    Doctrine_Core::getTable('Typing')->createQuery()
            ->delete()
            ->where('target_person_id = ?', $target_person_id)
            ->execute();
    return $this->renderText(json_encode('true'));
}
  

И да, я пытаюсь отправлять обычные ajax-запросы, но они отменяются в ожидании ответа на длинный опрос «

Ответ №1:

Все в порядке, ребята, я разобрался

дело в том, что для того, чтобы заставить его работать с symfony, мне пришлось завершить текущий сеанс с помощью session_write_close()

таким образом, функция action становится следующим

 public function executeWhoisTyping(sfWebRequest $request) {
    $this->setLayout(false);
    $this->setTemplate(false);
    sfConfig::set('sf_web_debug', false);
    $person_id = $request->getParameter('person_id');
    $target_person_id = $this->getUser()->getGuardUser()->getPerson()->getId();
    $check = Doctrine_Core::getTable('Typing')->findByPersonIdAndTargetPersonId($person_id,$target_person_id)->toArray();
    while(empty($check)){
        usleep(100000);
        clearstatcache();
        session_write_close();
        $check = Doctrine_Core::getTable('Typing')->findByPersonIdAndTargetPersonId($person_id,$target_person_id)->toArray();            
    }

    return $this->renderText(json_encode(!empty($check) ? 'true' : 'false'));
}
  

надеюсь, это поможет