(貌似)无论我尝试使用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
脚本位于同一目录中。
我几乎要在我的智慧结束时试图找出错误的原因。什么可能导致这个问题?
答案 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中。