#php #system #shell-exec #php-7.4
Вопрос:
Я хочу найти правильный путь к MySQL. Однако вывод этой команды пуст. Согласно руководству по exec()
команде PHP, эта команда должна захватывать выходные данные команды оболочки.
<?php
$cmd = "which mysql 2>amp;1;";
print($cmd."<br>");
exec($cmd, $output, $retval);
var_dump($output);
print("<br>");
var_dump($retval);
?>
выход:
which mysql 2>amp;1;
array(0) { }
int(1)
ВЫВОД КОМАНДНОЙ СТРОКИ:
$ which mysql 2>amp;1;
/usr/local/mysql/bin/mysql
Почему возникает ошибка команды? Почему переменная не содержит вывода для ошибки, так как указывает команда 2>amp;1
?
Комментарии:
1. Что вы имеете в виду под «что происходит»? php.net/manual/en/function.exec.php и php.net/manual/en/function. shell-exec.php в значительной степени покрывают именно это. shell_exec вообще не захватывает выходные данные, а exec не захватывает выходные данные, если вы этого не скажете . Так что… просто прочитайте документы и обновите свой код, чтобы использовать нужную вам функцию с правильными аргументами?
2. Какой смысл повторять ПУТЬ с самого начала? Это то, что оболочка уже делает; лучше.
3. Если ПУТЬ к веб-серверам не содержит
/usr/local/we/love/obtuse/nested/paths/
, то это ваше горе конфигурации.4. Я изменил код и вопрос таким образом, чтобы вы могли лучше понять.
Ответ №1:
Я думаю, что проблема не в том, что вы не получаете вывод выполненной команды, но which
не можете ее найти mysql
. С помощью exec
вы можете получить статус возврата вашей команды, где 0
означает «успешно», а другие значения указывают на ошибку.
$output = exec($cmd, $output, $retval);
var_dump($output);
var_dump($retval);
Если $retval
это 1
так, это будет означать which
mysql
, что двоичный файл не найден и возвращает пустую строку.
Комментарии:
1. Спасибо, я добавил, что поймал возвращаемое значение, и оно равно «1», так что есть ошибка. Однако команда терминала работает и возвращает путь MySQL.
2. Возможно
which
, что команда, которую вы запускаете в терминале, имеетPATH
конфигурацию, отличную от той, которую получает PHP. Вы могли бы сравнить результат работыecho $PATH
в вашем терминале и результат работыgetenv('PATH')
в PHP-коде. Но это выходит за рамки данного вопроса.3. Да, именно в этом и заключается проблема. Об этом также говорится в приведенном выше комментарии @mario.