文章目录
一、封转器
- 在 PHP 中,封装器可以处理⽂件系统、⽹络资源、压缩数据等各种数据源。
二、数据流封装器
1.data://:
- 数据流封装器(stream wrapper)是⽤于操作不同种类资源的⼀个接⼝。
2.如何理解上句话呢?
3.从data://协议格式去理解数据流封装器
📚 data:[<mime type>][;charset=<charset>][;base64],<encoded data>
data://text/plain;base64,
data:资源类型;编码,内容
- 第⼀部分是 data : 协议头,它标识这个内容为⼀个 data URI 资源。
- 第⼆部分是 MIME 类型,表⽰这串内容的展现⽅式,⽐如:text/plain,则以⽂本类型展⽰, image/jpeg,以 jpeg 图⽚形式展⽰,同样,客⼾端也会以这个 MIME 类型来解析数据。
- 第三部分是编码设置,默认编码是 charset=US-ASCII
- 第四部分是 base64编码设定,这是⼀个可选项
1. 数据流
输⼊流:如下图红⾊⽅框所⽰
2. 封转器
结合上图给出的输入流来进行理解,封装器是一种特殊程序,它用于处理输入流,例如在下面的代码示例中,封装器负责解析输入流(如果输入的不是PHP代码,封装器的作用将是输出数据流)。
<?php
// 获取用户输入的 data URL
$dataUrl = isset($_GET['file']) ? $_GET['file'] : '';
// 检查是否提供了 data URL
if ($dataUrl) {
// 检查是否是一个有效的 data URL
if (strpos($dataUrl, 'data://text/plain') === 0) {
// 使用 include 函数执行 data URL 中的 PHP 代码
include($dataUrl);
} else {
echo "无效的 data URL。";
}
} else {
echo "请提供 data URL。";
}
?>
元封装器
1. php://filter
-
设计用于数据流打开时的筛选过滤,作用是作为一个“中间流”来处理其他流
📖 php://filter/read=string.toupper|string.rot13/resource=sui.txt
其中sui.txt里的内容为Hello, Suige!
过滤器
-
字符串过滤器
string.toupper | 将字符全部大写 |
string.rot13 | 对字符进行简单的单表替换,将字母表的后13位字母替换前面的13位字母,遇到其他的字符直接跳过。 |
参数
名称 | 描述 |
resource=<要过滤的数据流> | 这个参数是必须的。它指定了你要筛选过滤的数据流。 |
read=<读链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 |
write=<写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
1. 元
在“元宇宙”中,“元”表示一个超越现实世界的虚拟空间。
在“元数据”中,“元”表示关于其他数据的信息。
在“元封装器”中,“元”表示一个高层次的封装器,专门用来处理和管理其他数据流封装器。元封装器本身不直接处理具体的数据,而是提供一个机制来应用各种过滤器和处理方法,以操作和管理其他封装器的数据流。
2. 封装器
结合上图给出的示例进行理解,该示例运用了两个过滤器(string.toupper|string.rot13)来处理(过滤)数据流,以下是一段易于理解的PHP示例代码。
<?php
// 定义自定义过滤器
function to_upper($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
function rot13($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = str_rot13($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
// 注册自定义过滤器
stream_filter_register('string.toupper', 'to_upper');
stream_filter_register('string.rot13', 'rot13');
// 确保 sui.txt 文件存在,并写入 "Hello, Suige!" 的内容
file_put_contents('sui.txt', 'Hello, Suige!');
// 打开文件
$fp = fopen('sui.txt', 'rb');
// 应用过滤器
stream_filter_append($fp, 'string.toupper');
stream_filter_append($fp, 'string.rot13');
// 读取并输出处理后的内容
while (feof($fp) === false) {
echo fread($fp, 8192);
}
// 关闭文件
fclose($fp);
?>