#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'));
}
надеюсь, это поможет