Исходники:
На сайте имеется PHP скрипт, в котором выполняется довольно долгое действие Ansible задачи, по результатам которой пользователю отправляется уведомление о выполненом результате и в браузере происходит перенаправление на нужную страницу сайта.
Все работает и исполняется прекрасно, но, естественно, из-за долгого времени исполнения выводятся ошибки об истечении времени, т.н. timeout'ы.
На сервере: nginx и PHP-FPM.
Используется Symfony.
PHP скрипт:
use Symfony\Component\Process\Process;
$process = Process::fromShellCommandline("sudo /usr/bin/ansible-playbook -i {$inventoryFile}'");
$process->setTimeout(3600);
set_time_limit(0);
$process->run();
sleep(1);
return 'ok_response';
Предпринято следующее:
В
/etc/php/cli/php.ini:
max_execution_time = 0
В
/etc/php/fpm/php.ini:
max_execution_time = 300
В
/etc/nginx/nginx.conf:
keepalive_timeout 30;
keepalive_requests 1000;
reset_timedout_connection on;
client_header_timeout 30s;
client_body_timeout 30s;
send_timeout 15s;
Для PHP-FPM:
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
Таким образом, думаю, что все timeout'ы подняты.
Также в пользовательской форме создан AJAX запрос. который хоть и не рушит саму страницу 504 ошибкой gateway time-out, но, тем не менее, возвращает сообщение сайта (в виде "красного" уведомления) об ошибке - сам скрипт выполняется успешно в фоне.
Вопрос простой:
Как отправить вышеприведенный кусок PHP скрипта на исполнение в фон, а пользователю вернуть что-то типа: "Ждите, скоро все будет"?
(Соответственно, по истечении исполнения PHP скрипта ему пришлют все нужные уведомления, что происходит и сейчас.)