PHP - 系統呼叫

你好,有志於成為程序員的各位!今天,我們將要深入探索 PHP 系統呼叫的精彩世界。如果你是編程新手,別擔心——我會一步步引導你了解每個概念,就像我這些年來對無數學生所做的一樣。讓我們一起踏上這段旅程!

PHP - System Calls

系統呼叫是什麼?

在我們進入 PHP 函數之前,先來了解一下什麼是系統呼叫。想像你在一間豪華餐廳(你的 PHP 腳本)裡,想要點一份特別的菜(執行一個系統命令)。你不能自己進廚房,對吧?你需要一個服務生(系統呼叫)把你的訂單傳達給廚師(作業系統)。這就是系統呼叫的作用——它讓你的 PHP 腳本能夠與作業系統進行溝通。

現在,讓我們來探討 PHP 為我們提供哪些方式來進行這些“訂單”!

system() 函數

system() 函數就像你的基本服務生。他接受你的訂單,把它帶到廚房,然後回來告訴你“是的,完成了”或“對不起,有問題”。

這樣使用它:

<?php
$output = system("ls -l");
echo "回傳值: $output";
?>

在這個例子中,我們請求系統列出當前目錄的內容(在類 Unix 系統上)。system() 函數會直接顯示輸出,並回傳輸出的最後一行。

shell_exec() 函數

現在,shell_exec() 就像一個更複雜的服務生。他不僅告訴你“完成了”,這個服務生還會把整個菜帶給你檢查。

<?php
$output = shell_exec("ls -l");
echo "<pre>$output</pre>";
?>

這個函數回傳命令的完整輸出作為一個字符串。我們使用 <pre> 標籤來保留輸出的格式。

exec() 函數

exec() 函數就像一個帶筆記本的服务生。他不僅把菜帶回來,還為你記下一些細節。

<?php
$output = array();
$return_var = 0;
exec("ls -l", $output, $return_var);
echo "回傳狀態: $return_var\n";
echo "輸出:\n";
print_r($output);
?>

這個函數將命令的每行輸出填充到 $output 數組中,並將 $return_var 設置為命令的回傳狀態。

passthru() 函數

passthru() 像是帶廚師到你桌邊的服務生。它直接輸出命令的原始結果。

<?php
passthru("ls -l");
?>

當你處理二進制數據,如圖像時,這特別有用。

反引號運算符

最後但同樣重要的是,我們有反引號運算符。它就像一個快速的的外賣訂單——簡單直接。

<?php
$output = `ls -l`;
echo "<pre>$output</pre>";
?>

它的工作原理與 shell_exec() 相同,但語法更簡潔。

系統呼叫方法比較

這裡是一個方便的表格,比較這些方法:

方法 輸出處理 回傳值 最適用於
system() 直接輸出 最後一行輸出 簡單命令,輸出最少
shell_exec() 回傳為字符串 完整輸出為字符串 带有多行输出的命令
exec() 存储在数组 最後一行輸出 詳細命令執行信息
passthru() 直接輸出 無(或錯誤代碼) 二進制數據輸出
反引號 回傳為字符串 完整輸出為字符串 快速、簡單命令

安全第一!

在我們結束之前,提醒一句:系統呼叫可能非常強大,但如果使用不慎,也可能會很危險。在使用系統呼叫之前,總是要驗證和清洗任何用戶輸入。這就像在上一道菜之前檢查過敏一樣——對安全至關重要!

<?php
$user_input = $_GET['command'];
$safe_input = escapeshellcmd($user_input);
$output = shell_exec($safe_input);
echo "<pre>$output</pre>";
?>

這個例子展示了如何使用 escapeshellcmd() 來讓用戶輸入對系統呼叫更安全。

結論

好了,各位!我們已經探討了 PHP 與作業系統溝通的各種方式。從簡單的 system() 到更複雜的 exec(),每種方法都有其自身的優勢和使用場景。

記住,就像烹飪一樣,熟能生巧。嘗試這些函數,嘗試不同的命令,很快你就能成為 PHP 系統呼叫的大師!

快樂編程,願你的腳本總是成功退出!

Credits: Image by storyset