从PHP脚本运行mysqldump不起作用,但适用于SSH

时间:2011-12-17 19:13:30

标签: php mysql

我正试图通过PHP脚本使用这一个简单的行来支持数据库:

passthru("/usr/bin/mysqldump --opt --host=localhost --user=\"myuser\" --password=\"mypass\" db_name > /var/www/vhosts/mydomain.com/httpdocs/tools/dbbackup-2011-12-17.sql");

我没有任何错误或警告或任何东西。但是,如果我复制该字符串并通过SSH完全按照服务器上的方式执行它,那就完美了。

/usr/bin/mysqldump --opt --host=localhost --user="myuser" --password="mypass" db_name > /var/www/vhosts/mydomain.com/httpdocs/tools/dbbackup-2011-12-17.sql

我尝试使用exec()和system()代替passthru()但结果相同。这真的很奇怪,我无法解决可能出现的问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

有根据的猜测

如果我能做出有根据的猜测,那是因为运行php脚本的用户(即运行httpd的用户)没有写入/var/www/vhosts/mydomain.com/httpdocs/tools/的权限。

虽然您用来执行命令的用户有。


STDERRSTDOUT

要查看与STDERR打印的问题是否与问题相关,请使用以下代码段!

$tubes = array(
  0 => array("pipe", "r"),
  // print contents on STDOUT to file
  1 => array("file", "/var/www/vhosts/mydomain.com/httpdocs/tools/dbbackup-2011-12-17.sql", "w"),
  2 => array("pipe", "w")
);

$p_handle = proc_open (
  "/usr/bin/mysqldump --opt --host=localhost --user=\"myuser\" --password=\"mypass\" db_name",
  $tubes, $pipes
);

if (is_resource ($p_handle)) {
    fclose ($pipes[0]);

    $stderr_data = stream_get_contents ($pipes[2]); fclose($pipes[2]);

    $proc_ret    = proc_close ($p_handle);

    echo "--------- STDERR:\n$stderr_data\n";
    echo "------------ RET: $proc_ret\n";
} else {
  die ("Unable to execute external resource, aborting!");
}

检查日志文件!

您是否检查过与error_log相关联的httpd