Путь PHP для shell_exec () для вызова файла PHP

Я пытаюсь использовать shell_exec() и не понимаю, как его использовать. Я сослался на эту страницу: Есть ли способ использовать shell_exec, не дожидаясь завершения команды?.

Я создал два файла PHP:

shell_exec.php

<?php 
    shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');
?>

log.php

<?php
    $file = __DIR__ . '/log.txt';
    $current = time() . ": sample text\r\n";
    file_put_contents($file, $current,FILE_APPEND);
?>

Затем я получил доступ к странице shell_exec.php из своего браузера. Я ожидал, что он запустит log.php и создаст файл. Однако ничего не происходит.

Я подозреваю, что пути php, указанные в функции, которая равна php в приведенном выше коде, различаются в разных операционных системах. В настоящее время я тестирую в Windows, так что это может быть причиной того, что это не работает. Но я не уверен на 100%.

Если да, как мне найти путь php и указать его в своей среде? Также означает ли это, что если я распространю скрипт, который использует shell_exec() и вызову скрипт php, нужно ли мне писать код, чтобы узнать путь php? В таком случае, есть ли хороший способ сделать это?


person Teno    schedule 12.09.2012    source источник
comment
Ваши подозрения верны, найдите путь к исполняемому файлу PHP и попробуйте еще раз, см. Также этот пост, чтобы найти исполняемый файл http://stackoverflow.com/questions/2372624/get-current-php-executable-from-within-script   -  person dbf    schedule 13.09.2012
comment
Я не уверен, почему вы используете shell_exec ()? Похоже, это действительно плохая идея. Было бы более безопасно включить файл и использовать его в вызывающем файле php. . .   -  person ernie    schedule 13.09.2012
comment
Вы всегда можете попробовать _1 _...   -  person Kerrek SB    schedule 13.09.2012
comment
Это всегда будет работать: /usr/bin/env php   -  person dan-lee    schedule 13.09.2012
comment
@DanLee, который не работает в Windows. . .   -  person ernie    schedule 13.09.2012
comment
Я сейчас тестирую в Windows ..   -  person dbf    schedule 13.09.2012
comment
Ладно ты меня достал :) Извините, давненько разрабатывал под Win   -  person dan-lee    schedule 13.09.2012
comment
Если двоичный файл php находится в пути Windows, вам не нужно указывать путь к двоичному файлу   -  person adosaiguas    schedule 13.09.2012
comment
Я пробовал и /usr/bin/php, и /usr/bin/env php, но ничего не вышло. Я запускаю XAMPP на переносном диске. Не в этом ли причина?   -  person Teno    schedule 13.09.2012
comment
@dbf Спасибо, ваша информация была ответом.   -  person Teno    schedule 13.09.2012
comment
@Teno, блин, надо было выразить это как ответ, ну ладно :)   -  person dbf    schedule 13.09.2012


Ответы (4)


Если да, как мне найти путь php и указать его в своей среде? Также означает ли это, что если я распространю скрипт, который использует shell_exec () ...

К сожалению, да. Среда, в которой вы распространяете сценарий, должна иметь командную строку PHP (которая не обязательно совпадает с PHP, используемым веб-сервером - это может быть другая версия).

И нет простого способа "найти" его.

Итак, что вам нужно сделать, это четко указать (при распространении), что исполняемый файл командной строки PHP должен находиться в PATH.

На этом этапе shell_exec ('php -q -f yourfile ...') должен работать.

Вы можете перенаправить вывод в файл (всегда один и тот же, если хотите) и удалить его, если нет ошибок. В противном случае файл покажет, какие ошибки произошли, что может быть полезно.

ОБНОВЛЕНИЕ: и в первый раз для отладки не перенаправляйте вывод, а попробуйте:

<?php
    Header("Content-Type: text/plain");
    error_reporting(E_ALL);
    print shell_exec('php "' . __DIR__ . '/log.php" 2>&1'); // > /dev/null 2>/dev/null &');
?>

Таким образом, вы можете увидеть, не попадает ли команда в какую-то другую загвоздку, например, в первую очередь, у вас нет прав на создание файла log.txt.

person LSerni    schedule 12.09.2012
comment
Я получил 'php' is not recognized as an internal or external command, operable program or batch file. - person Teno; 13.09.2012
comment
Эээ. Тогда это означает, что его нет в системном PATH (или, может быть, он даже не установлен: наличие веб-сервера PHP не означает наличие командной строки PHP). Убедитесь, что у вас есть двоичный файл PHP, а затем добавьте соответствующий путь в конфигурацию вашей системы. - person LSerni; 13.09.2012
comment
Наконец shell_exec('Z:\xampp\php\php.exe "' . __DIR__ . '/log.php" 2>&1'); сработал. Спасибо. Но можно ли программно найти путь? - person Teno; 13.09.2012
comment
Когда я прочитал ссылку dbf, кажется, что он доступен с PHP v5.4. - person Teno; 13.09.2012
comment
Это не (легко) возможно, потому что верным способом будет поиск всего диска с opendir() и file_exists(). Если он находится в системном PATH, он работает автоматически, если его нет, вы не можете знать, где он находится. Допустим, вы установили XAMPP, а также Wamp-X и пакет PHP MSI: вы получаете три разных PHP.EXE - какой именно вам нужен? Нет функции, которая могла бы сказать вам это, и да, в этом загвоздка. - person LSerni; 13.09.2012

Если ваши файлы находятся в дереве каталогов, содержащем пробел, у вас есть проблема:

shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');

становится:

shell_exec('php somepath/with spaces in it/log.php > /dev/null 2>/dev/null &');

что заставляет php запускаться somepath/with как скрипт с аргументами:

'spaces', 'in', 'it/log.php'

попробуйте заключить аргумент в кавычки:

shell_exec('php "' . __DIR__ . '/log.php" > /dev/null 2>/dev/null &');
person Bob Fincheimer    schedule 12.09.2012
comment
Действительно, в пути к каталогу был пробел. И я попытался поставить двойные двоеточия, как вы предлагаете, но все еще не работал. Спасибо за ответ. - person Teno; 13.09.2012

Вы пробовали командную строку, которую ожидаете от shell_exec?

Я думаю, вы пропустили '-f' в этой строке

person Cyrille GUIBERT    schedule 12.09.2012
comment
Он это сделал, но '-f' в любом случае необязателен. - person LSerni; 13.09.2012

Похоже, это действительно плохая идея. Почему вы используете shell_exec для вызова php? Похоже, вы тестируете из браузера и вызываете через другой файл PHP, поэтому вы знаете, что в серверной среде есть работающий интерпретатор PHP.

Вместо shell_exec () вам следует включить файл и использовать его напрямую.

Тогда вам не придется беспокоиться о пути к двоичному файлу PHP, и вы фактически получите больше контроля над файлом.

person ernie    schedule 12.09.2012
comment
Мне нужно запустить фоновый процесс. Вот почему. - person Teno; 13.09.2012