Не удается выполнить PHP скрипт с помощью PHP exec
Я пытаюсь вызвать script, который занимает несколько секунд (веб-службы с третьим лицом), используя вызов PHP exec. После долгих боев я уменьшил это до классического примера приветствия. Вызывающий script выглядит так:
exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');
Когда я запустил это, вывод execoutput.txt
содержит копию вызывающей страницы script, а не hello world
, как я ожидал.
Почему я не могу запустить этот PHP script с помощью exec? Обратите внимание, что когда я изменяю команду на что-то вроде ls -l
, вывод является списком каталогов, как и ожидалось. Кстати, в случае, если это имеет значение, я сделал chmod вызванный script до 755...
Обновление. Я переместил вызов exec в конец вызывающего script и по крайней мере теперь я не вижу вызывающего script, выполненного в результате. спасибо для плакатов, и я попробую некоторые из этих идей.
Help!
Спасибо
Стив
Ответы
Ответ 1
У меня тоже была эта проблема, и оказалось, что это ошибка в php (# 11430). Исправление заключается в использовании php-cli при вызове другого php script внутри PHP скрипт. Таким образом, вы все равно можете использовать exec, но вместо использования php use php-cli при вызове в браузере:
exec("php-cli somescript.php");
Это сработало для меня.
Ответ 2
Что делает exec, он принимает самую правую команду и добавляет ее к вашему месту назначения. Если у вас есть строка shebang на вашем php script, вам не нужно включать двоичную директиву PHP-интерпретатора.
если вы просто хотите получить вывод script, попробуйте:
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 управляет вводом, а не самой оболочкой.
-Джон
Ответ 3
Проблема с самим PHP, она рассматривает все как $argv в script. Он не перенаправляет вывод в файл ou до /dev/null.
Я столкнулся с той же проблемой некоторое время назад. То, что я сделал, - создать runscript.php
in/opt/php-bin, а затем внутри этого script запустить то, что должно быть запущено. Что-то вроде этого:
$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')
Это единственный способ, которым мне удалось это работать.
Ответ 4
если вы просто используете php script, один из возможных способов выполнения всего кода - использовать include(), который будет запускать php файл и выводить любые результаты. Вы не можете направить вывод в текстовый файл, но он должен появиться в окне браузера, если вы Hello World PHP скрипт выглядит как
<?php echo "Hello World!"; ?>
то он выплюнет это в браузере. Таким образом, ваш второй код будет выглядеть как
<?php include("helloWorld.php"); echo " PHP ROCKS";?>
в результате появится страница, которая будет выглядеть,
Привет, мир! PHP ROCKS
Ответ 5
Чтобы избежать заявленных проблем PHP в этой области, почему бы не поместить это внутри оболочки script? Затем PHP может выполнить оболочку script, которая имеет все переадресации, обрабатываемые внутренне.
Если вам нужно динамически изменять вещи, то почему бы не написать оболочку script, а затем выполнить ее (и, конечно, очистить потом)?
Ответ 6
Выполняется так, как будто вы запускаете script из браузера.
Это натолкнулось на работу над проектом на платформе linux.
exec('wget http://<url to the PHP скрипт>)
Надеюсь, это поможет!