ajax, jquery и symfony (долгий опрос)

Я пытаюсь реализовать длинный опрос в скрипте чата 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, но они отменяются в ожидании длинного ответа на опрос"


person erratbi    schedule 09.11.2011    source источник


Ответы (1)


все в порядке, ребята, я понял это

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

поэтому функция действия становится следующей

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'));
}

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

person erratbi    schedule 11.11.2011