Путь 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? В таком случае, есть ли хороший способ сделать это?

Author: Community, 2012-09-13

4 answers

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

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

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

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

В этот момент shell_exec ('php -q-f ваш файл...') должен работать.

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

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

<?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 файл в первую очередь.

 2
Author: LSerni, 2012-09-12 22:00:31

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

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 &');
 1
Author: Bob Fincheimer, 2012-09-12 21:59:29

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

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

 0
Author: Cyrille GUIBERT, 2012-09-12 21:53:14

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

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

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

 -1
Author: ernie, 2012-09-12 21:59:14