Я пытаюсь вызвать скрипт, который занимает несколько секунд (веб-службы с сторонним), используя вызов PHP exec. После долгих боев я уменьшил это до классического примера приветствия. Вызывающий скрипт выглядит так:
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 в конец вызывающего скрипта и по крайней мере теперь я не вижу вызывающий скрипт, исполняемый на выходе. Thx для плакатов, и я попробую некоторые из этих идей.
Помогите!
Благодаря Стиву
У меня тоже была эта проблема, и оказалось, что это ошибка в php (# 11430). Исправление заключается в использовании php-cli при вызове другого php-скрипта внутри php-скрипта. Таким образом, вы все равно можете использовать exec, а не использовать php-использование php-cli при вызове в браузере:
exec("php-cli somescript.php");
Это сработало для меня.
Что делает exec, он принимает самую правую команду и добавляет ее к вашему месту назначения. Если у вас есть строка shebang в вашем php-скрипте, вам не нужно включать двоичную директиву 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
Проблема заключается в самом PHP, он рассматривает все как $ argv в скрипте. Он не перенаправляет вывод в файл ou до / 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')
Это единственный способ, которым мне удалось добиться этого.
если вы просто используете php-скрипт, одним из возможных способов выполнения всего кода является использование include (), который будет запускать php-файл и выводить любые результаты. Вы не можете направить вывод в текстовый файл, но он должен появиться в окне браузера, если вы видите сценарий Hello World php
<?php echo "Hello World!"; ?>
то он выплюнет это в браузере. Таким образом, ваш второй код будет выглядеть так:
<?php include("helloWorld.php"); echo " PHP ROCKS";?>
в результате появится страница, которая будет выглядеть,
Привет мир! PHP ROCKS
Чтобы избежать заявленных проблем PHP в этой области, почему бы не поместить это внутри сценария оболочки? Затем PHP может выполнить сценарий оболочки, в котором все перенаправления обрабатываются внутренне.
Если вам нужно динамически изменять вещи, то почему бы не написать сценарий оболочки, а затем выполнить его (и, конечно, очистить потом)?
Это выполняется, как если бы вы запускали скрипт из браузера.
Это натолкнулось на работу над проектом на платформе linux.
exec('wget http://<url to the php script>)
Надеюсь это поможет!!