好的,在我对此打了几个小时后,我决定寻求帮助。我有一个运行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);
但是,没有快乐。我没有想法。
任何善良的灵魂都可以帮助我吗?
非常感谢,
米格尔。
答案 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
瞧!问题解决了!