swoole概念:swoole是异步并行高性能网络通信引擎,使用纯C编写,提供了PHP语言的异步多线程服务器,实现了异步TCP/UDP网络客户端,异步mysql,异步redis,数据库连接池,asyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询,swoole内置了Http/WebSocket服务器端/客户端/Http2.0服务器端。
什么是进程:所谓进程其实就是操作系统中一个正在运行的程序,我们在一个终端当中,通过运行PHP文件,这个时候就创建了一个进程
自动填充$HTTP_RAW_POST_DATA是不推荐的,将在将来的版本中删除。为了避免这个警告,在php.ini中将'always_populate_raw_post_data'设置为'-1',并使用php://输入流。在未知的第0行
熔断:熔断技术可以说是一种“智能化的容错”,当调用满足失败次数,失败比例就会触发熔断器打开,有程序自动哦切断当前的RPC调用,来防止错误进一步扩大。
实现一个熔断器主要是考虑两种模式 关闭 打开 半开
容错:当系统在运行时有错误被激活的情况下仍能保证不间断提供服务的技术和方法
容错就是允许犯错但是
第一章
共享内存:
共享内存不属于任何一个内存
共享内存分配的内存空间可以被任何进程访问
进程关闭 共享内存仍然可以存在
ipcs -m 查看共享内存段
fpm 多进程解析器 系统用于创建和销毁进程导致响应效率不高
swoole结构:
swoole 分为三层
Master R
manager 不做任何业务逻辑仅仅只做进程的管理
worker 是swoole的主逻辑进程用来处理客户端的请求
Task 异步逻辑进程 用来处理耗时较长的同步任务
进程与进程之间的联系是通过管道联系的
Task传递数据的大小:数据<8k直接写入管道传递;数据>8k;写入临时文件传递
Task传递对象:可以通过序列化传递一个对象的拷贝
Task中对对象的改变不会反应到worker进程中
数据库连接,网络连接对象不可传递
Task的回调问题
task的onFinish回调 会 回调给调用task的worker进程 保持数据一致性
Timer:
基于epoll的 timeout 机制实现
使用堆存放timer 提高检索效率 // 自行了解
swoole_timer_tick() 无限使用
swoole_timer_after() 只运行一次
timer 传递参数
可以通过tick方法的第三参数传递 使用use闭包传递参数
onTimer是在调用tick方法的进程中回调 因此可以直接使用在Worker进程重声明的对象(局部变量无法访问)
swoole_timer_clear($timer_id)
swoole_crontab
原理:使用tick方法,没一秒检查一次crontab任务表,如果发现有需要执行的任务,就通知worker进程处理任务
步骤:解析crontab配置文件(swoole_crontab),并存入DB
在tick的回调中检查所有的crontab任务,找到满足当前时序的任务 并执行
第二章
子进程会复制父进程的IO句柄
进程间的通信方式 管道
管道是一组2个特殊的描述符
管道需在fork函数调用前创建
如果某一端主动关闭管道 另一端的读取操作会直接返回0
进程通信方式===消息队列
独立于两个进程之外
通过指定key创建一个消息队列
在消息队列中传递的数据有大小限制
消息队列会一直保留直到被主动关闭(进程关闭 消息队列 不会消失 除非进程主动关闭它)
IO多路复用
Epoll函数会监听注册在自己名下的所有的socket描述符
当有socket感兴趣的时间发生时epoll函数才会响应,并返回有时间发生的socket集合
Epoll的本质是阻塞IO,他的优点在于能同时处理大量的socket链接
Event_loop 简介
event_loop是一个reactor线程 其中运行了一个epoll实例
可通过接口添加socket描述符到epoll监听中并指定时间响应的回调函数
Event_loop不可用于FPM环境下
退出事件轮询,此函数仅在Client程序中有效。
void swoole_event_exit(void)