Самый простой способ запустить новый процесс/поток в PHP
Сценарий:
- Общий хостинг, поэтому нет возможности устанавливать новые расширения + нет CRON
- Представленный запрос должен выполнять некоторые тяжелые процессы.
- Я хочу, чтобы клиент ответил как можно быстрее, и тяжелый подъем продолжил немедленно, но не остановил клиента.
- может быть на новом потоке (если это возможно) также не проблема с запуском нового процесса.
Каков наилучший способ сделать это?
Ответы
Ответ 1
Вкл. * nix:
exec('/path/to/executable > /dev/null 2>&1 &');
В Windows:
$WshShell = new COM('WScript.Shell');
$oExec = $WshShell->Run('C:\path\to\executable.exe', 0, false);
Оба из них вызовут новый процесс, который будет работать синхронно, полностью отключен от родителя. Пока ваш хост позволяет это сделать.
Ответ 2
Вы можете использовать Google по ключу: продолжить обработку php после закрытия соединения.
Следующие ссылки, относящиеся к вашей проблеме, следующие:
Вы можете использовать команду собственности, чтобы продолжить выполнение без прерывания пользователя
ignore_user_abort(true);
set_time_limit(0);
Вы используете fastcgi_finish_request, чтобы предупредить клиента о прекращении вывода ответа. И ваши скрипты будут продолжать выполняться.
Пример:
// redirecting...
ignore_user_abort(true);
set_time_limit(0);
header("Location: ".$redirectUrl, true);
header("Connection: close", true);
header("Content-Length: 0", true);
ob_end_flush();
flush();
fastcgi_finish_request(); // important when using php-fpm!
sleep (5); // User won't feel this sleep because he'll already be away
// do some work after user has been redirected
Ответ 3
В PHP нет потоков. Вы можете обмануть, отправив обратно страницу HTML, которая запускает вызов Ajax для запуска тяжелого процесса в новом запросе. Но если он разделяет хостинг, я предполагаю, что вы быстро попадете в пределы памяти, времени или использования процессора, наложенных вашим хостинг-провайдером.
Ответ 4
$WshShell = new COM('WScript.Shell');
$oExec = $WshShell->Run('C:\xampp\php\php.exe C:\xampp\htdocs\test.php -a asdf', 0, true);
Невозможно передать argv на test.php.
var_dump($argv);