PHP系统调用总是失败

时间:2014-08-18 17:11:58

标签: php shell cmd

(貌似)无论我尝试使用PHP的system函数运行什么命令,该命令始终不执行任何操作,然后以退出代码1失败。例如,

system("echo 'this should definitely work'", $retval);

设置$retval = 1

也是如此
system("dir", $retval);

以及运行我写过的可执行文件;我跑的时候

vfmt -h cat.v

cmd.exe命令工作并返回退出代码0,但正在运行

system("vfmt -h cat.v", $retval);

再次设置$retval = 1。此vfmt.exe文件与尝试进行这些src.php调用的system脚本位于同一目录中。

我几乎要在我的智慧结束时试图找出错误的原因。什么可能导致这个问题?

4 个答案:

答案 0 :(得分:2)

您应该检查php.ini行,如下所示:

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
                   ^^^^          ^^^^^^^^^^^^^^^^^^

等。

同时检查您的安全模式" status,(php ver。< 5.4)如果你启用它,你只能执行safe_mode_exec_dir内的文件等等......

更多信息in the doc以及执行命令here,尤其是系统here

答案 1 :(得分:1)

echo总是一个shell内部命令,而不是一个单独的可执行文件。你需要更像

的东西
system('/bin/sh -c "echo \'foo\'"'); // unix-ish
system('cmd.exe /c echo foo'); // windoze

答案 2 :(得分:1)

最有可能的问题是“工作目录”不是您所期望的。

当你检查返回值而不是屏幕输出时,这是隐藏的;他们是不同的。

首先,要监控:尝试使用exec http://au2.php.net/manual/en/function.exec.php,因为这样可以通过提供屏幕输出和返回值来帮助您进行调试。

其次,要修复:

1 - 指定可执行文件和包含文件的完整路径。假设这是Windows(您指的是cmd.exe),那么运行

system("c:\PathToPhpFile\vfmt -h c:\PathToCatVFile\cat.v, $retval);

2 - 首先使用system()来调用exec()chdir()之前更改工作目录。

(或者您可以在批处理文件(Windows)中执行cd或在Linux中连接命令;但这样的可移植性较差。)

答案 3 :(得分:1)

您需要使用system()重定向正在运行的命令的输出,以便它在后台运行。否则,PHP将等待程序执行结束,然后继续。

system('mycommand.exe > output.log', $retval);
system('mycommand.exe 2>&1', $retval);

不确定您是如何调用脚本的,但也许您遇到了PHP max_execution_time(或相关)限制。需要调查的东西。此外,由于您在Windows上运行,因此在执行系统调用时可能需要对命令使用绝对路径,因为您调用的文件可能不在任何已定义的PATH中。