锐客网

零基础学EasySwoole|一、了解EasySwoole

EasySwoole 是一款基于Swoole Server 开发的 常驻内存型 的分布式 PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。 EasySwoole 高度封装了 Swoole Server 而依旧维持 Swoole Server 原有特性,支持同时混合监听HTTP、自定义TCP、UDP协议,让开发者以最低的学习成本和精力编写出多进程,可异步,高可用的应用服务。
一、大公司的选择

  • 腾讯公司的IEG部门
  • WEGAME部门
  • 网宿科技(国内CDN厂家)
  • 360金融
  • 360小游戏(Actor)
  • 9377小游戏
  • 厦门美图网
  • 蝉大师
二、特性
  • 强大的 TCP/UDP Server 框架,多线程,EventLoop,事件驱动,异步,Worker进程组,Task异步任务,毫秒定时器,SSL/TLS隧道加密
  • EventLoop API,让用户可以直接操作底层的事件循环,将socket,stream,管道等Linux文件加入到事件循环中
  • 定时器、协程对象池、HTTP\SOCK控制器、分布式微服务、RPC支持
三、优势
  • 简单易用开发效率高
  • 并发百万TCP连接
  • TCP/UDP/UnixSock
  • 支持异步/同步/协程
  • 支持多进程/多线程
  • CPU亲和性/守护进程
四、github地址
  • https://github.com/easy-swoole/easyswoole
五、注意事项
  • 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞 exit/die是危险的,会导致worker进程退出
  • 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作。
  • PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
  • swoole不支持set_exception_handler,必须使用try/catch方式处理异常
  • 在控制器中不能写共享Redis或MySQL等网络服务客户端连接的逻辑,每次访问控制器都必须new一个连接
  • 由于easySwoole是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用include_once或require_once,否则会发生cannot redeclare function/class 的致命错误。
六、进程隔离与内存管理
  • 不同的进程中PHP变量不是共享,即使是全局变量,在A进程内修改了它的值,在B进程内是无效的,如果需要在不同的Worker进程内共享数据,可以用Redis、MySQL、文件、Swoole\Table、APCu、shmget等工具实现Worker进程内共享数据
  • 不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的。(句柄不能进程共享)
  • 【零基础学EasySwoole|一、了解EasySwoole】进程克隆。在Server启动时,主进程会克隆当前进程状态,此后开始进程内数据相互独立,互不影响。有疑问的新手可以先弄懂php的pcntl
七、约定规范
  • 项目中类名称与类文件(文件夹)命名,均为大驼峰,变量与类方法为小驼峰。
  • 在HTTP响应中,于业务逻辑代码中echo $var 并不会将$var内容输出至相应内容中,请调用Response实例中的wirte()方法实现。


    php