Асинхронный запрос Yii

У меня есть запрос ajax, который выполняет 3 миссии:

  • Сохранить модель (DB)
  • Отправить электронное письмо
  • Дайте успешное или неудачное сообщение.

Потому что эта миссия занимает слишком много времени. Пользователь может подождать до 20 секунд для ответа (успешное или неудачное сообщение). И если пользователь закроет браузер, он остановится в одной из операций текущего процесса для пользователя.

Это плохой пользовательский опыт.

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

Как я могу это сделать?

@hakre То, что вы дали, не уменьшает время ожидания пользователя.

Я нашел лучшее решение для этого: расширение runactions для yii

Это расширение позволяет запускаться из действий контроллера. Существует несколько способов его использования. Самый лучший для моего случая – это

public function actionTimeConsumingProcess() { if (ERunActions::runBackground()) { //do all the stuff that should work in background mail->send() } else { //this code will be executed immediately //echo 'Time-consuming process has been started' //user->setFlash ...render ... redirect, } //User information echo "Submit Success!" } 

И его работа, но без запроса ajax. Когда я делаю запрос ajax, он почему-то не работает. Поэтому я использовал:

  ERunActions::httpPOST($this->createAbsoluteUrl('Form/Submit'), array('to'=>'mail@domain.com', 'subject'=>'This is the subject')); 

И его работа велика, но это не идеальное решение для этого.

Проблема с расширением runments заключается в том, что он работает только с не прошедшими проверку пользователями, вы можете использовать расширение yii backjob , но для этого потребуется использовать некое блокирующее хранилище сеансов, например CHttpDbSession. Я все еще ищу правильный способ сделать это … Я нашел один из лучших вариантов – запустить работу backgroud сервера:

 /usr/bin/php -q longProcess.php > /dev/null 2>&1 & 

Тем не менее, мне все еще нужно знать, как передать контроллер и действие в строке cmd и позволить yii фактически использовать его, что-то вроде

 /usr/bin/php -q yii-index.php controller action > /dev/null 2>&1 & 

Обновление: я узнал, что лучший способ – использовать консольное приложение yii и запустить его как фоновое задание. ссылка ниже помогла много:

Работа Yii cron

Теперь я использую этот код, и он отлично работает:

 exec("nohup /protected/yiic mycommand /dev/null 2>&1 &")