У меня есть задача с интенсивным процессом, которую я хотел бы запустить в фоновом режиме.
Пользователь щелкает страницу, запускается сценарий PHP, и, наконец, в зависимости от некоторых условий, если требуется, он должен запустить сценарий оболочки EG:
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
В настоящее время я использую shell_exec , но для этого необходимо, чтобы сценарий ждал вывода. Есть ли способ выполнить нужную мне команду, не дожидаясь ее завершения?
Ответы:
Как насчет добавления.
Обратите внимание, что это также избавляет от stdio и stderr.
источник
> /dev/null 2>&1 &
как видно из других ответов,> /dev/null 2>/dev/null &
здесь дана краткая форма . По сути, это означает «перенаправить STDERR (2) в то же место, что и STDOUT (& 1)».Это выполнит команду и отключится от запущенного процесса. Конечно, это может быть любая команда. Но для теста вы можете создать файл php с помощью команды sleep (20) it.
источник
nohup
и другое&
?Вы также можете немедленно вернуть результат клиенту и продолжить обработку кода PHP после этого.
Это метод, который я использую для долго ожидающих вызовов Ajax, которые не повлияют на клиентскую сторону:
Вы можете найти подробное объяснение здесь: http://oytun.co/response-now-process-later
источник
В Windows 2003, чтобы вызвать другой сценарий без ожидания, я использовал это:
Это работает только ПОСЛЕ предоставления разрешения на изменение
cmd.exe
- добавьте Read и Execute дляIUSR_YOURMACHINE
(я также установил запись на Deny).источник
Конечно,
windows
вы можете использовать:Примечание:
Если вы получили сообщение
COM
об ошибке, добавьте расширение в свойphp.ini
и перезапуститеapache
:источник
Используйте
popen
команду PHP , например:Это создаст дочерний процесс, и скрипт будет запускаться в фоновом режиме, не дожидаясь вывода.
источник
Если он находится за пределами веб-страницы, я рекомендую создать какой-либо сигнал (возможно, сбросить файл в каталог) и попросить задание cron подобрать работу, которую необходимо выполнить. В противном случае мы, скорее всего, попадем на территорию использования
pcntl_fork()
иexec()
изнутри процесса Apache, и это просто плохой моджо.источник
Это будет работать, но вы должны быть осторожны, чтобы не перегружать свой сервер, потому что он будет создавать новый процесс каждый раз, когда вы вызываете эту функцию, которая будет работать в фоновом режиме. Если одновременно выполняется только один вызов, этот обходной путь выполнит свою работу.
Если нет, то я бы посоветовал запустить очередь сообщений, например, beanstalkd / gearman / amazon sqs.
источник