shell_exec () не возвращает ошибку, когда mysqldump не может создать файл

Я хочу сделать резервную копию всей базы данных, прежде чем php-скрипт будет играть с ее таблицами, поэтому я подумал об использовании mysqldump.

Я попытался запустить команду mysqldump с помощью shell_exec() и проверить, удалось ли это сделать следующим образом:

$command = 'mysqldump -u username -ppassword database > /path/database.sql';
$result = shell_exec($command);

if(!is_null($result)) {
  echo 'Error during backup';
else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}

Но я заметил, что $result всегда равен нулю, даже когда я указываю путь, по которому файл не может быть записан (нет существующего каталога или что-то, что должно возвращать разрешение, отклоненное в приглашении оболочки).

Что мне не хватает?


person Iam Zesh    schedule 14.02.2013    source источник


Ответы (3)


Это сработало для меня:

$command = 'mysqldump -u username -ppassword database > /path/database.sql';
system($command, $output);

if($output != 0) {
  echo 'Error during backup';
else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}
person Iam Zesh    schedule 20.02.2013
comment
Стоит отметить, что второй аргумент system() - это не результат скрипта, а возвращаемое значение. Помимо имен, ваш код в порядке, но я подумал, что должен уточнить это, чтобы избежать путаницы для будущих читателей. - person Álvaro González; 20.02.2013
comment
Привет. У вас есть синтаксическая ошибка в строке 6 (отсутствует скобка). - person Tegos; 26.09.2017

Из руководства:

Возвращаемые значения
Вывод выполненной команды или NULL, если произошла ошибка

Однако вы перенаправляете вывод скрипта в файл:

mysqldump -u username -ppassword database > /path/database.sql
                                          ^^^^^^^^^^^^^^^^^^^^

Возможно (я действительно не знаю), что mysqldump генерирует стандартные коды возврата (где 0 означает OK, а все остальное означает error). В этом случае вам следует использовать этот механизм, хотя вам потребуется другая функция PHP.:

string exec ( string $command [, array &$output [, int &$return_var ]] )
                                                   ^^^^^^^^^^^^^^^^
person Álvaro González    schedule 14.02.2013
comment
Спасибо за Ваш ответ. Я не думал, что перенаправление вывода скрипта может быть источником проблемы. Я пробовал с exec, но $ output был каким-то непоследовательным и ненадежным, и stackoverflow.com/a/10828773 сориентировал меня на system (). - person Iam Zesh; 20.02.2013
comment
@IamZesh - Обратите внимание, я выделил $return_var, а не $output. И, конечно же, будет ли это работать, зависит от того, генерирует ли mysqldump стандартные возвращаемые значения. Я вижу из вашего ответа, что это так. - person Álvaro González; 20.02.2013

Вы должны удалить все пробелы между -u и -p, а переменные также использовать "exec()"

$command = "mysqldump -u$username -p$password database > /home/yourusername/public_html/database.sql";
exec($command,$result, $output);

if($output != 0) {
  echo 'Error during backup';
}else {
  echo 'Database saved';
  // rest of the php script to modify the database (create/drop tables etc)
}
person Mohammad H.    schedule 30.06.2014