Intereting Posts
HTTP if-none-match и if-modified-since и 304 разъяснение в PHP стандартная функция для перевода iso-639 кодов в название языка? Laravel 5 charset не работает правильно на представлениях. Но он работает хорошо, когда я сбрасываю его с контроллера CodeIgniter: Класс 'CI_Controller' не найден Мне нужна помощь в изменении регулярного выражения для уценки PHP Является ли использование PHP для сопоставления нескольких файлов JavaScript, которые будут быстрее, чем включение их отдельно? PHP: чтение config.ini для массива с файлом () Как программно построить APR1-MD5 с помощью PHP Почему «эхо» 2? print (2) + 3 "print 521? Symfony NelmioApiDocBundle swagger-ui PHP Аннотации объекта json с массивом свойств объектов, не показывающих Удаление нечисловых символов (кроме периодов и запятых) из строки Уведомление и PHP + MySQL дизайн Поставщики Symfony-2.0 Apache конвертировать каждый дд мм yy в unix time и вставлять в поле birthday_date метод выбора случайных символов из заданной строки

Невозможно выполнить PHP-скрипт с помощью PHP exec

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

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