Swoole 入门 与 结构

By | 2017年7月4日 | 阅读:563 次

前言
这周参与公司开发的产品有一个需求:要实时抓取斗鱼指定房间的弹幕信息,为了降低延迟和高性能用 swoole 来请求和抓取弹幕,后端类似于实时斗鱼直播数据平台 http://www.doseeing.com/ 一样,这个第三方数据平台也是实时抓取斗鱼直播的弹幕、礼物来做统计的;于是在后端 dalao 的指点下开始了swoole的学习,做笔记学习下。

存在即合理,所以在学习 swoole 结构之前,需先了解 swoole 解决了哪些存在的问题;官方文档:Swoole为PHP多进程的模式设计了多个并发数据结构和 IPC 通信机制,在 PHP 中使用 php-fpm 来接收、处理客户端发来的请求,当客户端连接过多后 fpm 用于解析器进程的创建和销毁开销会增加,响应效率不是很好。按照我个人的理解,swoole 正好弥补了高并发连接时的开销问题,且使用纯 C 编写,性能好。

下边先来了解下 PHP 是怎么接收、解析、处理客户端请求的:

1. PHP-FPM

1.1 CGI 标准

引述自《HTTP权威指南》8.3 节
CGI :Common Gateway Interface 通用网关接口,是一个标准接口集,Web 服务器可以用它来装载程序,从而响应对特定 URL 的 HTTP 请求,并收集程序的输出数据,将其放在 HTTP 响应中返回。

  • 协议: CGI 是 Web Server 和处理请求的程序之间传输数据的协议,只要编程语言(PHP)具有标准的输出、输入以及环境变量,Web Server 传递过来符合 CGI 标准的数据就能被该语言处理, 如 Nginx 和 PHP 之间就使用 CGI 标准来交换数据。
  • 请求流程( Nginx 作为请求的分发者)

    • 请求静态资源(配置 index 来指定):../index.html
      nginx 直接找到该文件并返回给客户端
    • 请求非静态资源文件:../login.php
      Nginx 根据配置知道这不是静态文件,要找对应的 CGI 程序( php 解析器)来处理该请求,请求的数据(username、password、HTTP Header…)以 CGI 规定的格式传递给 PHP 解析器。PHP 解析器接收到 Nginx 发过来的数据后,解析 php.ini 并 载入 .so 扩展初始化运行环境,请求处理完毕后输出的数据以 CGI 规定的格式返回给 Nginx,退出进程;Nginx 将结果返回给客户端
  • CGI 性能缺陷:对每个 Web 请求,都会新开一个进程来处理请求,实现很容易,但每个 php 解析器进程都会执行读取配置、初始化运行环境等操作。这就是分离服务器和请求处理程序之间的缺点:大量 Web 请求到来时,大量创建和销毁进程(PHP解析器进程)会使服务器资源负担重、性能低、请求的响应时间变长;为了解决这个缺陷出现了 FastCGI,如下

1.2 FastCGI 标准

  • 相比 CGI,FastCGI 是增强的协议,能减少服务器与CGI程序之间数据传递的开销,使服务器能同时处理更多的Web请求,因为FastCGI(解析器进程)作为 demon 守护进程运行,从而能在一个进程内创建、销毁进程,即处理多个请求
  • FastCGI 工作流程
    • 在 Web Server 启动时载入 FastCGI 进程管理器 master 进程
    • master 进程解析配置文件( php.ini ),初始化执行环境后,启动多个PHP-CGI 解释器进程:worker 进程(在 Windows 下任务管理器中可看到多个 php-cgi.exe),等待客户端的请求
    • 第一个请求到来时,master 会选择并连接一个 worker 进程,将 Nginx 接收到请求的标准输入、环境变量传递给 worker 进程
    • worker进程(php解释器)完成处理后,从同一连接将标准输出传递给 master 进程,进而响应


  • FastCGI 优点:从工作流程可知,master 进程可根据预配置先启动几个 worker 进程等待连接,当多个连接到来时,不会像 CGI 那样再一遍遍的读 php.ini、初始化执行环境再创建,直接把请求分配给现有的worker进程,所以效率会很高。
  • FastCGI 缺点:更改 PHP 配置文件后,只有新的 php-cgi 才会使用新的配置,已存在的 php-cgi 进程有完成当前请求后关闭,下一请求到来时启用使用了新配置的新进程

1.3 PHP-FPM

  • 我个人的理解:php-fpm 是 实现 FastCGI 协议的进程管理器,用来管理一系列的 php-cgi 解释器进程
  • php-fpm 被 PHP 官方集成在 PHP 内核中,编译安装时加参数 --enalbe-fpm 即可

1.4 php-fpm 与 swoole 的简单性能比较

用 ab 测试,同时处理 200 和连接并运行 200 次脚本(index.php 和 server.php 都执行简单的echo),可以看出,swoole 在性能(最大响应时间、成功响应数…)都比 php-fpm 好很多;至于 swoole 的缺陷,后边学习了再比较咯233

  • Apache + php-fpm:ab -r -c 200 -n 200 -k http://127.0.0.1/index.php

  • Apache + Swoole: ab -r -c 200 -n 200 -k http://127.0.0.1/swoole/server.php


2. Swoole 结构

2.1 Manager进程之 Task 进程

  • 处理耗时较长的逻辑

  • Task Demo

发表评论

电子邮件地址不会被公开。