Не могу выполнить скрипт PHP, используя PHP exec - PullRequest
15 голосов
/ 19 февраля 2009

Я пытаюсь вызвать скрипт, который занимает несколько секунд (веб-сервисы с третьей стороной), используя вызов exec PHP. После долгих попыток я свел это к классическому примеру «Привет, мир». Вызывающий скрипт выглядит так:

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

Когда я запускаю это, вывод execoutput.txt содержит копию страницы вызывающего скрипта, а не hello world, как я ожидал.

Почему я не могу заставить этот скрипт PHP выполняться с использованием exec? Обратите внимание, что когда я изменяю команду на что-то вроде ls -l, выводом является список каталогов, как и ожидалось. Кстати, в случае, если это имеет значение, я сделал chmod вызываемого сценария до 755 ...

Обновление - Я переместил вызов exec в конец вызывающего скрипта, и по крайней мере теперь я не вижу вызывающий скрипт, выполняемый в выходных данных. Спасибо постерам, и я попробую некоторые из этих идей.

Помощь!

Спасибо Стив

Ответы [ 6 ]

28 голосов
/ 19 мая 2010

У меня тоже была эта проблема, и оказалось, что это ошибка в php (# 11430). Исправление заключается в использовании php-cli при вызове другого скрипта php внутри скрипта php. Таким образом, вы все равно можете использовать exec, но вместо php используйте php-cli при вызове его в браузере:

exec("php-cli  somescript.php");

Это сработало для меня.

16 голосов
/ 19 февраля 2009

Что исполняет exec, так это получение самой правой команды и добавление ее к месту назначения. Если в вашем php-скрипте есть строка shebang, вам не нужно включать двоичную директиву интерпретатора php.

если вы хотите получить вывод скрипта, попробуйте:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

однако, если вы не хотите, чтобы ошибки были в файле, вы должны перенаправить STDERR до вывода в файл. Вот так:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

вышеприведенное должно выводить «Hello World» только в execoutput.

Edit:

Интересно, вы получаете это поведение. Вы заявили, что команда "ls" сработала. Попробуйте создать для этого псевдоним и перенаправьте его в файл, подобный следующему:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

, затем

exec('pexec > /tmp/execoutput.txt 2>&1 &')

похоже, проблема в том, как exec обрабатывает ввод, а не в самой оболочке.

-John

8 голосов
/ 19 февраля 2009

Проблема с самим PHP, он обрабатывает все как $ argv в скрипте. Он не перенаправляет вывод в файл или в /dev/null.

Я столкнулся с той же проблемой некоторое время назад. Я создал runscript.php в / opt / php-bin и затем внутри этого скрипта запустил то, что должно быть запущено. Примерно так:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

А потом вы называете это с помощью:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

Это единственный способ, которым мне удалось заставить это работать.

1 голос
/ 02 октября 2010

если вы просто запускаете сценарий php, один из возможных способов выполнить весь код - это использовать include (), который будет запускать файл php и выводить результаты Вы не можете направить вывод в текстовый файл, но он должен появиться в окне браузера, если ваш PHP-скрипт Hello World выглядит как

<?php echo "Hello World!"; ?>

тогда это будет выплевано в браузере. Таким образом, ваш второй код будет выглядеть как

<?php include("helloWorld.php");  echo " PHP ROCKS";?>

в результате получается страница, которая будет выглядеть следующим образом:

Привет, мир! PHP ROCKS

0 голосов
/ 07 января 2014

Это работает так, как будто вы запускаете скрипт из браузера.

Это встречалось при работе над проектом на платформе Linux.

exec('wget http://<url to the php script>)

Надеюсь, это поможет !!

0 голосов
/ 26 февраля 2009

Чтобы избежать заявленных проблем PHP в этой области, почему бы не поместить это внутрь сценария оболочки? Затем PHP может выполнить сценарий оболочки, в котором все перенаправления обрабатываются внутренне.

Если вам нужно что-то динамически изменить, то почему бы не написать сценарий оболочки, а затем выполнить его (и, конечно же, очистить впоследствии)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...