Swoole简介

本文示例代码详见:https://github.com/52fhy/swoole_demo 。
简介Swoole是一个php扩展,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询 。Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端 。
Swoole: PHP的异步、并行、高性能网络通信引擎
http://www.swoole.com/
Github:
https://github.com/swoole
https://github.com/matyhtf
安装Swoole需要使用源码安装 。暂无windows版扩展 。
源码安装
wget -O swoole.zip https://github.com/swoole/swoole-src/archive/v1.9.11.zipunzip swoole.zipcd swoolephpize./configuremake && make installpecl安装
由于pecl是需要编译的,所以需要先安装编译器(已安装编译器可以忽略):
yum install -y gcc gcc-c++ make cmake bison autoconf然后:
pecl install swoolepecl install redispecl安装扩展完成后会提示添加so文件到php.ini 。示例:
Build process completed successfullyInstalling '/usr/lib64/php/modules/swoole.so'install ok: channel://pecl.php.net/swoole-1.9.11configuration option "php_ini" is not set to php.ini locationYou should add "extension=swoole.so" to php.ini添加示例:
[swoole]extension = /usr/lib64/php/modules/swoole.soSwoole的进程模型运行模式
Swoole目前总共有三种运行模式,默认为多进程模式(SWOOLE_PROCESS) 。
稳定版:v1.9.9预览版:v2.0.7$serv = new swoole_server(string $host, int $port, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP);实例分析
我们来使用实例进行分析:
<?php$server = new swoole_server("127.0.0.1",8088);//默认是多进程模式、TCP类型$server->on('connect', function ($serv, $fd){ });$server->on('receive', function ($serv, $fd, $from_id, $data){ });$server->on('close', function ($serv, $fd){ });$server -> start();继续在Shell中输入以下命令:
php swoole_tcp_server.phppstree -ap|grep swoole_tcp_server | | `-php,2454 swoole_tcp_server.php | | |-php,2456 swoole_tcp_server.php | | | `-php,2458 swoole_tcp_server.php从系统的输出中,我们可以很容看出server其实有3个进程,进程的pid分别是2454、2456、2458,其中2454是2456的父进程,而2456又是2458的父进程 。

所以,其实我们虽然看起来只是启动了一个Server,其实最后产生的是三个进程 。
这三个进程中,所有进程的根进程(2454),就是所谓的Master进程;而2456进程,则是Manager进程;最后的2458进程,是Worker进程 。
基于此,我们简单梳理一下,当执行的start方法之后,发生了什么:
  • 守护进程模式下,当前进程fork出Master进程,然后退出,Master进程触发OnMasterStart事件 。
  • Master进程启动成功之后,fork出Manager进程,并触发OnManagerStart事件 。
  • Manager进程启动成功时候,fork出Worker进程,并触发OnWorkerStart事件 。
非守护进程模式下,则当前进程直接作为Master进程工作 。
所以,一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程、Manager进程和Worker进程 。
事实上,一个多进程模式下的Swoole Server中,有且只有一个Master进程;有且只有一个Manager进程;却可以有n个Worker进程 。
进程模型
Master进程是一个多线程进程,其中有一组非常重要的线程,叫做Reactor线程(组),每当一个客户端连接上服务器的时候,都会由Master进程从已有的Reactor线程中,根据一定规则挑选一个,专门负责向这个客户端提供维持链接、处理网络IO与收发数据等服务 。分包拆包等功能也是在这里完成 。
Manager进程,某种意义上可以看做一个代理层,它本身并不直接处理业务,其主要工作是将Master进程中收到的数据转交给Worker进程,或者将Worker进程中希望发给客户端的数据转交给Master进程进行发送 。
Manager进程还负责监控Worker进程,如果Worker进程因为某些意外挂了,Manager进程会重新拉起新的Worker进程,有点像Supervisor的工作 。而这个特性,也是最终实现热重载的核心机制 。
Worker进程其实就是处理各种业务工作的进程,Manager将数据包转交给Worker进程,然后Worker进程进行具体的处理,并根据实际情况将结果反馈给客户端 。
我们可以总结出来上面简单的Server,当客户端连接的时候这个过程中,三种进程之间是怎么协作的:
  1. Client主动Connect的时候,Client实际上是与Master进程中的某个Reactor线程发生了连接 。


    推荐阅读