Как выполнить скрипт 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

Другие вопросы по тегам