【问题标题】:Unable to execute mysqldump from PHP script无法从 PHP 脚本执行 mysqldump
【发布时间】:2016-09-19 23:10:52
【问题描述】:

我正在尝试使用 mysqldumpexec() 函数为我的数据库创建定期备份(可怜的 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。工作正常。谢谢!

标签: php mysql apache exec


【解决方案1】:

上述问题的解决方案是,PHP 请求在 XAMPP 中以具有有限权限的用户身份执行,而 mysqldump 进程继承了这些权限。

检查exec()运行的进程的退出状态确认mysqldump以非零退出状态退出,表明它由于某种原因失败。

在 mysqldump 进程尝试写入的目录上打开 777 的写入权限解决了该错误。

找出 Apache 进程的特定 uid 和 gid 也应该足够了(检查 Apache 配置文件中的 UserGroup 配置值(例如 xampp-home/apache /conf/httpd.conf) 并使输出目录可由该 uid 或 gid 写入。

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2020-08-18
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多