PHP CGI заменяет имя вызываемого файла в вызовах командной строки exec, вызывая бесконечный цикл

Я переношу приложение на новый сервер. Приложение использует вызовы командной строки, а новый сервер запускает PHP как CGI / FastCGI.

Проблема: сценарий, который запускается в командной строке, не является файлом, указанным в команде exec, а сам вызывающий файл.

Приложение использует exec () для запуска сценариев в командной строке. Весь код call_script.php (уменьшенный от фактического приложения для демонстрации проблемы):

<? echo __FILE__; $test = 1; shell_exec("/usr/bin/php /path/called_script.php ".$test." >> /path/out.log 2>&1 &"); 

Для call_script.php это просто:

 <? echo __FILE__; var_dump($argv[1]); 

Что происходит: вызывается call_script.php вместо call_script.php – и параметр также теряется – call_script.php вызывается в бесконечном цикле, поскольку каждый вызов ему вызывает другой вызов exec, который выполняется на нем снова , Я попробовал passsthrough и shell_exec вместо exec – с теми же результатами.

Я нашел это объяснение на форуме: http://www.mombu.com/php/php-5-forum/t-24759-exec-or-system-et-all-cause-an-infinite-loop-of- start-request-program-8469354.html (через exec () вызывают бесконечный цикл запуска запрошенной программы )

Цитата: «Вы используете версию CGI для PHP, и теперь она берет имя сценария из среды, а не из командной строки, поскольку она« более безопасна ».

Чтобы контролировать это, есть (или должно быть) настройка ini, однако вы, вероятно, захотите запустить версию CLI для PHP из ваших сценариев ».

Я попытался получить доступ к CLI-версии PHP, но новый сервер управляется провайдером и не имеет версии CLI. Есть ли другие решения?

В конце концов, чего я хочу достичь, это асинхронное выполнение php – любая рекомендация о том, как я могу достичь этого без CLI-версии PHP? Использовать CURL, PEAR или fsockopen? Серверы очереди или очереди задач (например, gearman или beanstalkd), и если да, то какой? Любое решение, которое я могу реализовать быстро, сердечно приветствуется.

Для этого вам действительно нужно использовать версию CLI для PHP. Вы можете прокрасться вокруг вещей CGI, отключив каждую из переменных окружения, перечисленных в спецификации CGI.

http://en.wikipedia.org/wiki/Common_Gateway_Interface

 <?php $cmd = array(); // Explicitly clear CGI variables from the environment. This relies on "E" being // set in your http://www.php.net/manual/en/ini.core.php#ini.variables-order foreach ($_ENV as $k => $v) { if (preg_match( '/^(HTTP_|REQUEST_|SERVER_|PATH_|DOCUMENT_ROOT|GATEWAY_INTERFACE)/', $k)) { $cmd[] = "$k=''"; } } // Generates a command like: "GATEWAY_INTERFACE='' /usr/bin/php myscript.php" $prefix = implode($cmd, ' '); shell_exec("$prefix /usr/bin/php myscript.php"); 

Ну, у меня была такая же проблема. Решение было простым. просто добавьте exit (); после вызова system ().

Работает для меня phpfcgi 5.6 Centos, cpanel easy apache 4

system ("/ usr / bin / php /path/called_script.php". $ test. ">> /path/out.log 2> & 1 &"); Выход();