<?phpClassproxyserver{Protected$clients;Protected$backends;Protected$ServfunctionRun () {$Serv=Swoole_server_create ("127.0.0.1",9509);Swoole_server_set ($ServArray' 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); }functionOnStart ($Serv) {$This->serv=$ServEcho"Server:start. Swoole version is [".Swoole_version."]\n"; }functionOnShutdown ($Serv) {Echo"Server:onshutdown\n"; }functionOnClose ($Serv$Fd$FROM_ID) {Backendif (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"; } }functionOnConnect ($Serv$Fd$FROM_ID) {$Socket=NewSwoole_client (SWOOLE_SOCK_TCP,Swoole_sock_async);EchoMicrotime ().": 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 ($Socket) {Echo"Connect to backend server fail\n"; });$Socket->On' Receive ',function ($Socket) {Swoole_server_send ($This->serv,$This->backends[$Socket->sock][' CLIENT_FD '],$Socket->Recv ()); });$Socket->Connect' 127.0.0.1 ',9501,0.2); }functionOnReceive ($Serv$Fd$FROM_ID,$Data) {EchoMicrotime ().": Client receive\n";$Backend_socket=$This->clients[$fd][' Socket '];$Backend_socket->send ($data); echo microtime () ": Send to backend\n"; echo str_repeat (100) $serv = new proxyserver (); $serv->run ();
Developing PHP full asynchronous Proxy server using Swoole extensions