#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 — убедитесь, что имя пользователя и пароль работают