mysqldump генерирует пустой файл с помощью PHP system()

#php #system #mysqldump

#php #система #mysql

Вопрос:

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

Я пытаюсь использовать mysqldump via system() с помощью этой команды:

 $backup_path = $_SERVER['DOCUMENT_ROOT'] . '/website/acp/backup/';
$backup_name = $backup_path . $dbname . '.backup.' . date('l.dS.F.Y.g.iA') . '.sql';

$command = 'mysqldump ' . $dbname . ' -u ' . $dbuser . ' -p' . $dbpasswd . ' > ' . $backup_name;

system($command, $returned);

print_r($returned); 
  

$returned выводит, 127 и пустой файл размером в ноль КБ находится в папке резервного копирования, теперь, когда я выполняю echo $command и затем ввожу его в терминал, он работает отлично и генерирует полную резервную копию базы данных. Это та часть, которую я не понимаю, почему она плохо работает в system() вызове, но в терминале она работает просто отлично?

Комментарии:

1. Имеет ли указанная учетная запись пользователя требуемые привилегии «file»?

Ответ №1:

Это потому, что при запуске mysqldump от вас требуется ввести пароль, даже если вы указываете его с помощью -p

Это должно быть полезно :http://www.techiecorner.com/1619/how-to-setup-mysqldump-without-password-in-cronjob /

Ответ №2:

Ваша проблема вполне может заключаться в том, что у вас нет разрешения на запись в каталог резервных копий.

Если вы запустите код:

 $backup_path = $_SERVER['DOCUMENT_ROOT'] . '/website/acp/backup/';
file_put_contents("{$backup_path}test-file.txt", "test data");
  

Появляется ли файл в каталоге резервной копии?

Если нет, вам нужно изменить разрешения каталога, чтобы пользователь веб-сервера мог записывать в него. chmod 777 это простое решение, но оно оставляет права доступа широко открытыми.

Ответ №3:

Я должен не согласиться с ответом Андрея выше.

Следующее работает на ряде компаний с общим хостингом:

 $command = 'mysqldump --opt --host='.$host.' --user='.$mysql_username.' --password=''.$mysql_password.'' '.$dbname.' > ''.$filename.''';
exec($command);
  

Будьте осторожны, если где-либо в ваших аргументах (имена файлов, пароли и т.д.) есть пробелы, которые вы используете в кавычках. В PHP вам может потребоваться использовать обратные косые черты, как я сделал выше, при цитировании. Обычно предшествующие или завершающие пробелы — плохая идея, но я столкнулся с клиентом, где это оказалось причиной пустого файла mysqldump размером 0 байт. Цитирование исправило проблему. Вам также может потребоваться экранировать аргументы в командной строке.

Следующие две строки сильно отличаются:

 -password='password  ' db_name > 'my file.sql'
-password=password   db_name > my file.sql
  

Обратите внимание, что во втором файле также есть два пробела в конце пароля, но даже HTML может игнорировать это.

Вероятно, я должен упомянуть для новичков … убедитесь, что вы можете вручную подключиться к настройкам, прежде чем искать причины, по которым это не работает, например — убедитесь, что хост указан правильно, например localhost или yourdb.website.com — убедитесь, что имя пользователя и пароль работают