簡體   English   中英

Apache下的PHP exec()在運行腳本時返回null和255

[英]PHP exec() under Apache returns null and 255 when running a script

好吧,經過幾個小時的討論,我決定尋求幫助。 我有一個運行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);

但是,沒有快樂。 而且我沒有想法。

有沒有好心靈可以幫助我呢?

謝謝一堆,

米格爾。

最后! 答案的關鍵在於: PHP exec()git fetch失敗,返回值為255

我無法看到任何錯誤,甚至將“2>&1”管道重定向添加到我的命令中。 閱讀完那篇文章后,我了解到proc_open()比exec()更好。 引用PHP的文檔:

proc_open()類似於popen(),但提供了對程序執行的更大程度的控制

因此,我將exec()替換為幾行代碼(請參閱手冊中的示例),並發現問題是由為CLI啟用的Zend Opcache引起的。 對我來說更快的解決方案是在命令行中禁用它:

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

瞧! 問題解決了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM