IIISpikerIII
@IIISpikerIII

Почему виснет браузер при отмене AJAX запроса в Yii?

Здравствуйте! Пишу в представлении AJAX запрос к экшену контроллера, в контроллере выполняется долгий запрос со sleep(), проблема в том, что если во время работы php скрипта обновить страницу или перейти на другую страницу сайта, то все повиснет до тех пор пока не закончится выполнение php скрипта.

Пробовал выполнить этот AJAX запрос к отдельному файлу PHP где ставил sleep и также обновлять страницу, то все работает нормально. Получается надо как-то по другому выполнять длинные запросы к экшену. Подскажите в какую сторону нужно копать?

в представлении код
Yii::app()->clientScript->registerScript('loading', " 
var timestamp = 0;
function WaitMessage()
    {
        $.ajax({
            type: 'POST',
            url: '/index.php/message/ajax',
            data: {send:".$id.",timestamp:timestamp},
            async: true,
            cache: false,
            success: function(data){     
                   $('#message_container').html(data);
            },
        });
    }
WaitMessage();
	", CClientScript::POS_READY);


в экшене
public function actionAjax()
	{ 
		if(Yii::app()->request->isAjaxRequest && isset($_POST['send'])){
			//пока не пройдет 20сек ничего сделать на сайте нельзя
			sleep(20);
			echo('Прошел!');
		}
	}


Пока вижу решение в создании отельного контроллера для ajax запроса.
  • Вопрос задан
  • 3398 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rowdyro
Одна из возможных проблем: Yii лочит файл сессии. Соответственно пока php ее не отпустит другие запросы не возможны.

Перед долгим запросом делайте Yii::app()->session->close(), после выполнения Yii::app()->session->open().
А вообще лучше долгие запросы отправлять в job сервера, для асинхронной работы.
Ответ написан
Комментировать
IIISpikerIII
@IIISpikerIII Автор вопроса
Спасибо за помощь так и было! Про job сервера не слышал, почитаю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы