Вызов php из php через exec () не дает результата - PullRequest
3 голосов
/ 10 марта 2010

У меня есть PHP-скрипт, который создает другие PHP-файлы на основе пользовательского ввода. В основном, есть файлы, содержащие языковые константы (define), которые могут быть переведены пользователем. Чтобы избежать ошибок во время выполнения, я хочу проверить вновь записанные файлы на наличие ошибок синтаксического анализа (из-за «необычных» последовательностей символов). Я прочитал несколько постов здесь на SO (например, PHP включают файлы с ошибками разбора ) и попробовал функцию, которая использует

$output = exec("php -l $filename");

, чтобы определить, правильно ли анализируется файл. Это прекрасно работает на моей локальной машине, но на машине провайдера вывод вызовов на exec("php ...") кажется всегда пустым. Я попытался вызвать ls, и он вывел меня, что привело меня к предположению, что PHP каким-то образом настроен так, чтобы не реагировать на вызовы командной строки или около того. Кто-нибудь знает способ обойти это?

РЕДАКТИРОВАТЬ: Я забыл упомянуть, я уже пробовал shell_exec, и это также не дает результата. В ответ на ответ сганеша: я тоже это пробовал, извините, я забыл упомянуть. Однако выходные данные (второй аргумент) всегда будут пустым массивом, а возвращаемое значение всегда будет 127, независимо от того, есть ли у файла PHP для проверки синтаксические ошибки или нет.

Ответы [ 6 ]

9 голосов
/ 09 сентября 2012

У меня была такая же проблема. Решение, которое работало для меня, было найдено в running-at-from-php-give-no-output . Мне нужно было добавить перенаправление вывода.

$output = exec("php -l $filename 2>&1");
6 голосов
/ 10 марта 2010

Вы можете попробовать использовать exec второй и третий аргументы. Второй аргумент будет иметь вывод команды. третий аргумент будет иметь возвращаемое значение.

И exec вернет только последнюю строку команды.

$filename = "a.php";
$output = exec("php -l $filename",$op,$ret_val);
print $output."\n";
print $ret_val."\n";
var_dump($op);
1 голос
/ 10 марта 2010

Хорошая идея проверить правильность файла: -)!

Теперь из руководства по PHP для exec ():

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

Можете ли вы проверить, не относится ли это к вам?

Также вы можете проверить, указав полный путь к интерпретатору PHP в exec () вместо только php. Дайте мне знать, как вы поживаете.

Пинаки

1 голос
/ 10 марта 2010

Выполнив shell_exec (), вы можете увидеть вывод, как если бы вы выполнили этот файл из командной строки. Вы можете просто увидеть, есть ли здесь ошибка.

<?php
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
    die('An error!');
}

Также возможно, что shell_exec () или exec () могут быть отключены вашим хостом.

0 голосов
/ 06 марта 2014

правильный способ - добавить >2&1, как проверено в системе Windows с использованием imagemagick!

0 голосов
/ 11 марта 2010

Я обошел свою первоначальную проблему, используя другой метод. Вот что я делаю сейчас:

  1. Написать временный файл с содержимым <?php include "< File to test >"; echo "OK"; ?>
  2. Создать правильный URL для временного файла
  3. Выполнить HTTP-запрос с этим URL
  4. Проверьте, равен ли результат "ОК". Если да, файл для проверки анализируется без ошибок.
  5. Удалить временный файл

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

Почему подход exec() не сработал, я до сих пор точно не знаю. Пинаки может быть прав, предлагая указать полный путь к исполняемому файлу PHP, но я не могу найти полный путь.

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

...