Это работает для меня в CentOS:
echo -e ""hello\nworld""
Как насчет добавления.
"> /dev/null 2>/dev/null &"
shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');
Обратите внимание, что это также избавляет от stdio и stderr.
This will execute a command and disconnect from the running process. Of course, it can be any command you want. But for a test, you can create a php file with a sleep(20) command it.
exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
Если он находится за пределами веб-страницы, я рекомендую сгенерировать какой-либо сигнал (возможно, сбросить файл в каталог) и попросить задание cron подобрать работу, которую необходимо выполнить . В противном случае мы, скорее всего, попадем на территорию использования pcntl_fork ()
и exec ()
внутри процесса Apache, и это просто плохой mojo.
Это будет работать, но вы должны быть осторожны, чтобы не перегружать ваш сервер, потому что он будет создавать новый процесс каждый раз, когда вы вызываете эту функцию, которая будет работать в фоновом режиме. Если одновременно выполняется только один вызов, этот обходной путь выполнит свою работу.
Если нет, то я бы посоветовал запустить очередь сообщений, например, beanstalkd / gearman / amazon sqs.
Вы всегда можете отправить сообщение через AJAX на страницу, которая вызывает shell_exec ().
Используйте команду PHP popen
, например:
pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
Это создаст дочерний процесс, и сценарий будет запускаться в фоновом режиме, не дожидаясь вывода.
В Windows 2003, чтобы вызвать другой сценарий без ожидания, я использовал следующее:
$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg";
pclose(popen($commandString, 'r'));
Это работает только ПОСЛЕ изменения разрешений на cmd.exe
- добавить Чтение и выполнение для IUSR_YOURMACHINE
(я также установил для записи значение «Запретить»).