Путь 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? В таком случае, есть ли хороший способ сделать это?
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 файл в первую очередь.
Если ваши файлы находятся в дереве каталогов, содержащем пробел, у вас проблема:
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 &');
Вы пробовали использовать командную строку, которую, как вы ожидаете, должен выполнить shell_exec?
Я думаю, вы пропустили "-f" в этой строке
Похоже, это действительно плохая идея. Почему вы используете shell_exec для вызова php? Похоже, что вы тестируете из браузера и вызываете через другой PHP-файл, поэтому вы знаете, что в серверной среде есть работающий интерпретатор PHP.
Вместо shell_exec() вы должны включить файл и использовать его напрямую.
Тогда вам не придется беспокоиться о пути к двоичному файлу PHP, и вы фактически получите больше контроля над файлом.