PHP异步扩展Swoole笔记(2)
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)的更多相关文章
- PHP异步扩展Swoole笔记(1)
安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- 编译安装PHP7并安装Redis扩展Swoole扩展(未实验)
用PECL自动安装Redis扩展.Swoole扩展 pecl install redis pecl install swool 编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机 ...
- PHP 的异步并行 C 扩展 Swoole
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- PHP 的异步并行和协程 C 扩展 Swoole (附链接)
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- 安装swoole redis异步 hiredis swoole扩展加载失败 或者不显示问题 解决办法
当前办法仅供参考 贴上报错 找了好久 根据网上办法也试了 没解决 最后 仔细读问题 觉得可能是 hiredis路径问题 终于解决了 解决办法: 进入你的安装包目录然后执行下面 mkdir /usr/l ...
- Mac Pro 编译安装 PHP扩展 -- Swoole扩展
回顾下先前的安装笔记: PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展? #下载 Swoole-1.8.10后,开始编译# cd /Users/jianbao/Downloads/s ...
- 《C#并行编程高级教程》第9章 异步编程模型 笔记
这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用. ...
随机推荐
- thinkphp5 model 模型
新增更新都是save.saveAll 怎么识别他们 实例化模型后调用save方法表示新增: 查询数据后调用save方法表示更新: save方法传入更新条件后表示更新: isUpdate(true): ...
- Qt5.11.1安装与VS2017配置
Qt5.11.1安装与VS2017配置 转 https://blog.csdn.net/gaojixu/article/details/82185694 文章目录 Qt5.11.1安装与VS2017配 ...
- RFC2616-HTTP1.1-Status Code(状态码规定部分—单词注释版)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 10 Status Code Definitions ...
- Java NIO- 最好文档
http://www.cnblogs.com/puyangsky/p/5840873.html 1 背景介绍 在上一篇文章中我们介绍了Java基本IO,也就是阻塞式IO(BIO),在JDK1.4版本后 ...
- sql - 递归update
declare v_rlt ):; l_sql ); -- variable that contains a query l_c sys_refcursor; -- cursor variable(w ...
- react那些事儿
一.参考链接https://reactjs.org/http://react-china.org/https://doc.react-china.org/https://hulufei.gitbook ...
- 如何在github上搭建网站?
3年前就想写这篇文章了,一直没写,拖到现在,迟到总比不到好,哈哈.github pages只支持静态博客(html,css,js),不支持服务端(php,physon). 一.尝试一下 1.在电脑上安 ...
- vue(v-html)和scss的使用问题
<!--temp是一组p标签--> <div class="lyric-container" v-html="temp"></di ...
- C#Windows窗体界面设计_05_添加菜单栏 工具栏 状态栏 按钮
- KTV项目之3个ListView的跳转和加载歌手图片
第一个ListView: 第二个ListView: 第三个ListView: 定义一个KTVUtil类,在里面定义一个静态变量保存歌手图片 //定义一个静态变量保存歌手图片路径 public stat ...