zoukankan      html  css  js  c++  java
  • Swoole学习总结1

    一,Swoole服务三种模式(默认是多进程模式)

    # Base模式(SWOOLE_BASE
    传统的异步非阻塞Server,reactor和worker是同一个角色。TCP连接是在worker进程中维持的。
    如果客户端连接之间不需要交互,可以使用BASE模式。如Memcache、Http服务器等

    # 线程模式
    多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker线程去处理。

    缺点:一个线程发生内存错误,整个进程会全部结束。
    由于PHP的ZendVM在多线程模式存在内存错误,多线程模式在v1.6.0版本后已关闭。

    # 进程模式
    与多线程Worker模式不同的是,线程换成了进程。Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker进程去处理。适合业务逻辑非常复杂的场景。如WebSocket服务器等。


     



    二,进程的关系介绍:

    一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程Manager进程Worker进程



    Master进程是一个多线程进程,其中有一组非常重要的线程,叫做Reactor线程(组),每当一个客户端连接上服务器的时候,都会由Master进程从已有的Reactor线程中,根据一定规则挑选一个,
    专门负责向这个客户端提供维持链接、处理网络IO与收发数据等服务。分包拆包等功能也是在这里完成。


    Manager进程,某种意义上可以看做一个代理层,它本身并不直接处理业务,其主要工作是将Master进程中收到的数据转交给Worker进程,或者将Worker进程中希望发给客户端的数据转交给Master进程进行发送。

    Manager进程还负责监控Worker进程,如果Worker进程因为某些意外挂了,Manager进程会重新拉起新的Worker进程,有点像Supervisor的工作。而这个特性,也是最终实现热重载的核心机制。

    Worker进程其实就是处理各种业务工作的进程,Manager将数据包转交给Worker进程,然后Worker进程进行具体的处理,并根据实际情况将结果反馈给客户端。


    三,编程须知
    编程须知

    1.不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
    2.exit/die是危险的,会导致worker进程退出
    3.可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作,具体参看/wiki/page/305.html
    4.PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
    5.swoole不支持set_exception_handler,必须使用try/catch方式处理异常
    6.Worker进程不得共用同一个Redis或MySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中。原因是如果共用1个连接,那么返回的结果无法保证被哪个进程处理。持有连接的进程理论上都可以对这个连接进行读写,这样数据就发生错乱了。具体参考/wiki/page/325.html
    7. 不能使用类的属性保存客户端连接信息,因为一个worker进程可以处理多个客户端连接,导致类属性数据错乱。常量则是可以的。
     


  • 相关阅读:
    H5分栏(第一章)
    数据库操作集合
    sql 存储过程
    数据库事务
    Sql 分页三种方式
    GridView 后台分页
    GridView 分页 上一页 下一页 跳转 前端分页
    GridView 分页
    web前端开发分享-css,js入门篇(转)
    Intellij IDEA,WebStorm-keymap(转)
  • 原文地址:https://www.cnblogs.com/zhengweizhao/p/8970559.html
Copyright © 2011-2022 走看看