самый простой способ запустить новый процесс / поток в PHP

Сценарий:

  1. Общий хостинг, поэтому нет возможности устанавливать новые расширения + нет CRON
  2. Поданный запрос должен выполнять некоторые тяжелые процессы.
  3. Я хочу, чтобы клиент ответил как можно быстрее, и тяжелый подъем продолжил немедленно, но не остановил клиента.
  4. может быть на новом потоке (если это возможно) также не проблема с запуском нового процесса.

Каков наилучший способ сделать это?

On * 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); 

Оба они вызовут новый процесс, который будет запускаться синхронно, полностью отключен от родителя. Пока ваш хост позволяет вам это сделать.

Вы можете использовать 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 

В PHP нет потоков. Вы можете обмануть, отправив обратно страницу HTML, которая запускает вызов Ajax для запуска тяжелого процесса в новом запросе. Но если это общий хостинг, я предполагаю, что вы быстро попадете в пределы объема памяти, времени или использования процессора, наложенных вашим хостинг-провайдером.

 $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);