加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP的日志流过滤器?

发布时间:2020-12-13 22:34:02 所属栏目:PHP教程 来源:网络整理
导读:我需要调试我的 PHP前端对另一台主机上的后端服务进行的套接字连接,我需要尽可能接近金属.我已经在各个级别抽象了连接,其中包括让我能够轻松地将 stream filters连接到连接.因此问题应该很容易解决:将流过滤器打包到一个类中,该类允许在发送或接收数据时执
我需要调试我的 PHP前端对另一台主机上的后端服务进行的套接字连接,我需要尽可能接近金属.我已经在各个级别抽象了连接,其中包括让我能够轻松地将 stream filters连接到连接.因此问题应该很容易解决:将流过滤器打包到一个类中,该类允许在发送或接收数据时执行任意回调,然后将这些回调附加到几个日志文件中.

唯一的麻烦是我的(天真?)期望应该有一些这样的过滤器实现浮动在线似乎是错误的!我不介意自己编写过滤器,但也许有一些我可以找不到的东西?

作为参考,我在“php日志流过滤器”上做了很多明显的变化.

更新:为了澄清,我正在寻找的东西可以让我编写与此类似的代码:

$params = array(
    'onDataSent' => function($data) { echo "Sent: $datan"; },'onDataReceived' => function($data) { echo "Received: $datan"; },);

stream_filter_register('logging','HookableStreamFilter');
stream_filter_append($someStream,'logging',STREAM_FILTER_ALL,$params);

解决方法

对于后代,这是我结束的鞭打.过滤器本身派生自php_user_filter,在 stream_filter_register的文档中对此进行了描述:

class HookableFilter extends php_user_filter {
    public function filter($in,$out,&$consumed,$closing) {
        $data = '';

        while ($bucket = stream_bucket_make_writeable($in)) {
            $consumed += $bucket->datalen;
            $data .= $bucket->data;
            stream_bucket_append($out,$bucket);
        }

        call_user_func($this->params,$data);
        return PSFS_PASS_ON;
    }
}

请注意,我直接使用$this-> params作为回调,这使得它在功能上非常简洁(有一个原因;见下文).

使用PHP注册过滤器:

stream_filter_register('generic.hookable','HookableFilter');

将过滤器附加到流:

$callback = function($data) { /* log the data */ };
stream_filter_append($stream,'generic.hookable',STREAM_FILTER_READ,$callback);
stream_filter_append($stream,STREAM_FILTER_WRITE,$callback);

重要提示:据我所见,如果您将过滤器附加到双工流的两个通道(例如,使用stream_socket_client生成的通道),则过滤器无法知道在调用时它在哪个通道上运行.因此,如果您需要像我一样区分传入和传出数据,唯一的选择是将过滤器分别连接到每个通道.如果这样做,您当然也希望为每个通道提供不同的回调(与上面的简化示例中所做的不同).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读