PHP多进程系列笔记(五)

前面几节都是讲解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 多路复用?

欢迎感兴趣的朋友参加或者帮忙宣传!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180626G08O5800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券