Я переношу приложение на новый сервер. Приложение использует вызовы командной строки, а новый сервер запускает 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 &"); Выход();