php exec无法按预期工作

时间:2012-04-12 04:24:27

标签: php ubuntu exec lamp mysqldump

我的系统:Ubuntu 11.10,LAMP Stack。

问题:

我在终端中运行以下命令并正确备份。

mysqldump -u root  dbBugTracker > BAK/dbw.sql

但是我将它包含在我的PHP代码中,如下所示,它不起作用。

exec('/usr/bin/mysqldump -u root  dbTracker > BAK/dbT.sql');

提示:

  • 我尝试在exec中添加第二个参数,但除了单词Array之外没有显示任何内容。我打印出来但没有任何内容。
  • 文件dbw.sql实际上是作为exec函数的结果创建的,但它是0字节。
  • 我尝试使用完整路径而没有使用mysql,并且看到了相同的结果。即0字节。
  • BAK 文件夹位于我的项目文件夹中,我甚至给了它777的权限。
  • 甚至尝试了不同的文件名和数据库,但结果是一样的。

我很感激对此的任何意见。谢谢!

更多信息: 我将 2>& 1 添加到exec行,现在该文件包含一些文本但不包含数据库转储。这是一个错误,我不知道如何处理这个:( 这是错误

  

mysqldump:收到错误:1045:尝试连接时,用户“root”@“localhost”(使用密码:NO)拒绝访问   所以这就是输出文件(dbw.sql)现在包含的内容。   再一次,当我从终端运行转储时,它工作正常。

3 个答案:

答案 0 :(得分:3)

您在命令行上以不同的用户身份运行该dump命令。使用exec()时,您正在以Apache(我假设)运行它。尝试在exec命令中添加password参数,或者在db中使用适当的权限创建特定于php的用户。

UPDATE ::正如我猜测的那样,在使用PHP执行此转储时,您无法使用root用户。所以,创建一个新用户。

首先,从命令行登录您的数据库。如果您是root用户,请不要使用-u root:

mysql

现在您已登录,请继续为Apache创建一个新用户:

GRANT ALL ON database_name.* TO yourapacheuser@localhost IDENTIFIED BY 'yourpassword';

继续注销mysql:

exit

接下来,让我们重新处理您的原始代码...

$db_user = 'newusername';
$db_pass = 'pass';

$command = "mysqldump --add-drop-table -u $db_user -p$db_pass database_name > backup.file.sql";
$output = `$command`;
echo "Your database has now been backed up.";

现在,要执行该文件,请从命令行运行:

php path/to/sqldumpfile.php

希望你能适应这个伪代码。祝你好运!

答案 1 :(得分:0)

你如何打印? 像这样调试:

<?php

exec('/usr/bin/mysqldump -u root  dbTracker > BAK/dbT.sql', $output);

var_dump($output);

答案 2 :(得分:0)

首先,您应该在命令行上运行它。在使用PHP的exec()之前验证这是否产生了所需的结果:

/usr/bin/mysqldump -u root -p YOUR_PASSWORD dbTracker > BAK/dbT.sql

如果它可以工作,那么在PHP配置的某个地方就会出现问题。

要检查的第一件事是safe_mode。你在使用safe_mode吗?你在运行什么版本的PHP?

另一种可能是您的PHP用户无权使用mysqldump二进制文件。