Возможный дубликат:
Команда php exec (или аналогичная), чтобы не дождаться результата
У меня есть страница, которая запускает ряд команд exec()
чего мой PHP-скрипт останавливает изменение до получения ответа. Как я могу сказать exec()
чтобы не дождаться ответа и просто запустить команду?
Я использую сложную команду, которая имеет бэкэнд-систему, которую я могу запросить, чтобы проверить статус, поэтому я не заинтересован в ответе.
Зависит от используемой вами платформы и от команды, которую вы используете.
Например, в Unix / Linux вы можете добавить > /dev/null &
в конец команды, чтобы сообщить оболочке освободить процесс, который вы запустили, и exec немедленно вернется. Это не работает в Windows, но есть альтернативный подход с использованием COM-объекта (см. Ниже).
Многие команды имеют аргумент командной строки, который может быть передан, поэтому они освобождают свою связь с терминалом и немедленно возвращаются. Кроме того, некоторые команды будут зависать, потому что они задали вопрос и ждут ввода пользователем, чтобы сообщить им продолжить (например, при запуске gzip
и целевой файл уже существует). В этих случаях обычно есть аргумент командной строки, который можно передать, чтобы сообщить программе, как справиться с этим, и не задавать вопрос (в примере gzip
вы должны передать -f
).
РЕДАКТИРОВАТЬ
Вот код, который нужно делать в Windows, если доступен COM
:
$commandToExec = 'somecommand.exe'; $wshShell = new COM("WScript.Shell"); $wshShell->Run($commandToExec, 0, FALSE);
Обратите внимание, что это третий параметр FALSE
который сообщает WshShell о запуске программы, а затем немедленно возвращается (второй параметр 0
определяется как «стиль окна» и, вероятно, здесь бессмысленен – вы можете передать любое целочисленное значение). Объект WshShell описан здесь . Это определенно работает, я использовал его раньше …
Я также отредактировал выше, чтобы отразить тот факт, что для соединения /dev/null
требуется также подключение к /dev/null
чтобы работать с exec()
на * nix.
Также добавлено немного больше информации о WshShell.
Раньше у меня была удача в конструкциях, подобных следующим (окна, но я уверен, что есть эквивалентная команда в * nix
pclose(popen('START /B some_command','r'));
Как насчет запуска команды в фоновом режиме?
exec('./run &');