前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的 模块。
swoole多进程
swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。
首先,确保安装的swoole版本大于1.7.2:
注意:swoole_process在最新的1.8.0版本已经禁止在Web环境中使用了,所以也只能支持命令行。
swoole提供的多进程扩展基本功能和pcntl提供的一样,但swoole更易简单上手,并且提供了:
默认基于unixsock的进程间通信;
支持消息队列作为进程间通信;
基于signalfd和eventloop处理信号,几乎没有任何额外消耗;
高精度微秒定时器;
配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式
swoole_process 模块提供的方法(Method)主要分为四部分:
基础方法
管道通信
消息队列通信
信号与定时器
基础应用
本例实现的是tcp server,特性:
多进程处理客户端连接
子进程退出,Master进程会重新创建一个
支持事件回调
主进程退出,子进程在干完手头活后退出
运行后可以使用telnet连接:
由于设置了最大三个子进程,最多只能接受3个客户端连接。
进程间通信
前面讲解的例子里,主进程和子进程直接是没有直接的数据交互的。如果主进程需要得到的来自子进程的反馈,或者子进程接受来自主进程的数据,那么就需要进程间通信了。
swoole内置了管道通信和消息队列通信。
管道通信
管道通信主要是数据传输:一个进程需要将数据发送给另外一个进程。
这个swoole封装后,使用非常简单:
运行:
注意点:
1、管道数据读取是同步阻塞的;上面的例子里如果子进程里再加一句 ,会一直阻塞。可以使用 将管道加入到事件循环中,变为异步模式。
2、子进程里的输出(例如echo)与write效果相同。
3、通过管道发数据到子进程。管道是单向的:发出的数据必须由另一端读取。不能读取自己发出去的。
防盗版声明:本文系原创文章,发布于公众号 (fhyblog)及博客园,转载需作者同意。
消息队列通信
消息队列与管道有些不一样:消息队列是全局的,所有进程都可以发送、读取。你可以把它看做redis list结构。
消息队列更常见的用途是主进程分配任务,子进程消费执行。
运行结果:
注意点:
1、所有进程共享使用一个消息队列;
2、消息队列的读取操作是阻塞的,可以在 的时候第2个参数mode改为 ,则是异步的。mode仅仅设置为 是阻塞的,示例里去掉 后读取消息的while会死循环。
3、子进程前面加了个 ,这是为了防止父进程还未往消息队列中加入内容直接退出。
4、子进程末尾也加了sleep,这是为了防止一个进程把所有消息都消费完了,实际应用需要去掉。
信号与定时器
支持微秒定时器:
运行:
注:alarm不能和 同时使用。
参考
1、Process-Swoole-Swoole文档中心
https://wiki.swoole.com/wiki/page/p-process.html
推广时间
最近在GitChat开了一期 Chat ,主题是《PHP Socket 编程进阶指南》,主要和大家讲解 PHP Socket 编程相关知识。通过参与本场 Chat,您将学到如下内容:
熟悉 Socket 系列函数。
熟悉 stream_socket 系列函数。
如何使用 Socket 系列函数实现 TCP 服务端和客户端?
如何使用 socket_select 实现 I/O 多路复用?
如何使用 stream_socket 系列函数实现TCP服务端和客户端?
如何使用 stream_select 实现 I/O 多路复用?
欢迎感兴趣的朋友参加或者帮忙宣传!
领取专属 10元无门槛券
私享最新 技术干货