内容简介:]斗旅要开始你的初始问题,斗旅只是一个名为userfilter.bucket旅的资源的名字.
]
斗旅
要开始你的初始问题,斗旅只是一个名为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
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》 这本书的介绍吧!