Apache下的PHP exec()在运行脚本

时间:2017-09-04 21:16:03

标签: php windows apache exec

好的,在我对此打了几个小时后,我决定寻求帮助。我有一个运行Apache 2.4和PHP 7.1的Windows Server 2008。当用户单击浏览器上的按钮时,我的应用程序必须在服务器上运行PHP脚本。

这在使用Windows 10的桌面上运行正常。但是,在服务器上,exec()返回“null”并退出代码为255.

我在exec()问题上阅读了所有可以找到的内容并尝试了以下内容:

exec("C:\\PHP7\\php.exe -v", $output);

我收到了包含PHP版本信息的正确回复。

然后我决定检查配置文件:

exec("C:\\PHP7\\php.exe --ini", $output);

所有文件都已到位。

然后我决定对我的脚本执行语法检查:

exec("C:\\PHP7\\php.exe -d display_errors=1 -l C:\\Apache24\\htdocs\\script.php", $output);

未发现错误。

最后我决定查看用户帐户:

exec("whoami", $output);

按预期获得“NT Authority \ SYSTEM”。为了确保脚本能够在SYSTEM帐户下运行,我使用了SysInternals psexec:

psexec -s C:\PHP7\php.exe C:\Apache24\htdocs\script.php

一切顺利。

换句话说,在用户帐户或系统帐户下从命令行执行时,脚本不会显示任何问题。我还证明了exec()正确调用了PHP。

那么,我决定在我的代码中检查“隐藏”错误,在脚本的最开头添加以下两行:

error_reporting(E_ALL);
ini_set('display_errors', 1);

但是,没有快乐。我没有想法。

任何善良的灵魂都可以帮助我吗?

非常感谢,

米格尔。

1 个答案:

答案 0 :(得分:0)

最后!答案的关键在于:PHP exec() git fetch failing with return value 255

我无法看到任何错误,甚至将“2>& 1”管道重定向添加到我的命令中。阅读完那篇文章后,我了解到proc_open()比exec()更好。引用PHP的文档:

  

proc_open()类似于popen(),但对程序执行提供了更大程度的控制

所以,我用几行代码替换了我的exec()(请参阅手册中的示例),发现问题是由为CLI启用的Zend Opcache引起的。对我来说更快的解决方案是在命令行中禁用它:

php.exe -d opcache.enable_cli=0 myscript.php

瞧!问题解决了!