PHP伪协议(PHP://、Pseudo-Protocols)和其他常用协议
介绍
在PHP中,"伪协议" 是一种特殊的协议,它并不涉及传统的网络传输,而是用于访问特定的PHP功能或资源。这些伪协议通常以 php://
开头,并用于操作数据流、内存、进程的输入输出等。
常见的PHP伪协议
input、output
php://input: 只读流,用于读取原始的POST数据。可以多次读取并返回相同的内容。
$data = file_get_contents('php://input');
php://output: 可写流,用于向输出缓冲区写入数据。通常用于直接输出内容到浏览器。
$output = fopen('php://output', 'w');
fwrite($output, "Hello World");
fclose($output);
memory、temp
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);
stdin、stdout、stderr
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");
proc_open配合标准输入输出,执行简单shell命令
这段代码中,$descriptorspec对应的数组就分别打开了stdin,stdout,stderr。在执行command命令时,可与终端交互。
// 要执行的命令
$command = "ls -l";
// 指定要打开的管道和文件句柄
$descriptorspec = array(
0 => array("pipe", "r"), // stdin 标准输入,子进程从此管道读取数据
1 => array("pipe", "w"), // stdout 标准输出,子进程向此管道写入数据
2 => array("pipe", "w"), // stderr 标准错误,子进程向此管道写入错误信息
);
// 用于接收打开的管道句柄
$pipes = array();
// 打开子进程
$process = proc_open($command, $descriptorspec, $pipes);
// 检查子进程是否打开成功
if ($process === false) {
echo "Error opening process";
exit;
}
// 关闭标准输入管道
fclose($pipes[0]);
// 读取标准输出管道的内容
$output = stream_get_contents($pipes[1]);
// 关闭标准输出管道
fclose($pipes[1]);
// 获取子进程的退出代码
$return_value = proc_close($process);
// 输出标准输出的内容
echo "Output: $output";
// 输出子进程的退出代码
echo "Return value: $return_value";
其他常见的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');