首頁 >後端開發 >PHP問題 >php exec無法執行怎麼辦

php exec無法執行怎麼辦

藏色散人
藏色散人原創
2022-11-22 10:16:144242瀏覽

php exec無法執行的解決方法:1、找到php設定檔php.ini,在檔案裡搜尋“disable_functions”,並把“exec”和“shell_exec”去掉;2、到伺服器修改檔案權限;3、修改配置中的安全模式為「safe_mode=On」。

php exec無法執行怎麼辦

本教學操作環境:Windows7系統、PHP8.1版、Dell G3電腦。

php exec無法執行怎麼辦?

PHP exec執行系統指令失敗原因分析

#問題背景:

##由於專案需求,需要將html頁面產生圖片,使用phantomjs(點擊了解)工具對頁面進行截圖,在cmd視窗下運行沒有任何問題。但在php中exec運行失敗,提示phantomjs不是內部指令。

問題解決:

在百度中找到各種解:

方案1:

#  1、修改php.ini

      找到php設定檔php.ini,如果是用星外php自動安裝程式設定php環境,這個檔案就在C:\WINDOWS\這個目錄裡。

      在檔案中搜尋“disable_functions”,找到它後把“exec”、“shell_exec”去掉,然後儲存檔案。

php exec無法執行怎麼辦

      2、修改cmd.exe檔案屬性

      進入C:\WINDOWS\system32,找到cmd.exe這個文件,右鍵->屬性,在「安全性」設定裡新增Internet 來賓帳戶,也就是IUSR_******那個帳戶,然後賦予「讀取與運行」、「讀取」的權限。

方案2:

有說是權限問題。

解決方案:

https://www.php.cn/php-weizijiaocheng-498092.html

#方案3:

#php的內建函數exec,system都可以呼叫系統指令(shell指令),當然還有passthru,escapeshellcmd等函數。

在很多時候利用php的exec,system等函式呼叫系統指令可以幫助我們更好、更快的完成工作。例如前二天筆者在批次處理.rar檔時exec就幫我了大忙了。

今天整理一下常用的呼叫系統函數發出來和大家分享經驗。

注意:要想使用這二個函數php.ini中的安全模式必須關閉,不然為了安全起見php是不讓呼叫系統指令的。

先看一下php手冊對這二個函數的解釋:

exec --- 執行外部程式###
语法 : string exec ( string command [, array &output [, int &return_var]] )
###說明:######exec( )執行給予的命令command,不過它並不會輸出任何東西,它簡單的從命令的結果中傳回最後一行,如果你需要去執行一個命令,並且從命令去取得所有資料時,可以使用passthru( )這個函數。 ######如果有給予參數array,則指定的陣列將會被指令所輸出的每一行填滿,注意: 如果陣列先前已經包含了一些元素的話,exec( )會將它附加在陣列的後面,如果你不想要此函數附加元素的話,你可以在傳遞此陣列給exec( )之前呼叫unset( )。 ######如果有給予參數array和return_var,則傳回執行的狀態指令將會寫到這個變數。 ######注意: 如果你允許來自使用者輸入的資料,可以傳遞到此函數,那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。 ######注意: 如果你使用此函數來啟動一個程序,而且希望在背景裡(background)執行的時候離開它,你必須確定此程序的輸出是轉向(redirected)到一個文件或是一些輸出的資料流,否則PHP將會懸掛(hang)直到程式執行結束。 ######system --- 執行外部程式並且顯示輸出###
语法 : string system ( string command [, int &return_var] )
###說明 :######system( )執行給予的命令command,並且輸出結果。如果有給予參數return_var,執行指令的狀態碼將會寫入這個變數。 ######注意: 如果你允許來自使用者輸入的資料,可以傳遞到此函數,那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。 ######注意: 如果你使用此函數來啟動一個程序,而且希望在背景裡(background)執行的時候離開它,你必須確定此程序的輸出是轉向(redirected)到一個文件或是一些輸出的資料流,否則PHP將會懸掛(hang)直到程式執行結束。 ######如果PHP是運作成伺服器模組,在輸出每一行後,system( )會試著自動清除web伺服器的輸出緩衝。 ######成功則傳回指令的最後一行,失敗則傳回false。 ######如果你需要去執行一個指令,並且從指令去取得所有資料時,可以使用passthru( )這個函數。 ###

这二个都是用来调用系统shell命令,

不同点:

exec可以把执行的结果全部返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败

systerm不需要提供$output函数,他是直接把结果返回出来,同样$return_var是执行的状态码 0为成功 1为失败

exec示例: 

以下为引用的内容:  

<?php  
$a = exec("dir",$out,$status);  
print_r($a);  
print_r($out);  
print_r($status);  
?>

system示例:

以下为引用的内容:  

<?php  
$a = system("dir",$out);  
print_r($a);  
print_r($out);  
?>

总结:

以上三个解决方案都是从百度搜索到的。

第一个解决方案我查看了配置,不存在这种情况,pass。

第二个解决方案由于需要改服务器权限,情况不允许,没试。

第三个解决方案参考了一下,修改了配置中的安全模式,safe_mode=On;然后问题迎刃而解。

OK,以上是我解决问题的过程。希望可以帮到广大像我一样的小白。

推荐学习:《PHP视频教程

以上是php exec無法執行怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn