dispatch_mode, 数据包分发策略

可以选择7种类型,默认为2
1,轮循模式,收到会轮循分配给每一个Worker进程
2,固定模式,根据连接的文件描述符分配Worker。这样可以保证同一个连接发来的数据只会被同一个Worker处理
3,抢占模式,主进程会根据Worker的忙闲状态选择投递,只会投递给处于闲置状态的Worker
4,IP分配,根据客户端IP进行取模hash,分配给一个固定的Worker进程。可以保证同一个来源IP的连接数据总会被分配到同一个Worker进程。算法为 ip2long(ClientIP) % worker_num
5,UID分配,需要用户代码中调用 Server->bind() 将一个连接绑定1个uid。然后底层根据UID的值分配到不同的Worker进程。算法为 UID % worker_num,如果需要使用字符串作为UID,可以使用crc32(UID_STRING)
7,stream模式,空闲的Worker会accept连接,并接受Reactor的新请求

使用建议

无状态Server可以使用1或3,同步阻塞Server使用3,异步非阻塞Server使用1, 有状态使用2、4、5
dispatch_mode 4,5两种模式,在1.7.8以上版本可用
dispatch_mode=1/3时,底层会屏蔽onConnect/onClose事件,原因是这2种模式下无法保证onConnect/onClose/onReceive的顺序, 非请求响应式的服务器程序,请不要使用模式1或3

UDP协议

dispatch_mode=2/4/5时为固定分配,底层使用客户端IP取模散列到不同的Worker进程,算法为 ip2long(ClientIP) % worker_num
dispatch_mode=1/3时随机分配到不同的Worker进程

BASE模式

dispatch_mode配置在BASE模式是无效的,因为BASE不存在投递任务,当Reactor线程收到客户端发来的数据后会立即在当前线程/进程回调onReceive,不需要投递Worker进程。

Lock

Lock用来实现数据同步, Lock类支持5种锁的类型

  • 文件锁 SWOOLE_FILELOCK
  • 读写锁 SWOOLE_RWLOCK
  • 信号量 SWOOLE_SEM
  • 互斥锁 SWOOLE_MUTEX
  • 自旋锁 SWOOLE_SPINLOCK

注意:勿在onReceive等回调函数中创建锁, 否则底层的GlobalMemory内存会持续增长, 造成内存泄漏

swoole_lock->__construct(int $type, [string $lockfile])
$type为锁的类型
$lockfile, 当类型为SWOOLE_FILELOCK时必须传入, 指定文件锁的路径
注意每一种类型的锁支持的方法都不一样。如读写锁、文件锁可以支持$lock->lock_read()。另外除文件锁外, 其他类型的锁必须在父进程内创建, 这样fork出的子进程之间才可以互相争抢锁。不要循环创建/销毁锁的对象, 否则会发生内存泄漏

swoole_lock->lock()
加锁操作。如果有其他进程持有锁, 那这里将进入阻塞, 直到持有锁的进程unlock. 加锁成功返回true

swoole_lock->trylock()
加锁操作。与lock方法不同的是, trylock()不会阻塞, 它会立即返回。
加锁成功返回true, 此时可以修改共享变量
加锁失败返回false, 表示有其他进程持有锁

swoole_lock->unlock()
解锁成功返回true

swoole_lock->lock_read()
仅锁定读. 在持有读锁的过程中, 其他进程依然可以获得读锁, 可以继续发生读操作, 但不能$lock->lock()或$lock->trylock(), 这两个方法是获取独占锁, 在独占锁加锁时, 其他进程无法再进行任何加锁操作, 包括读锁.
当另外一个进程获得了独占锁(调用$lock->lock/$lock->trylock)时, $lock->lock_read()会发生阻塞, 直到持有独占锁的进程释放锁
只有SWOOLE_RWLOCK和SWOOLE_FILELOCK类型的锁支持只读加锁

swoole_lock->trylock_read()
此方法与lock_read相同, 但是非阻塞的

swoole_lock->lockwait(float $timeout = 1.0) : bool;
加锁操作,作用与swoole_lock->lock一致,但lockwait可以设置超时时间。
$timeout传入超时时间,默认为1秒, 在规定的时间内未获得锁,返回false, 加锁成功返回true
只有Mutex类型的锁支持lockwait

