浅谈php伪协议中的封装器

文章目录

一、封转器

二、数据流封装器

1.data://:

2.如何理解上句话呢?

3.从data://协议格式去理解数据流封装器

1. 数据流

2. 封转器

元封装器

1. php://filter

 过滤器

 参数

 1. 元

2. 封装器




一、封转器

  • 在 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!

 

 过滤器

  1. 字符串过滤器

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);
?>

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值