php – 什么是斗旅?

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

内容简介:]斗旅要开始你的初始问题,斗旅只是一个名为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 – 什么是斗旅?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Professional JavaScript for Web Developers

Professional JavaScript for Web Developers

Nicholas C. Zakas / Wrox / 2009-1-14 / USD 49.99

This eagerly anticipated update to the breakout book on JavaScript offers you an in-depth look at the numerous advances to the techniques and technology of the JavaScript language. You'll see why Java......一起来看看 《Professional JavaScript for Web Developers》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具