it-swarm.com.ru

Не могу выполнить PHP использование сценария PHP Exec

Я пытаюсь вызвать скрипт, который занимает несколько секунд (веб-сервисы с третьей стороной), используя вызов 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 в конец вызывающего скрипта и, по крайней мере, теперь я не вижу, чтобы вызывающий скрипт выполнялся в выходных данных. Спасибо постерам, и я попробую некоторые из этих идей.

Помогите!

Благодаря Steve

15
Steve

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

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

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

28
Keith

Что 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.

Правка:

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

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

затем 

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

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

-John

16
John T

Проблема в самом 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')

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

8
Luiz Damim

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

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

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

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

в результате страница, которая будет выглядеть,

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

1
Nathan

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

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

0
Jeremy L

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

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

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

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

0
Amar