Я пытаюсь выполнить команду linux с помощью скрипта командной строки PHP, что без проблем с помощью команды exec.
Проблема в том, что команда, которую я выполняю (mysqldump) выводит сообщение об ошибке, если что-то не так (например, пользователь / пароль неверен). Кажется, я не могу зафиксировать эту ошибку, чтобы ее зарегистрировать. Он просто печатает эту ошибку на экране.
Как заставить эту ошибку не печатать на экране, а вместо этого поставить ее в переменную для использования в моем скрипте?
Благодаря!
Используйте popen для запуска процесса. Пример №2 на этой странице показывает, что именно вы ищете:
<?php error_reporting(E_ALL); /* Add redirection so we can get stderr. */ $handle = popen('/path/to/spooge 2>&1', 'r'); echo "'$handle'; " . gettype($handle) . "\n"; $read = fread($handle, 2096); echo $read; pclose($handle); ?>
exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log");
Вам нужно перенаправить stderr в stdout , чтобы вы могли его захватить. В этом примере трафик stdout на devnull (таким образом игнорируется) и маршрутизирует stderr к вам:
exec('ls * 2>&1 1>/dev/null');
Я не слишком горячий в Unix (New Years Resolution …), но эти функции выглядят полезными:
shell_exec
– возвращает результат как строку. passthru
– Похоже, вы можете выполнить это как: passthru('command', $result);
а затем использовать $result
. пытался использовать обратные сигналы?
$ var = `command`;
Следующее будет направлять сообщения stderr в том же месте, что и обычный выход.
exec("mysql_dump blah 2>&1",$output,$return_val) if($return_val !== 0) echo "there was an error"
2> & 1 означает перенаправление сообщений stderr на то же место, что и stdout, и, таким образом, будет загружаться в выходной массив.
Вы посмотрели на команду system () ? Прошло некоторое время с тех пор, как я сделал любой PHP, но это звонит.