EvgenyPrudnikov
Новичок
Организация демона с применением libevent
Доброго времени суток.
Т.к. второй день копаюсь в примерах и мануалах, но не могу решить проблему, рискну попросить помощи у гуру.
Поиск по базе Клуба ничего не дал.
Задача такая, необходимо написать простой скрипт-демон, который слушает некий tcp порт, приходящие запросы обрабатываются при помощи libevent.
Как решал задачу:
1. открываю неблокирующий сокет
2. передаю его в качестве декскриптора событию, запускаю event_loop
3. В колбек-процедуре делаю акцепт сокета и пытаюсь через event_bufer прочитать-записать данные
Что происходит:
Цикл запускается, сокет открывается, коллбэк вызывается нормально, но не получается прочитать данные из буфера, записать в него тоже не могу ничего. Читать напрямую из рез-та $conn = stream_socket_accept($stream,0,$addr); получилось просто fread, но записать опять - же не смог.
Запрос делаю по http на некий урл, далее nginx пробразывает его на нужный порт.
Собственно вопросов у меня два и оба не оригинальны:
1. Для чего в либэвенте используется буфер (документации крайне мало, буквально пара скупых слов, как речь на могиле налогового инспектора)
2. Что я делаю неправильно и что нужднго сделать, что бы решить мою задачу?
Вариант отказаться от использования libevent... не катит, если нет возможности точно понять "почему"
Заранее спасибо
Реврайт nginx-а:
Собственно сам код:
Доброго времени суток.
Т.к. второй день копаюсь в примерах и мануалах, но не могу решить проблему, рискну попросить помощи у гуру.
Поиск по базе Клуба ничего не дал.
Задача такая, необходимо написать простой скрипт-демон, который слушает некий tcp порт, приходящие запросы обрабатываются при помощи libevent.
Как решал задачу:
1. открываю неблокирующий сокет
2. передаю его в качестве декскриптора событию, запускаю event_loop
3. В колбек-процедуре делаю акцепт сокета и пытаюсь через event_bufer прочитать-записать данные
Что происходит:
Цикл запускается, сокет открывается, коллбэк вызывается нормально, но не получается прочитать данные из буфера, записать в него тоже не могу ничего. Читать напрямую из рез-та $conn = stream_socket_accept($stream,0,$addr); получилось просто fread, но записать опять - же не смог.
Запрос делаю по http на некий урл, далее nginx пробразывает его на нужный порт.
Собственно вопросов у меня два и оба не оригинальны:
1. Для чего в либэвенте используется буфер (документации крайне мало, буквально пара скупых слов, как речь на могиле налогового инспектора)
2. Что я делаю неправильно и что нужднго сделать, что бы решить мою задачу?

Вариант отказаться от использования libevent... не катит, если нет возможности точно понять "почему"

Заранее спасибо

Реврайт nginx-а:
PHP:
location ^~ /newtest {
access_log off;
#fastcgi_pass unix:/tmp/phpfastcgid.sock;
fastcgi_pass localhost:8004;
include fastcgi_params;
fastcgi_param DONT_USE_SENDFILE 1;
fastcgi_param APPNAME Chat;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
}
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
function onAcceptEvent($stream, $events)
{
global $base;
$initialLowMark = 0;
$initialHighMark = 0xFFFFFF;
$conn = stream_socket_accept($stream,0,$addr);
stream_set_blocking($conn,0);
$buf = event_buffer_new($conn, 'onReadEvent', 'onWriteEvent', 'onFailureEvent', array(1, 1));
event_buffer_base_set($buf, $base);
event_buffer_priority_set($buf,10);
event_buffer_watermark_set($buf,EV_READ,$initialLowMark,$initialHighMark);
event_buffer_enable($buf,EV_READ | EV_WRITE | EV_PERSIST);
stream_set_blocking($buf, 0);
$read = event_buffer_read($buf, 2048);
var_dump($read);
$str = 'sdfsd fsd fs dfs df';
$res = event_buffer_write($buf, $str);
var_dump($res);
$read = event_buffer_read($buf, strlen($str));
var_dump($read);
event_buffer_free($buf);
}
function onReadEvent($stream,$arg)
{
global $base, $buf;
}
function onWriteEvent($stream,$arg)
{
global $base, $buf;
}
function onFailureEvent($stream,$arg)
{
global $base, $buf;
}
if (ini_get('mbstring.func_overload') >= 2)
{
function binarySubstr($s,$p,$l = 0xFFFFFFF)
{
return substr($s,$p,$l,'ASCII');
}
}
else
{
function binarySubstr($s,$p,$l = NULL)
{
if ($l === NULL) {$ret = substr($s,$p);}
else {$ret = substr($s,$p,$l);}
if ($ret === FALSE) {$ret = '';}
return $ret;
}
}
$base = event_base_new();
$event = event_new();
$sock = stream_socket_server('127.0.0.1:8004', $errno,$errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
stream_set_blocking($sock,0);
event_set($event, $sock, EV_READ, 'onAcceptEvent', array($event,$base));
event_base_set($event, $base);
while (TRUE) {
//event_base_loop($base, EVLOOP_NONBLOCK);
event_add($event);
event_base_loop($base, EVLOOP_NONBLOCK);
}
/*
$base = event_base_new();
$event = event_new();
$socket = stream_socket_server('tcp://127.0.0.1:8004', $errno, $errstr);
event_set($event, $socket, EV_READ | EV_PERSIST, "callback_func", array($event, $base));
event_base_set($event, $base);
event_add($event);
event_base_loop($base);
*/