目前我所了解的进程间通信的方式有:
1. PHP 消息队列(sysvmsg 扩展) 我的理解:
消息是一次性消耗品。一个进程向消息队列发送消息后,这个消息只能够被另一个进程接收,接收后,这个消息就彻底从消息队列中被去除了,其他进程就无法在访问了,所以,我认为消息队列是一次性消耗品。不适用于一个进程向多个进程广播内容的这种情况,不是很理想....
2. 信号量 + 共享内存 我的理解:
信号量实现资源的互斥,共享内存实现进程间通信。但是我担心,共享内存受到内存大小限制,或许不适用于某些场景。
3. 管道(有名管道,无名管道暂时不知道如何创建) 我的理解:
管道每次都是想管道文件末尾添加内容,读取的时候却只能从头读取到尾部,且在读取管道数据的时候,若是 提供了读取长度的条件,那么在管道内容的数据不足这个长度的时候,其会等到管道的内容有足够的内容时,才能够读取到内容,读取的时候,内容大多是被截断的这种情况.....非常令人无语!
4. socket 通信
前一段时间了解过,都是游离在表层,连自己的理解都谈不上...汗!
问题1:
以上的理解纯属个人理解,都是从实际写代码,看结果,得到的认知,具体正确性未知。麻烦先做一下指正分析,谢谢。
问题2:
不知道还有没有其他的进程间通信方式??
问题3:
请精简分析下各进程间通信方式的优缺点、用途(很重要...方式越多,选择性越多,选择难度越大!)
问题4:
我之所以了解PHP-cli,Linux,shell,pcntl等多进程扩展,进程间通信方式等,其最终目的是想:实现类似 QQ 的通信功能。而做这个功能我个人觉得应该可以极大程度的提高对高并发的认知(因为可以用多进程来模拟高并发,到时无论是cpu占用率,内存,数据库性能肯定都会暴露出令人感兴趣的表现),以及如何测量一个网站的访问规模(应该高并发下的网站表现,就确定了其访问规模大小),最重要的是还是对网络通信会有较深入的了解吧....请结合前面我所描述的假想,劳烦分析其正确性及可执行性,最好还是能提供较完备的实现 通信功能 所需的相关技术,谢谢...!
好问题。赞一个!
回答1:
传统应用(不仅限于php),常用匿名管道,命名管道、共享内存、窗口消息等方式来实现进程通讯。但是php不一样,php是收到一次请求运行一次,运行完就结束进程,并不适用传统的进程通讯方式。
回答2:
php中,或者说web后端开发中,redis订阅发布、数据库轮询的进程通讯方式使用比较多,因为web开发,执行效率永远不是首要考虑。而使用redis这样的第三方工具,可以实现分布式通讯。在不同的机器上,进程间也可以通讯。
回答3:
上面提到的很多进程通讯方式,要么不适用于web,要么不适用于php,但是redis却是广泛采用的。且没有什么致命缺陷。所以我建议使用这种方式。其他web开发者也容易理解,容易参与。不至于你写出一个工具却只能孤芳自赏。
回答4:
再精妙的技术选型也会有其并发上限。而web的分布式架构理论上是可以无限扩展的。所以某个技术的执行效率不再会成为整个应用的瓶颈。
如有意见,欢迎指正