php – 什么是斗旅?

栏目: PHP · 发布时间: 6年前

内容简介:]斗旅要开始你的初始问题,斗旅只是一个名为userfilter.bucket旅的资源的名字.
啊,欢迎来到 PHP 手册中最少记录的部分! [我打开了关于它的错误报告;也许这个答案将有助于记录: https://bugs.php.net/bug.php?id=69966

]

斗旅

要开始你的初始问题,斗旅只是一个名为userfilter.bucket旅的资源的名字.

你将通过两个不同的旅作为第一和第二个参数到php_user_filter :: filter().第一旅是您读取的输入桶,第二旅最初是空的;你写信给你

关于你的数据结构的更新…它真的只是一个双重链接的列表基本上.但这可能是因为这个名字被偷走了;-)

stream_bucket_prepend()/ stream_bucket_append()

stream_bucket_prepend(resource $brigade, stdClass $bucket): null
stream_bucket_append(resource $brigade, stdClass $bucket): null

预期的$旅是输出旅,也是php_user_filter :: filter()的第二个参数.

$bucket是一个stdClass对象,它被stream_bucket_make_writable()或stream_bucket_new()返回).

这两个功能只是将传递的桶添加到旅中.

stream_bucket_new()

要揭示这个功能,首先分析它的功能签名是:

stream_bucket_new(resource $stream, string $buffer): stdClass

第一个参数是你正在写这个桶的$stream.第二是这个新的桶将包含的$缓冲区.

[我想在这里注意,$stream参数实际上不是很重要;它只是用于检查我们是否需要永久分配内存,以便通过请求生存.我只是假设你可以通过传递持久性流在这里,当在非持久性过滤器上运行时,使PHP很好的segfault …]

现在创建一个userfilter.bucket资源,该资源被分配给名为bucket的(stdClass)对象的属性.

该对象还有另外两个属性:data和datalen,其中包含缓存和缓冲区大小.

它将返回一个stdClass,您可以传入stream_bucket_prepend()和stream_bucket_append().

stream_bucket_make_writable()

stream_bucket_make_writeable(resource $brigade): stdClass|null

它从$旅改变第一个桶,并返回它.如果$旅清空,它返回null.

进一步说明

当调用php_user_filter :: filter()时,调用对象filter()上的$stream属性将被设置为我们当前正在处理的流.这也是您在调用它时传递给stream_bucket_new()的流. ($stream属性将在调用后再次取消设置,不能在例如php_user_filter :: onClose())中重用它.

另请注意,即使您返回$datalen属性,也不需要设置该属性,以防在将数据传递到stream_bucket_prepend()或stream_bucket_append()之前更改$data属性.

执行需要你(嗯,它会期望或将会发出一个警告),你在返回之前从$的桶中读取所有的数据.

还有另一种情况,文档对我们说:在php_user_filter :: onCreate()中,$stream属性未设置.只能在filter()方法调用期间设置.

通常,不要使用带有非阻塞流的过滤器.我试过一次,这是非常错误的… And it’s not likely that’s ever going to be fixed…

总结(例子)

我们从最简单的情况开始:写回我们所得到的东西.

class simple_filter extends php_user_filter {
    function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("simple", "simple_filter")

这里发生的所有事情都是从桶中的桶中获取桶,并将其重新放入$out斗旅.

好的,现在尝试操纵我们的输入.

class reverse_filter extends php_user_filter {
    function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            $bucket->data = strrev($bucket->data);
            stream_bucket_prepend($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("reverse", "reverse_filter")

现在我们注册了相反的://协议,它会反转你的字符串(每个写入在这里都是自己的,而写入顺序仍然保留).所以,我们显然现在需要操纵数据桶数据并在这里添加.

现在,stream_bucket_new()的用例是什么?通常你可以附加到$bucket->数据;是的,你甚至可以将所有的数据连接到第一个数据桶中,但是当flush()可能没有什么可以在斗旅中,并且你想发送一个最后一个数据桶,那么你需要它.

class append_filter extends php_user_filter {
    public $stream;

    function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        // always append a terminating \n
        if ($closing) {
            $bucket = stream_bucket_new($this->stream, "\n");
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("append", "append_filter")

有了这个(以及关于 php_user_filter class 的现有文档),应该能够通过将所有这些强大的可能性结合到更强大的代码中,来进行各种魔术用户流过滤.


以上所述就是小编给大家介绍的《php – 什么是斗旅?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Tango with Django

Tango with Django

David Maxwell、Leif Azzopardi / Leanpub / 2016-11-12 / USD 19.00

Tango with Django is a beginner's guide to web development using the Python programming language and the popular Django web framework. The book is written in a clear and friendly style teaching you th......一起来看看 《Tango with Django》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具