Как выполнить скрипт php из другого?
Как выполнить скрипт php из другого?
Я хочу выполнить 3 php-скрипта из моего php-файла, не дожидаясь завершения 3-х скриптов. Другими словами, 3 php-файла должны выполняться одновременно (параллельно), а не по одному (sequentiell).
Эти 3 скрипта находятся в той же папке моего основного файла php (скрипт).
5 ответов
Если вы не хотите ждать, пока они закончат, запустите их либо
exec('php script.php &> /dev/null &');
shell_exec('php script.php &> /dev/null &');
system('php script.php &> /dev/null &');
`php script.php &> /dev/null &`
Любой из них должен выполнить эту работу, в зависимости от вашей конфигурации PHP. Хотя это разные функции, их поведение должно быть схожим, поскольку весь вывод перенаправляется в / dev / null и процесс немедленно отключается.
Я использую первое решение в производственной среде, где клиент запускает сценарий отправки SMS-сообщений bash, выполнение которого может занять до 10 минут.
Более подробная информация: http://php.net/exec · http://php.net/shell_exec · http://php.net/system
В shell_exec добавьте параметр /B, это позволит вам запускать несколько исполняемых файлов одновременно. Смотрите мой ответ на этот вопрос: PHP на машине с Windows; Начать процесс в фоновом режиме
Это то же самое.
shell_exec ('start /B "C: \ Path \ to \ program.exe"); Параметр /B является ключевым здесь. Я снова попытался найти тему для вас, но, похоже, больше не могу ее найти. Это работает для меня.
Я надеюсь, что это решит проблему для вас.
Вам нужно запускать их как отдельные задания, а это не очень просто - или переносимо. Обычное решение заключается в использовании nohup
или выполнить сценарии с перенаправленными stdout и stderr в /dev/null (или NUL в Windows), но это часто имеет проблемы.
Если возможно, сделайте эти три сценария доступными в виде сценариев на веб-сервере и получите к ним доступ через асинхронные функции cURL. Это также имеет то преимущество, что вы можете протестировать скрипты через браузер и предоставить вам вывод скриптов.
Другие способы включают использование popen()
или, если под Linux, at
или же batch
полезность.
Взяты из http://board.phpbuilder.com/showthread.php?10351142-How-can-I-exec%28%29-in-a-non-blocking-fashion:
Чтобы выполнить команду, чтобы она не повесила ваш php-скрипт во время работы, программа, которую вы запускаете, не должна выводить обратно в php. Для этого перенаправьте как stdout, так и stderr в / dev / null, затем добавьте фон.
> /dev/null 2>&1 &
Чтобы выполнить команду и запустить ее как другой процесс, который не зависит от потока apache, чтобы продолжать работать (не умрет, если кто-то отменит страницу), запустите это:
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
Для Windows http://www.php.net/manual/en/function.exec.php:
function execInBackground($path, $exe, $args = "") {
global $conf;
if (file_exists($path . $exe)) {
chdir($path);
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));
} else {
exec("./" . $exe . " " . escapeshellarg($args) . " > /dev/null &");
}
}
Как насчет использования exec("php yourscript.php")
Обязательно используйте систему очередей для хранения имен ваших php-скриптов и работника для извлечения данных из очереди и выполнения, например, beanstalkd