好好爱自己!

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

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

<?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 @ 2018-03-14 16:38  立志做一个好的程序员  阅读(540)  评论(0编辑  收藏  举报

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