php exec/shell_exec/system/popen/proc_open запускает сам вызывающий скрипт бесконечное количество раз в linux
У меня есть скрипт, который проверяет синтаксическую ошибку в php файле, используя php -l . Он отлично работает в Windows, но дает неправильный вывод в Linux:
содержимое файла exec_ip.php, который проверяется на наличие синтаксической ошибки (имеет синтаксическую ошибку, которая должна быть проверена):
<?php
$arr['12] = 'asd';
?>
и скрипт такой:
$slash = file_get_contents('exec_ip.php');
//echo $slash;
$tmpfname = tempnam("tmp", "PHPFile");
file_put_contents($tmpfname, $slash);
exec("php -l ".$tmpfname,$error);
$errtext = '';
foreach($error as $errline) $errtext.='<br>'.$errline;
unlink($tmpfname);
echo 'ERR:'.$errtext;
РЕЗУЛЬТАТ В ОКНАХ (WAMP) {ПРАВИЛЬНО}:
ERR:
Parse error: syntax error, unexpected T_STRING, expecting ']' in C:\WINDOWS\Temp\PHP1F1.tmp on line 2
Errors parsing C:\WINDOWS\Temp\PHP1F1.tmp
РЕЗУЛЬТАТ В LINUX (Centos/cPanel) {НЕИЗВЕСТНЫЙ ВЫХОД}:
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
Content-type: text/html
ERR:
... too many same above lines
Пожалуйста, кто-нибудь, помогите мне и укажите, почему он дает неправильный вывод на производственном сервере Linux. Я также пытался использовать shell_exec, popen, proc_open, system вместо exec, но у всех одинаковое поведение. Я пытаюсь выяснить причину последних 2 дней... пожалуйста, помогите
РЕДАКТИРОВАТЬ: Иногда я вижу следующий журнал ошибок: "Предупреждение PHP: exec(): невозможно вставить [php -l /tmp/PHPFileI4T43l] в /home/user/public_html/exect.php в строке 5". Я думаю, что это рекурсивные команды exec, создающие новый процесс в каждой рекурсии, но не смог понять причину этого.
1 ответ
После 2 дней головной боли и большого количества поисков... я нашел решение по ссылке http://www.mombu.com/php/php-5-forum/t-24759-exec-or-system-et-all-cause-an-infinite-loop-of-starting-requested-program-8469354.html
Это была версия PHP CGI, которая считывает имя сценария из среды, таким образом заставляя мой вызывающий сценарий запускаться бесконечное количество раз или до максимального количества разрешенных процессов или до тех пор, пока не будет использована вся память.
Решение заключается в простом использовании команды php-cli вместо команды php.
я заменил строку ниже в моем коде
exec("php -l ".$tmpfname,$error);
с
exec("php-cli -l ".$tmpfname,$error);
и теперь все хорошо.
Надеюсь, это кому-нибудь поможет.Я также изменил название этого вопроса, чтобы другие люди могли легко найти решение той же проблемы в Google.