[英]php exec mysql command - different version
在过去的两天里,我一直在弄弄这个,但仍在设法弄清楚……
作为较大脚本的一部分,我尝试在php文件中运行以下命令:
$export = exec("/usr/bin/mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products > /path/to/www/directory/sync/products.sql");
该命令不起作用,如果我添加并回显$result_var
, $result_var
得到127而不是0,因此显然存在一些错误。 经过研究,我设法提出了一个稍有不同的命令,它的工作原理很好:
$export = exec('mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products -r "/path/to/www/directory/sync/products.sql"');
我的第一个问题 -有什么区别? 为什么第一种选择不起作用? 也许值得一提:在mysqldump
上使用path没什么区别。 我做了which mysqldump
和第一个命令中的路径是正确的。
我的第二个问题 -我正在尝试运行以下命令将表导入到数据库中:
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
但这不起作用,什么也没发生。 如果我在命令行中运行它,它只会抛出帮助文本,就好像我运行了mysql -?
我在这里想念什么? 我还需要向mysql命令添加其他任何参数(选项)吗? 而且,如果是这样,发生了什么变化? 这段代码在另一台服务器上运行得很好。
我可以立即解决-r问题。 -r问题也很可能与您的第二个问题直接相关。
mysqldump上的-r开关是--result-file的缩写。 此开关执行两项基本操作:
因此,这不是一个确切的解决方案,但可能会帮助您朝正确的方向看:检查转储文件,看是否存在问题。
编辑
如果您的源数据库中有utf-8,则可能是字符编码问题。
首先检查centos机器的字符集
cat /etc/sysconfig/i18n
看看是否是utf-8。 如果不是,那可能就是为什么需要-r的原因。
然后测试您的两个数据库,看看它们的字符集是什么
select schema_name as 'database', default_character_set_name as 'charset', default_collation_name as 'default_collation' from information_schema.schemata;
如果您的源数据库是utf-8,而目标数据库不是,则这可以解释为什么插入无效。 您可以尝试将其添加到导入mysql调用中:
--default-character-set=utf-8
但是,如果未将mysql设置为处理utf-8,则可能会导致一组单独的错误
再次回答我自己的问题...
我的问题是由php safe_mode引起的-在禁用safe_mode并为用户启用了正常的shell访问之后,现在一切正常。
此外,还有一个小细节mysql
命令使用-p
后需要密码且没有空格。 换一种说法,
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
不是有效的命令,并且-p
必须跟密码,且不能带空格。 有效命令为:
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -pMY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
我希望这可以帮助别人...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.