使用swoole扩展开发PHP全异步代理服务器
浏览数:83 /
时间:2015年06月09日
<?php
class ProxyServer
{
protected $clients;
protected $backends;
protected $serv;
function run()
{
$serv = swoole_server_create("127.0.0.1", 9509);
swoole_server_set($serv, array(
‘timeout‘ => 1, //select and epoll_wait timeout.
‘poll_thread_num‘ => 1, //reactor thread num
‘worker_num‘ => 1, //reactor thread num
‘backlog‘ => 128, //listen backlog
‘max_conn‘ => 10000,
‘dispatch_mode‘ => 2,
//‘open_tcp_keepalive‘ => 1,
‘log_file‘ => ‘/tmp/swoole.log‘, //swoole error log
));
swoole_server_handler($serv, ‘onWorkerStart‘, array($this, ‘onStart‘));
swoole_server_handler($serv, ‘onConnect‘, array($this, ‘onConnect‘));
swoole_server_handler($serv, ‘onReceive‘, array($this, ‘onReceive‘));
swoole_server_handler($serv, ‘onClose‘, array($this, ‘onClose‘));
swoole_server_handler($serv, ‘onWorkerStop‘, array($this, ‘onShutdown‘));
//swoole_server_addtimer($serv, 2);
#swoole_server_addtimer($serv, 10);
swoole_server_start($serv);
}
function onStart($serv)
{
$this->serv = $serv;
echo "Server: start.Swoole version is [" . SWOOLE_VERSION . "]\n";
}
function onShutdown($serv)
{
echo "Server: onShutdown\n";
}
function onClose($serv, $fd, $from_id)
{
//backend
if (isset($this->clients[$fd])) {
$backend_client = $this->clients[$fd][‘socket‘];
unset($this->clients[$fd]);
$backend_client->close();
unset($this->backends[$backend_client->sock]);
echo "client close\n";
}
}
function onConnect($serv, $fd, $from_id)
{
$socket = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
echo microtime() . ": Client[$fd] backend-sock[{$socket->sock}]: Connect.\n";
$this->backends[$socket->sock] = array(
‘client_fd‘ => $fd,
‘socket‘ => $socket,
);
$this->clients[$fd] = array(
‘socket‘ => $socket,
);
$socket->on(‘connect‘, function ($socket) {
echo "connect to backend server success\n";
});
$socket->on(‘error‘, function ($