- 本文地址: https://www.laruence.com/2010/10/29/1774.html
- 转载请注明出处
一般很少有用PHP做服务的, 但是如果你的已有业务逻辑都是PHP实现的, 而现在却需要基于已有的业务逻辑提供一套Socket服务, 怎么办?
当然, 解决方法很多, 但最简单的办法, 还是直接使用PHP做Socket服务.
而这样做要解决的问题有很多, 主要要解决的问题有如下几个:
1. 作为后台服务,需要常驻后台运行, 那么丁点的内存泄露都是不能接受的. 2. 作为后台服务,畸形数据导致进程异常退出, 也是不可接受的. 3. 作为后台服务, 要能做到graceful restart. 4. 作为后台服务, 对资源的使用必须在可接受的范围以内.
最近,我就基于PHP的pcntl扩展实现一个简单的提供Socket服务的框架. 取其名为Mpass(Multi-Processes Socket Server).
主要结构如下:
我之前的文章PHP CLI模式下的多进程应用介绍过在PHP做服务的时候如何避免内存泄露, 所以基于此, 再加上PHP5以后的stream_socket_*系列API, 就完成了这一套框架.
至于Graceful restart, 通过pcntl_signal函数, 在接受到restart/shutdown信号时刻, 做关闭清理动作, 保证不会因为重启/关闭而使得正在执行的逻辑出错.
有类似需求的朋友, 可以借鉴.
项目地址&下载地址 : Mpass
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
谢谢,在为,公司主机登录.连接后台tcp协议通讯头大呢!
果真是好东西
workerman也是一个高性能的php socket 服务器框架,可以很方便的开发一些PHP应用服务。
我参照着鸟哥的思路自己写了一个php socket 框架
名字叫workerman,在鸟哥的基础上加了一些特性如下
1、支持TCP/UDP
2、预先派生进程,性能更好
3、能够监控文件更新
4、支持平滑启动
5、支持长链接
6、支持libevent事件轮询库,支持高并发
7、支持子进程接收指定次数请求后安全退出(减少业务内存泄漏)
8、支持指定用户运行子进程 (从安全方面考虑)
我这边压力测试性能非常不错,四核pc机器 helloworld 短链接能够达到3W/秒请求量,长链接能够达到9W+/s的请求量。
占用内存 4*8M=32M内存,cpu 55% 。
最主要的是这个框架在我公司已经用上了,7台机器每天承受1.5亿的请求量,没出现任何问题。
由此看来php的socket性能还是非常不错的。之前很多人说php socket性能不行的观点看来不是那么准确,还是实践出真知。
http://www4swoole.sinaapp.com/ Swoole是一个PHP的C扩展,可用来开发PHP的高性能高并发TCP/UDP Server。
真心谢谢风大大了。我毕业设计,基于PHP的HTTP服务器,您这个框架解决了我一半的工作。
不过也要研究透彻了才好,毕竟拿来直接用没什么意义。
项目中涉及到这块,过来看看。
上文最后一个 socket_bind 应该是 socket_listen …
勘误 … 我紧张了我 … ><
雪候鸟大牛好 …
我现在在实现一个多进程 socket server … 所以 mpass 肯定是必看的一个东西 …
我注意到您在 mpass 里面使用 stream_socket_create 来创建一个 socket server …
我想问一下这种方式和使用 socket_create / socket_bind / socket_bind 这个方式有什么区别么 ..?
我要实现的是 socket 不停接收另外一个 server 传过来的指令 …
指令的处理时间可能很长 … 所以需要交由子进程完成 …
在这样的情境下使用哪种方式创建我的 socket server 会比较合适呢 ..?
恩就是这样 … 谢谢 …
拜读了您的相关文章,很是钦佩,有一事想请教您,我用php做了一个socket服务端,但这个服务端怎么不能持久运行,一般只能运行几个小时。怎么才能保证这个服务端的一直运行呢?
@小桑 xmind
我想问下博主你那结构图用神马工具做的….
[…] Mpass – PHP做Socket服务的解决方案 Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2) […]
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
如何避免内存泄露
从后台程序的框架上讲,分两方面。
一方面,考虑资源的完整释放。这个如果加载了业务代码,风险变得不可控。
所以另一方面,考虑补救方法,当碰到意外的时候,如果处理意外。
个人认为,work进程运行一次就退出,有点性能问题,一般设计运行次数,来解决。
这样,listen进程到work进程的消息传递也是要考虑的。
呵呵,php cli做server。是OK的。
实际项目中有运用,空载来说的话,基本可以达到,c server的平均水平。
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
[…] 作者: laruence 原文地址:http://www.laruence.com/2010/10/29/1774.html […]
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
[…] 本文地址: http://www.laruence.com/2010/10/29/1774.html […]
我倒是用libevent扩展做过一个服务。
pcntl就用来变daemon了。
我想了解一下这个框架性能如何,支持并发量多少?
过几天跟进看看。
顶一下。
太威武了,我手里的项目正在为这个东西头疼,在想要不要用c++做接口,看看这个再说。
鸟哥威武!!
期待中…
脚本语言做守护还是很轻巧的。
鸟哥V5!
哈哈,一楼哦,狂顶一下。