好好爱自己!

php monolog 的写日志到unix domain socket 测试终于成功

在另外一个客户端执行 php s.php后, 通过nc -lU /tmp/tg.sck 建立的unix domain socket 有接收到消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
require 'vendor/autoload.php';
 
use Monolog\Logger;
use Monolog\Handler\SocketHandler;
 
// Create the logger
$logger = new Logger('my_logger');
 
// Create the handler
$handler = new SocketHandler('unix:///tmp/tg.sck');
$handler->setPersistent(true);
 
// Now add the handler
$logger->pushHandler($handler, Logger::DEBUG);
 
// You can now use your logger
$logger->info('My logger is now ready');

  

 

--------------------------------------------------------------------------

php (or python) listen to unix domain stream socket

I need to create a script that listens to a unix socket and forward the incoming stream to a bot. The scripts are unable to connect. The issues seems to be related to the order of things.

Proof of case

I have created a socket and I am able to write to it. In session 1, I create a listener connection

nc -lU /tmp/tg.sck

In session 2, I write to the socket.

 while true; do echo "hello"; sleep 2; done | nc -U /tmp/tg.sck

The above only works if I do it in that order. ==> Writing before you have a listener results in an error.

Using scripts (does not work)

When I replace the listing process with a PHP (or Python) script, the connection is refused because the socket is not opened.

$ python test.py 
Connecting...
socket.error: [Errno 111] Connection refused

or

$ php test.php 
Warning:  fsockopen(): unable to connect to unix:///tmp/tg.sck:-1 (Connection refused)

Changing the order of things

If I start a working listener using the command nc -lU /tmp/tg.sck then the script does not die, but the writer process does.

Listener scripts

import socket
import sys

server_address = '/tmp/tg.sck'  # Analogous to TCP (address, port) pair
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(server_address)
sock.recv(512)

and the php script

$fp = fsockopen('unix:///tmp/tg.sck', -1, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  while (!feof($fp)) {
    echo fgets($fp, 4096);
  }
  fclose($fp);
}
posted @   立志做一个好的程序员  阅读(563)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-03-14 【转】Wireshark技巧-过滤规则和显示规则
2017-03-14 [转]Wireshark抓包工具--TCP数据包seq ack等解读
2017-03-14 网络学习资源

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示