У меня есть запрос ajax, который выполняет 3 миссии:
Потому что эта миссия занимает слишком много времени. Пользователь может подождать до 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 &")