PHP偽協議(Pseudo-Protocols)

cy_b發表於2024-08-27

介紹

在PHP中,"偽協議" 是一種特殊的協議,它並不涉及傳統的網路傳輸,而是用於訪問特定的PHP功能或資源。這些偽協議通常以 php:// 開頭,並用於運算元據流、記憶體、程序的輸入輸出等。

常見的PHP偽協議

php://input: 只讀流,用於讀取原始的POST資料。可以多次讀取並返回相同的內容。

$data = file_get_contents('php://input');

php://output: 可寫流,用於向輸出緩衝區寫入資料。通常用於直接輸出內容到瀏覽器。

$output = fopen('php://output', 'w');
fwrite($output, "Hello World");
fclose($output);

php://memory: 使用記憶體作為臨時檔案進行讀寫操作的流。在記憶體中儲存資料,關閉流後資料將丟失。
php://temp: 類似於php://memory,但超過一定大小(預設2MB)後,資料將自動儲存到磁碟的臨時檔案中。

$stream = fopen('php://memory', 'w+');
fwrite($stream, 'Some data');
rewind($stream); // 使檔案位置指標重新定位到檔案的開始位置
echo stream_get_contents($stream);
fclose($stream);

php://stdin: 只讀流,允許訪問PHP程序的標準輸入。適用於從命令列或其他輸入源讀取資料。

$input = fgets(fopen('php://stdin', 'r')); // 讀取一行
$input = file_get_contents('php://stdin'); // 讀取整個輸入

// 命令列互動獲取姓名
echo "Please enter your name: ";
$name = trim(fgets(fopen('php://stdin', 'r')));
echo "Hello, $name!\n";

php://stdout: 可寫流,允許訪問PHP程序的標準輸出。適用於命令列或其他輸出目標寫入資料。 輸出資料到命令列或者將輸出資料重定向到檔案或其他程序。

fwrite(fopen('php://stdout', 'w'), "This message is displayed in the terminal.\n");

php://stderr: 可寫流,允許訪問PHP程序的標準錯誤輸出。適用於向命令列或其他錯誤流目標寫入錯誤訊息。輸出錯誤或警告資訊,以便與標準輸出區分開來。

fwrite(fopen('php://stderr', 'w'), "This is an error message.\n");

其他常見的PHP封裝協議

file:// — 訪問本地檔案系統
允許讀取和寫入本地檔案系統的檔案。使用file://可以開啟和操作檔案,就像在檔案路徑前面加上file://一樣。
fopen('file:///path/to/file.txt', 'r');

http:// 和 https:// — 訪問HTTP(S) URLs
用於透過HTTP或HTTPS協議從遠端伺服器讀取資料,類似於瀏覽器訪問網頁的方式。可以使用它來執行GET、POST請求等。
fopen('http://example.com', 'r');

ftp:// 和 ftps:// — 訪問FTP(S) URLs
用於透過FTP協議從遠端伺服器上傳或下載檔案。支援匿名訪問和帶有使用者名稱密碼的認證。
fopen('ftp://user:password@ftp.example.com/file.txt', 'r');

zlib:// — 壓縮流
提供對gzip壓縮檔案的讀寫操作。常用於處理壓縮資料。
fopen('compress.zlib://example.gz', 'r');

data:// — 資料(基於RFC 2397)
允許內聯資料作為檔案資源來使用。data://協議通常用於處理base64編碼的資料。
fopen('data://text/plain;base64,SGVsbG8gd29ybGQ=', 'r');

glob:// — 查詢匹配的檔案路徑模式
用於根據指定的檔案模式查詢匹配的檔案路徑。類似於Linux的glob命令。
foreach (glob('glob://*.txt') as $filename) { echo $filename; }

phar:// — PHP歸檔
用於訪問PHP歸檔檔案(PHAR檔案)中的內容。支援類似於ZIP的壓縮檔案結構。有些SDK使用該協議來打包和分發程式碼。
fopen('phar://archive.phar/file.txt', 'r');

ssh2:// — Secure Shell 2
提供透過SSH協議訪問遠端伺服器的能力。適用於透過SSH傳輸檔案或執行命令。
fopen('ssh2://username@hostname/path/to/file.txt', 'r');

rar:// — RAR
用於訪問RAR壓縮檔案中的內容。適合處理RAR壓縮包的檔案提取。
fopen('rar://archive.rar/file.txt', 'r');

ogg:// — 音訊流
用於讀取Ogg格式的音訊流。通常在音訊處理應用中使用。
fopen('ogg://stream.ogg', 'r');

expect:// — 處理互動式的流
用於處理互動式命令列操作。可以在PHP指令碼中控制和操作互動式命令。
fopen('expect://command', 'r');

相關文章