gpt4 book ai didi

php - PHP 的日志流过滤器?

转载 作者:可可西里 更新时间:2023-10-31 23:42:56 26 4
gpt4 key购买 nike

我需要调试我的 PHP 前端与另一台主机上的后端服务建立的套接字连接,并且我需要尽可能接近金属。我已经抽象出各个级别的连接,这使我能够轻松附加 stream filters。到连接。所以问题应该很容易解决:将一个流过滤器封装到一个类中,该类允许在发送或接收数据时执行任意回调,然后例如将它们附加到几个日志文件中。

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

作为引用,我在谷歌上搜索了许多关于“php logging stream filter”的明显变体。

更新:澄清一下,我正在寻找的是能让我编写在道德上等同于此的代码的东西:

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

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, 'generic.hookable', STREAM_FILTER_WRITE, $callback);

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

关于php - PHP 的日志流过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9582769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com