PHP system(), exec () и shell_exec() не возвращают выходные данные

#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.