`
matyhtf
  • 浏览: 82862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用swoole扩展写的PHP全异步代理服务器

    博客分类:
  • PHP
阅读更多

客户端socket连接到ProxyServer后,创建一个socket连接到后端Server。并监听后端Server的回包。 客户端向ProxyServer发送请求包,proxy服务器会透明地将此包发往后端Server。

 

当后端Server返回包时,找到对应的客户端socket,向此socket发送回应的数据包。

此程序将swoole扩展提供的Server和Client结合在一起使用, ProxyServer对客户端连接来说是服务器端,但对backend服务器来说是客户端。

 

所有网络IO都是基于epoll事件循环,全异步非阻塞的。性能非常高。 长连接可以达到 10万qps的处理能力。

 

这里对后端Server和客户端之间使用了1对1的模式,可以改进为n对1连接池的模式,节约backend Server的TCP连接数量。当onReceve收到客户端请求时,将客户端连接与backend连接绑定。返回响应数据后解除绑定,使连接可供下一个客户端使用。

 

<?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($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);
    }

    function onReceive($serv, $fd, $from_id, $data)
    {
        echo microtime().": client receive\n";
        $backend_socket = $this->clients[$fd]['socket'];
        $backend_socket->send($data);
        echo microtime().": send to backend\n";
        echo str_repeat('-', 100)."\n";
    }
}

$serv = new ProxyServer();
$serv->run();



 

分享到:
评论

相关推荐

    php7及以上版本 swoole扩展

    总结来说,Swoole扩展在PHP 7及以上版本中,不仅提供了丰富的网络服务构建工具,还引入了异步编程模型和协程机制,极大地扩展了PHP在高并发、长连接场景下的应用能力。开发者可以利用这些特性构建高性能、低延迟的...

    php7.0以上swoole扩展

    - Swoole扩展与常规的PHP-FPM工作模式不同,它运行在常驻内存模式,意味着服务器启动后不会随每个请求结束而销毁,而是持续运行直到手动停止。 - PHP代码需要适应异步编程思维,避免使用阻塞操作,如长时间的...

    PHP环境安装swoole-loader扩展

    总的来说,通过安装和使用Swoole扩展,开发者可以将PHP从一个传统的同步I/O模型提升到异步非阻塞I/O模型,显著提高Web应用的响应速度和处理能力。无论是开发大型的互联网应用,还是对现有项目进行性能优化,Swoole都...

    PHP Swoole Loader扩展 Swoole扩展 Swoole Swoole Loade

    Swoole Loader扩展结合了Swoole扩展,使得PHP开发者能够充分利用Swoole的异步、非阻塞I/O模型,从而在Web应用开发中实现更高效的服务端编程。 Swoole扩展本身是PHP的一个开源库,它为PHP提供了一种底层的C语言实现...

    nsqtoswoole使用swoole扩展实现的一个NSQ强大php客户端

    2. **Swoole扩展**:Swoole为PHP提供了原生的异步非阻塞I/O支持,使得PHP可以在服务器端处理TCP、UDP、HTTP、WebSocket等网络协议,同时支持定时器和协程。使用Swoole,开发者可以构建高性能的微服务和实时应用。 3...

    swoole + redis 实现短信异步发送

    Swoole是一款面向生产环境的PHP异步多线程服务器扩展,可以显著提升PHP应用的性能。为了安装Swoole,我们需要遵循以下步骤: 1. **下载Swoole源码包** 首先访问Swoole的GitHub页面...

    Swoole Loader扩展.7z

    Swoole是一款开源的PHP异步并行框架,它使PHP开发者能够构建高性能的网络服务器,尤其适合微服务架构和实时Web应用。 首先,我们要理解Swoole扩展的作用。Swoole扩展为PHP提供了原生的多线程、多进程、TCP/UDP网络...

    Python-使用swoole扩展和php开发的一个在线聊天室

    1. **Swoole扩展**:Swoole提供了PHP异步编程的能力,支持TCP、UDP、HTTP、WebSocket等多种协议。在聊天室应用中,Swoole可以创建WebSocket服务器,处理来自客户端的连接和消息,实现高效的推送服务。 2. **PHP**:...

    swoole_loader扩展PHP.zip

    标题中的“swoole_loader扩展PHP.zip”表明这是一个与PHP编程语言相关的压缩包,特别是针对swoole_loader扩展。Swoole Loader是Swoole框架的一部分,它是一个用于加速PHP应用执行的动态加载器。这个扩展允许开发者在...

    Windows 下安装 swoole 图文教程(php)

    Windows环境下安装Swoole扩展的图文教程,对于熟悉PHP开发的用户来说,可能对于Swoole扩展还不太熟悉。Swoole是一个高性能的PHP网络通信框架,它支持异步多线程的服务器、客户端、定时器等高级功能,可以用来构建高...

    php8.1和php8.2和swow扩展windows版本

    Swoole扩展为PHP提供了原生的异步多线程、多进程、TCP/UDP网络通信、HTTP服务器、WebSocket服务器等功能。在Windows环境下安装Swoole扩展需要下载与PHP版本和系统架构相匹配的预编译二进制文件,然后通过php.ini配置...

    PHP swoole loader 扩展 for linux win系统、线程安全\非安全、PHP54-81 全集

    Swoole扩展本身是一个强大的异步并发框架,尤其适用于构建高性能的网络应用,如Web服务器、WebSocket服务等。 在标题和描述中,我们看到`PHP swoole loader`针对的是Linux和Windows系统,并且涵盖了线程安全和非...

    Windows64位 Swoole Loader php73 扩展安装包-ts

    这个“Windows 64位 Swoole Loader php73 扩展安装包-ts”提供了在64位Windows上运行PHP 7.3的线程安全环境下的Swoole扩展,使得开发者能够利用Swoole的高性能特性和丰富的功能,如异步编程、协程、网络服务器等,...

    基于PHP swoole扩展短信通道cmpp接入

    PHP,作为广泛应用的服务器端脚本语言,通过引入Swoole扩展,可以提升其在处理异步任务和高并发场景下的性能。而CMPP(China Mobile Packet Protocol)是中国移动制定的通用短消息网关接口协议,广泛应用于短信服务...

    Win64位 Swoole Loader扩展安装包-ts-NTS

    Swoole是一款开源的高性能、异步并行的PHP扩展,它为PHP提供了原生的网络通信和事件驱动框架,使得PHP可以进行低延迟、高并发的服务器端编程。Loader扩展则是Swoole为了实现自动加载PHP类而设计的,能够有效地提高...

    swoole-yaf, 结合swoole扩展和Yaf框架,使用swoole的内置http_server.zip

    1. 配置Swoole扩展:首先,需要确保PHP环境中已经安装并启用了Swoole扩展。通过php.ini配置文件,可以启用Swoole扩展,并设置相关参数,如最大工作进程数、最大连接数等。 2. 集成Yaf框架:在Swoole的HTTP服务器中...

    cpp-基于Swoole的多语言Hprose异步客户端和独立服务器

    具体实现时,我们需要先安装Swoole扩展,然后在PHP环境中搭建Hprose-Swoole服务器。服务器端代码会注册Hprose服务函数,这些函数可以在其他语言的客户端中被调用。同时,利用Swoole的异步特性,服务端可以执行耗时...

    php_swoole_loader_2.2_nzts_php7.3 widows-x64版本

    在使用Swoole扩展时,需要注意的是,由于其异步特性,编程模式与传统的PHP有所不同,需要遵循异步编程的规则,避免长时间阻塞操作。此外,Swoole的API与PHP的原生函数有所不同,需要学习和熟悉其提供的各种类和方法...

    Swoole扩展

    PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS...

Global site tag (gtag.js) - Google Analytics