首页 存档 技术 查看内容

从并发处理谈PHP进程间通信(一)外部介质 进程间通信 文件 mysql redis 总结:

2018-3-30 13:00 |来自: 互联网 437 0

摘要: 进程间通信 进程间通信(IPC,Inter-Process Communication),多进程开发中,进程间通信是一个永远也绕不开的问题。在 web开发中,我们经常遇到的并发请求问题,本质上也可以作为进程间通信来处理。 进程间通信,指 ...

进程间通信

进程间通信(IPC,Inter-Process Communication),多进程开发中,进程间通信是一个永远也绕不开的问题。在 web开发中,我们经常遇到的并发请求问题,本质上也可以作为进程间通信来处理。

进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(严格说来是线程)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。

根据定义可知,要进行进程间通信,我们需要解决两个问题:

  • 互相访问:消息传输和暂时存储介质选择问题;

  • 协调工作:消息的存取冲突问题;

文章介绍的中心就是围绕着这么两点来说的, 为了更使文章更简明,这边以之前在公司做的一个需求为例:

需要一个循环ID生成器,循环生成从 Min 到 Max 的数字ID,在ID递增到 Max 后,返回到 Min 重新开始递增;必须能保证多个进程并发请求时生成的ID不同。

此需求要解决的问题恰好为我们要解决的进程间通信需要解决的两个问题:

  • 需要一个消息传输通道来传输和存储当前的递增值。这个比较容易解决,我们常用的文件、数据库、session、缓存等都能做到。

  • 需要解决多进程同时访问生成器生成相同ID的问题。要满足这个需要就必须要用到锁了,而且为了保证多个进程读取的数据是不同的,需要互斥锁,另外为了能保证调用成功率,锁的获取最好能实现自旋。

本文通过此需求的不同实现,来介绍通过外部介质进行的进程间通信的方式。另外,不只PHP语言,其他语言也能使用这些方法。

文章如有错漏之处,烦请指出,如果您有更优的办法,欢迎在下面留言讨论。


文件

flock

文件是最基本的存储介质,它当然可以作为消息的传输通道来使用。文件的存取各种语言都有各自的多种方案,问题点是多进程并发时的冲突问题。

解决存取冲突问题我们使用PHP的flock()函数:

bool flock ( resource $handle , int $operation [, int

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部