【发布时间】:2016-09-19 23:10:52
【问题描述】:
我正在尝试使用 mysqldump 和 exec() 函数为我的数据库创建定期备份(可怜的 cron)。我在 macOS 上使用 XAMPP/PHP7。
$command = "$mysqldump_location -u$db_user -h$db_host -p$db_password $db_name > $backup_file_location";
exec($command);
当我运行 PHP 脚本时,$backup_file_location 中提到的路径中没有 SQL 转储,但如果我直接在终端上执行相同的 $command 字符串,我会在所需位置获得所需的 SQL 文件。
我无法理解这里可能出现的问题。也欢迎有关转储整个数据库的更好方法的建议。
编辑 1:
$mysqldump_location 的值为/Applications/XAMPP/xamppfiles/bin/mysqldump
$backup_file_location 的值为/Applications/XAMPP/xamppfiles/htdocs/app5/data/sqldumps/sql_data.sql
/app5/ 是我开发应用程序时所在的文件夹。
编辑 2: 可能的重复建议不适用,因为这里的问题不在于如何转储 SQL 备份。这里的关键问题是使用 mysqldump 的备份是通过终端进行的,而不是通过 PHP 的 exec() 函数。
【问题讨论】:
-
向我们展示所有这些变量的值,或者至少是
$backup_file_location -
您的网页是否以对 sqldumps 目录没有写入权限的用户身份在 XAMPP 中执行?您可以使用exec() 的可选第二个和第三个参数来捕获命令的输出和退出状态。
-
这是 PHP 的
exec()的一个缺点:很难捕获 stderr 输出,这可能是您解决此错误所需要的。一种解决方法是编写一个运行备份的 shell 脚本和exec()你的 shell 脚本。然后你有更多机会在 shell 脚本中处理 stderr 输出,记录它或其他什么。 -
更多使用
exec()处理stderr的技巧:stackoverflow.com/questions/2320608/php-stderr-after-exec -
@BillKarwin 实际上问题似乎出在写权限上。刚刚尝试使用 777。工作正常。谢谢!