在不少時候利用php的exec,system等函數調用系統命令能夠幫助咱們更好更快的完成工做。好比前二天筆者在批量處理.rar文件時exec就幫我了大忙了。 php
今天整理一下經常使用的調用系統函數發出來和你們分享經驗。 html
注意:要想使用這二個函數php.ini中的安全模式必須關閉,要否則爲了安全起見php是不讓調用系統命令的。 linux
先看一下php手冊對這二個函數的解釋: web
exec --- 執行外部程式 shell
語法 : string exec ( string command [, array &output [, int &return_var]] ) 數組
exec函數解析 瀏覽器
exec語法: string exec(string command, string [array], int [return_var]); 安全
exec返回值: 字符串 函數
Exec參數說明 網站
Command – 須要執行的命令
Array – 是輸出值
return_var –是返回值0或1,若是返回0則執行成功,返回1則執行失敗。
exec不成功,調試方案
一個技巧就是使用管道命令, 使用 2>&1, 命令就會輸出shell執行時的錯誤到$output變量, 輸出該變量便可分析。
如:
exec('convert a.jpg b.jpg', $output, $return_val);
改成:
exec('convert a.jpg b.jpg 2>&1', $output, $return_val);
print_r($output);
說明 :
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);
?>
<?php $a = exec("dir",$out,$status); print_r($a); echo "<br>-----------------------------------------------------<br>"; echo "<pre>"; //print_r($out); var_dump($out); echo "</pre>"; echo "<br>-----------------------------------------------------<br>"; print_r($status); ?>
system示例:
<?php
$a = system("dir",$out);
print_r($a);
print_r($out);
?>
<?php $a = system("dir",$out); echo "<pre>"; //print_r($a); var_dump($a); echo "</pre>"; echo "<br>-----------------------------------------------------<br>"; print_r($out); ?>
你們能夠運行一下看效果
在php開發網站中,常常須要執行系統外部命令。php提供4種方法執行系統外部命令:exec()、passthru()、system()、 shell_exec()。下面一一介紹。在開始前,先檢查下php配置文件php.ini中是有禁止這是個函數。找到 disable_functions,配置以下:
disable_functions =
若是「disable_functions=」後面有接上面四個函數,將其刪除。默認php.ini配置文件中是不由止你調用執行外部命令的函數的。
方法一:exec()
function exec(string $command,array[optional] $output,int[optional] $return_value)
php代碼:
<?php
echo exec("ls",$file);
echo "</br>";
print_r($file);
?>
執行結果:
test.php
Array( [0] => index.php [1] => test.php)
知識點:
exec 執行系統外部命令時不會輸出結果,而是返回結果的最後一行,若是你想獲得結果你可使用第二個參數,讓其輸出到指定的數組,此數組一個記錄表明輸出的一 行,即若是輸出結果有20行,則這個數組就有20條記錄,因此若是你須要反覆輸出調用不一樣系統外部命令的結果,你最好在輸出每一條系統外部命令結果時清空 這個數組,以防混亂。第三個參數用來取得命令執行的狀態碼,一般執行成功都是返回0。
方法二:passthru()
function passthru(string $command,int[optional] $return_value)
代碼:
<?php
passthru("ls");
?>
執行結果:
index.phptest.php
知識點:
passthru與system的區別,passthru直接將結果輸出到瀏覽器,不須要使用 echo 或 return 來查看結果,不返回任何值,且其能夠輸出二進制,好比圖像數據。
方法三:system()
function system(string $command,int[optional] $return_value)
代碼:
<?php
system("ls /");
?>
執行結果:
binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
知識點:
system和exec的區別在於system在執行系統外部命令時,直接將結果輸出到遊覽器,不須要使用 echo 或 return 來查看結果,若是執行命令成功則返回true,不然返回false。第二個參數與exec第三個參數含義同樣。
方法四:反撇號`和shell_exec()
shell_exec() 函數實際上僅是反撇號 (`) 操做符的變體
代碼:
<?php
echo `pwd`;
?>
執行結果:
/var/www/html