我有一个在终端中工作的脚本字符串,但是当我在PHP中使用shell_exec()时它不起作用。我知道很多类似于这个问题的问题已经被提出但是在我的情况下问题我面临的是我已经尝试过我发现的建议解决方案。下面是我的简单代码。
<?php
$output = shell_exec('mysql -u root -pmypass -h 127.0.0.1 mydatabase< db.sql');
echo "<pre>$output</pre>";
?>
到目前为止,我找到了the best solution。
有谁知道可能出错了什么?
答案 0 :(得分:2)
您的shell_exec
就是这样:
$output = shell_exec('mysql -u root -pmypass -h 127.0.0.1 mydatabase< db.sql');
你的命令是这样的:
mysql -u root -pmypass -h 127.0.0.1 mydatabase< db.sql
当您在shell中时命令有效的原因是mysql
的二进制路径是您的用户登录配置文件的一部分。
要了解我的意思,请自行登录shell,然后键入echo $PATH
,您将看到的是shell用于确定您尝试运行的二进制文件所在位置的搜索路径列表。
但是当您尝试通过shell_exec()
运行脚本时,运行PHP的Apache服务器用户正在进行销售呼叫。并且该用户通常没有设置二进制路径。因此,您需要提供mysql
的完整路径,该路径可能是:
/usr/bin/mysql
或者:
/usr/local/bin/mysql
最好的解决方案是从shell使用which
命令,如下所示:
which mysql
然后按照提供的完整路径调整shell_exec()
命令,如下所示;使用/usr/bin/
例如:
$output = shell_exec('/usr/bin/mysql -u root -pmypass -h 127.0.0.1 mydatabase < db.sql');
此外,db.sql
实际位于何处?您还必须在此前面添加MySQL脚本的完整路径;使用/full/path/to/this/
例如:
$output = shell_exec('/usr/bin/mysql -u root -pmypass -h 127.0.0.1 my database < /full/path/to/this/db.sql');