не могу выполнить php использование сценария php exec

<p>я пытаюсь вызвать скрипт, который занимает несколько секунд (веб-сервисы с третьей стороной), используя вызов exec php. после долгих попыток я свел это к классическому примеру «привет, мир». вызывающий скрипт выглядит так:</p><pre><code>exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'); </code></pre><p>когда я запускаю это, вывод <code>execoutput.txt</code> содержит копию страницы вызывающего скрипта, а не <code>hello world</code>, как я ожидал.</p><p>почему я не могу заставить этот php сценарий выполняться с помощью exec? обратите внимание, что когда я изменяю команду на что-то вроде <code>ls -l</code>, на выходе получается список каталогов, как и ожидалось. кстати, в случае, если это имеет значение, я сделал chmod вызываемого сценария до 755 ...</p><p><strong> обновление </strong>- я переместил вызов exec в конец вызывающего скрипта и, по крайней мере, теперь я не вижу, чтобы вызывающий скрипт выполнялся в выходных данных. спасибо постерам, и я попробую некоторые из этих идей.</p><p>помогите!</p><p>благодаря steve</p>

<p>у меня была эта проблема также, и оказывается, что это ошибка в php (# 11430). исправление заключается в использовании php-cli при вызове другого сценария php внутри сценария php. таким образом, вы все равно можете использовать exec, но вместо php используйте php-cli при вызове его в браузере:</p><pre><code>exec("php-cli somescript.php"); </code></pre><p>это сработало для меня.</p>

<p>что exec делает, так это берет самую правую команду и добавляет ее к месту назначения. если в вашем php-скрипте есть строка shebang, вам не нужно включать двоичную директиву интерпретатора php.</p><p>если вам нужен вывод скрипта, попробуйте: </p><pre><code>exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') </code></pre><p>однако, если вы не хотите, чтобы ошибки были в файле, вы должны перенаправить stderr до вывода в файл. вот так:</p><pre><code>exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt') </code></pre><p>вышеприведенное должно только выводить «hello world» в execoutput.</p><p><strong> правка: </strong></p><p>интересно, вы получаете это поведение. вы заявили, что команда "ls" сработала. попробуйте создать для этого псевдоним и перенаправьте его в файл, например так: </p><p><code>alias pexec='php /home/quote2bi/tmp/helloworld.php'</code> </p><p>затем </p><pre><code>exec('pexec > /tmp/execoutput.txt 2>&1 &') </code></pre><p>похоже, проблема в том, как exec обрабатывает ввод, а не в самой оболочке.</p><p>-john</p>

<p>проблема в самом 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); </code></pre><p>и тогда вы называете это с помощью:</p><pre><code>exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2') </code></pre><p>это единственный способ, которым мне удалось заставить это работать.</p>

<p>если вы просто запускаете сценарий php, то один из возможных способов выполнить весь код - использовать include (), который будет запускать файл php и выводить любые результаты. вы не можете направить вывод в текстовый файл, но он должен появиться в окне браузера, если ваш php-скрипт hello world выглядит так</p><pre><code><?php echo "hello world!"; ?> </code></pre><p>тогда это выплюнет это в браузере. так что ваш второй код будет выглядеть</p><pre><code><?php include("helloworld.php"); echo " php rocks";?> </code></pre><p>в результате страница, которая будет выглядеть,</p><p>привет, мир! php rocks</p>

<p>чтобы избежать заявленных проблем php в этой области, почему бы не поместить это внутрь сценария shell? php может затем выполнить сценарий оболочки, в котором все перенаправления обрабатываются внутренне.</p><p>если вам нужно что-то динамически изменить, то почему бы не написать сценарий shell, а затем выполнить его (и, конечно, очистить впоследствии)?</p>

<p>это работает так, как будто вы запускаете скрипт из браузера.</p><p>это встречалось при работе над проектом на платформе linux.</p><pre><code>exec('wget http://<url to the php script>) </code></pre><p>надеюсь это поможет!!</p>