Coroutine 协程

Swoole提供了以下的Coroutine对象

Coroutine\Channel
Coroutine\Client
Coroutine\Http\Client
Coroutine\Http2\Client
Coroutine\Redis
Coroutine\Socket
Coroutine\MySQL
Coroutine\PostgreSQL

这些Coroutine只适合在一个进程中做处理. 例如你需要在一个onRequest方法里, 同时请求多个mysql和redis, 那么使用Coroutine可以使这些请求并行, 达到节约网络时间的目的.
Coroutine不适合在Server中创建, 又需要在多个进程中处理的场景, 例如你在server里创建了一个socket, 希望在各个worker里面调用.

PHP异步扩展Swoole笔记(2)的更多相关文章

  1. PHP异步扩展Swoole笔记(1)

    安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...

  2. 编译安装PHP7并安装Redis扩展Swoole扩展

    编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...

  3. firefox 扩展开发笔记(三):高级ui交互编程

    firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...

  4. 编译安装PHP7并安装Redis扩展Swoole扩展(未实验)

    用PECL自动安装Redis扩展.Swoole扩展 pecl install redis pecl install swool 编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机 ...

  5. PHP 的异步并行 C 扩展 Swoole

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

  6. PHP 的异步并行和协程 C 扩展 Swoole (附链接)

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

  7. 安装swoole redis异步 hiredis swoole扩展加载失败 或者不显示问题 解决办法

    当前办法仅供参考 贴上报错 找了好久 根据网上办法也试了 没解决 最后 仔细读问题 觉得可能是 hiredis路径问题 终于解决了 解决办法: 进入你的安装包目录然后执行下面 mkdir /usr/l ...

  8. Mac Pro 编译安装 PHP扩展 -- Swoole扩展

    回顾下先前的安装笔记: PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展? #下载 Swoole-1.8.10后,开始编译# cd /Users/jianbao/Downloads/s ...

  9. 《C#并行编程高级教程》第9章 异步编程模型 笔记

    这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用. ...

随机推荐

  1. Cygwin命令

    Cygwin是一个用于在Windows上模拟Linux环境的软件. 通过cygwin,可以在windows环境下使用linux的程序,像find.tar等一些工具也可以在windows下使用,让我们可 ...

  2. Java 之 Web前端(三)

    1.JSP a.全称:Java Server Page b.运行:翻译.编译.类装载.类实例化.(初始化.服务.销毁 (这三点为Servlet的生命周期)) 2.JSP的基本组成 a.HTML模板 注 ...

  3. springcloud(六):配置中心git示例

    随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置 ...

  4. CSRF自动化检测

    CSRF自动化检测: 这里主要是对POST型form表单的检测 1. 根据URL获取form表单组成的数组 2. 遍历表单数组,对比不设置cookie与设置了cookie两种情况下的表单是否还存在,如 ...

  5. vue笔记-模板,计算属性,class与style,data属性

    数据和方法 1:只有当实例被创建时 data 中存在的属性才是响应式的,也可以预定义一些空的属性,唯一的意外就是Object.freeze(obj),这会阻止修改现有的属性;也就是说一个数据在放到根实 ...

  6. python 3.6 + numpy + matplotlib + opencv + scipy 安装

    首先,下载并安装 python3.6: 然后,在网址http://www.lfd.uci.edu/~gohlke/pythonlibs/ 上 分别下载 numpy.scipy.matplotlib.o ...

  7. ENQUIRE the predecessor to the World Wide Web.

    看Building Responsive Data Visualization for the Web时介绍到了Enquire,表示wiki类系统实现了它的核心思想. 有点好奇是如何实现的,所以大概看 ...

  8. [linux]服务器apache配置vhost

    官网示例: http://httpd.apache.org/docs/current/vhosts/examples.html

  9. Ajax状态值及状态码整理

    1- AJAX状态值与状态码区别 AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互 ...

  10. jenkins部署node项目

    docker run -d --name jenkins -p 8081:8080 -v /home/jenkins_home:/home/jenkins_home jenkins