zoukankan      html  css  js  c++  java
  • swoole 连接池


    proxy_pool.php

    
    <?php
    
    class ProxyServer
    {
        protected $frontends;
        protected $backends;
        /**
         * @var swoole_server
         */
        protected $serv;
        protected $index = 0;
        protected $mode = SWOOLE_BASE;
        protected $backendServer;
    
        function run($backendServer = array('host' => '127.0.0.1', 'port' => '80'), $port = 9501, $host = '0.0.0.0')
        {
            $this->backendServer = $backendServer;
            $serv = new swoole_server($host, $port, $this->mode);
            $serv->set(array(
                'worker_num' => 8, //worker process num
                //'backlog' => 128, //listen backlog
                //'open_tcp_keepalive' => 1,
                //'log_file' => '/tmp/swoole.log', //swoole error log
            ));
            $serv->on('WorkerStart', array($this, 'onStart'));
            $serv->on('Receive', array($this, 'onReceive'));
            $serv->on('Close', array($this, 'onClose'));
            $serv->on('WorkerStop', array($this, 'onShutdown'));
            $serv->start();
        }
    
        function onStart($serv)
        {
            $this->serv = $serv;
            //echo "Server: start.Swoole version is [" . SWOOLE_VERSION . "]
    ";
        }
    
        function onShutdown($serv)
        {
            echo "Server: onShutdown
    ";
        }
    
        function onClose($serv, $fd, $from_id)
        {
            //清理掉后端连接
            if (isset($this->frontends[$fd])) {
                $backend_socket = $this->frontends[$fd];
                $backend_socket->closing = true;
                $backend_socket->close();
                unset($this->backends[$backend_socket->sock]);
                unset($this->frontends[$fd]);
            }
            echo "onClose: frontend[$fd]
    ";
        }
    
        function onReceive($serv, $fd, $from_id, $data)
        {
            //尚未建立连接
            if (!isset($this->frontends[$fd])) {
                //连接到后台服务器
                $socket = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
                $socket->closing = false;
                $socket->on('connect', function (swoole_client $socket) use ($data) {
                    $socket->send($data);
                });
                $socket->on('error', function (swoole_client $socket) use ($fd) {
                    echo "ERROR: connect to backend server failed
    ";
                    $this->serv->send($fd, "backend server not connected. please try reconnect.");
                    $this->serv->close($fd);
                });
                $socket->on('close', function (swoole_client $socket) use ($fd) {
                    echo "onClose: backend[{$socket->sock}]
    ";
                    unset($this->backends[$socket->sock]);
                    unset($this->frontends[$fd]);
                    if (!$socket->closing) {
                        $this->serv->close($fd);
                    }
                });
                $socket->on('receive', function (swoole_client $socket, $_data) use ($fd) {
                    $this->serv->send($fd, $_data);
                });
                if ($socket->connect($this->backendServer['host'], $this->backendServer['port'])) {
                    $this->backends[$socket->sock] = $fd;
                    $this->frontends[$fd] = $socket;
                } else {
                    echo "ERROR: cannot connect to backend server.
    ";
                    $this->serv->send($fd, "backend server not connected. please try reconnect.");
                    $this->serv->close($fd);
                }
            } //已经有连接,可以直接发送数据
            else {
                /**
                 * @var $socket swoole_client
                 */
                $socket = $this->frontends[$fd];
                $socket->send($data);
            }
        }
    }
    // config
    $backendServerList = [
        [
            'host' => 'api.eelly.com', 'port' => 443, 'proxy_port' => 9501,
        ],
    ];
    
    $workerNum = count($backendServerList);
    $pool = new SwooleProcessPool($workerNum);
    $pool->on("WorkerStart", function ($pool, $workerId) use ($backendServerList) {
        echo "Worker#{$workerId} is started
    ";
        $backendServer = $backendServerList[$workerId];
        $serv = new ProxyServer($backendServer, $backendServer['proxy_port']);
        echo "Remote {$backendServer['host']}:{$backendServer['port']} -> Local {$backendServer['proxy_port']}
    ";
        $serv->run();
    });
    $pool->start();
    
    
  • 相关阅读:
    Oracle手工增加排序区避免SQL使用临时表空间排序产生物理IO
    Oracle中"TABLE ACCESS FULL"的”欺骗时刻“
    Oracle关于12C新特性InMemory踩坑历程
    Oracle19C关于参数sec_case_sensitive_logon控制密码大小写敏感问题
    友链
    RESTful API
    不自由的自由职业
    惊了!修仙=编程??
    [Git专题] 环境搭建
    Linux系统僵尸进程详解
  • 原文地址:https://www.cnblogs.com/lalalagq/p/10205872.html
Copyright © 2011-2022 走看看