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.

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