【问题标题】:shell_exec() not returning error when mysqldump cannot create file当 mysqldump 无法创建文件时,shell_exec() 不返回错误
【发布时间】:2013-01-30 03:33:09
【问题描述】:

我想在使用 php 脚本处理其表之前备份完整的数据库,所以我考虑使用 mysqldump。

我尝试使用 shell_exec() 运行 mysqldump 命令并检查它是否成功:

$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 始终为空,即使我给出了无法写入文件的路径(没有现有目录,或者应该在 shell 提示符下返回权限被拒绝的东西)。

我错过了什么?

【问题讨论】:

    标签: php mysqldump shell-exec


    【解决方案1】:

    这对我有用:

    $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)
    }
    

    【讨论】:

    • 值得注意的是system()的第二个参数不是脚本输出,而是返回值。撇开名字不谈,你的代码很好,但我想我应该澄清一下,以免给未来的读者造成混淆。
    • 嗨。第 6 行有语法错误(缺少括号)。
    【解决方案2】:

    来自the manual

    返回值
    执行命令的输出,如果发生错误则为 NULL

    但是,您将脚本的输出重定向到文件:

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

    mysqldump 有可能(我真的不知道)生成标准返回码(其中0 表示OK,其他任何表示error)。如果是这种情况,您应该使用该机制,尽管您需要a different PHP function

    string exec ( string $command [, array &$output [, int &$return_var ]] )
                                                       ^^^^^^^^^^^^^^^^
    

    【讨论】:

    • 感谢您的回答。我没想到重定向脚本的输出可能是问题的根源。我尝试使用 exec,但 $output 不知何故不一致且不可靠,stackoverflow.com/a/10828773 将我定向到 system()。
    • @IamZesh - 请注意我突出显示了$return_var,而不是$output。当然,这是否可行取决于 mysqldump 是否生成标准返回值。我从你的回答中看出确实如此。
    【解决方案3】:

    您应该删除 -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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2021-07-06
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多