PHP: exec () не работает в фоновом режиме даже с помощью «> / dev / null 2> & 1 &"

Я называю это в своем php-скрипте:

exec("gutschein.php >/dev/null 2>&1 &"); 

Вызов сценария (создает PDF-файл и отправляет его по электронной почте) работает, но процесс не работает в фоновом режиме (я проверил его с помощью инструкции сна внутри gutschein.php). Браузер висит до завершения выполнения gutschein.php.

Я также проверил следующее:

  exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &"); 

или

 shell_exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &"); 

Это ничего не меняет. Скрипт фактически работает на сервере linux. Кто-нибудь знает, что я делаю неправильно?

Попробуйте систему и / или passthru. У меня были проблемы с exec раньше, потому что он останавливается, пытаясь заполнить возвращаемый массив данными до тех пор, пока процесс не завершится.

Они будут воспроизводить исходный вывод так, что даже если они будут работать, вам может понадобиться обработать это с помощью отброшенного выходного буфера.

Вы можете использовать экран: screen -d -m /usr/bin/php gutschein.php

Вот экранное руководство, если вам нужна дополнительная информация о параметрах.

Посмотрите мой опыт в ЗДЕСЬ . То, как я стараюсь и работает для меня –

 php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null & 

В PHP это похоже на

 exec('php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null &') 

Все выходные данные должны быть перенаправлены, иначе скрипт будет висеть до тех пор, пока выполняется gutschein.php. Пытаться

 exec('/usr/bin/php gutschein.php &> /dev/null &'); 

Можете ли вы попробовать одну из следующих двух команд для запуска фоновых заданий с PHP:

 $out = shell_exec('nohup /usr/bin/php /path/to/gutschein.php >/dev/null 2>&1 &'); 

ИЛИ

 $pid = pclose(popen('/usr/bin/php gutschein.php', 'r')); 

Он выполнит команду в фоновом режиме и вернет вам PID, который вы можете проверить с помощью условия $pid > 0 чтобы убедиться, что он сработал.

  /** * @author Micheal Mouner * @param String $commandJob * @return Integer $pid */ public function PsExec($commandJob) { $command = $commandJob . ' > /dev/null 2>&1 & echo $!'; exec($command, $op); $pid = (int) $op[0]; if ($pid != "") return $pid; return false; } 

Это сработало для меня .. проверьте это

также, return processId фонового процесса

Браузер может ожидать ответа, поэтому пусть ваш скрипт производит какой-либо вывод и завершает «основной процесс». просто

 die('ok'); 

должен выполнять эту работу.


btw, разветвление нового процесса, вызвав exec, может оказаться не лучшим решением, поскольку новый процесс не является реальным дочерним процессом – значит, вы не можете его контролировать. вы можете рассмотреть возможность использования pcntl ( http://php.net/manual/de/book.pcntl.php ) для этой цели. но ясно, это расширение имеет также свои подводные камни, особенно в контексте веб-сервера.