Press "Enter" to skip to content

Mpass - PHP做Socket服务的解决方案

一般很少有用PHP做服务的, 但是如果你的已有业务逻辑都是PHP实现的, 而现在却需要基于已有的业务逻辑提供一套Socket服务, 怎么办?
当然, 解决方法很多, 但最简单的办法, 还是直接使用PHP做Socket服务.
而这样做要解决的问题有很多, 主要要解决的问题有如下几个:

1. 作为后台服务,需要常驻后台运行, 那么丁点的内存泄露都是不能接受的.
2. 作为后台服务,畸形数据导致进程异常退出, 也是不可接受的.
3. 作为后台服务, 要能做到graceful restart.
4. 作为后台服务, 对资源的使用必须在可接受的范围以内.

最近,我就基于PHP的pcntl扩展实现一个简单的提供Socket服务的框架. 取其名为Mpass(Multi-Processes Socket Server).
主要结构如下:

Mpass

我之前的文章PHP CLI模式下的多进程应用介绍过在PHP做服务的时候如何避免内存泄露, 所以基于此, 再加上PHP5以后的stream_socket_*系列API, 就完成了这一套框架.
至于Graceful restart, 通过pcntl_signal函数, 在接受到restart/shutdown信号时刻, 做关闭清理动作, 保证不会因为重启/关闭而使得正在执行的逻辑出错.
有类似需求的朋友, 可以借鉴.
项目地址&下载地址 : Mpass

31 Comments

  1. hwj
    hwj October 14, 2015

    谢谢,在为,公司主机登录.连接后台tcp协议通讯头大呢!

  2. 漂泊云间
    漂泊云间 August 19, 2015

    果真是好东西

  3. walkor
    walkor April 12, 2014

    workerman也是一个高性能的php socket 服务器框架,可以很方便的开发一些PHP应用服务。

  4. walkor
    walkor April 10, 2014

    我参照着鸟哥的思路自己写了一个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性能不行的观点看来不是那么准确,还是实践出真知。

  5. 始终不够
    始终不够 February 13, 2013

    真心谢谢风大大了。我毕业设计,基于PHP的HTTP服务器,您这个框架解决了我一半的工作。
    不过也要研究透彻了才好,毕竟拿来直接用没什么意义。

  6. 03776
    03776 December 3, 2012

    项目中涉及到这块,过来看看。

  7. Sunyanzi
    Sunyanzi January 7, 2012

    上文最后一个 socket_bind 应该是 socket_listen …
    勘误 … 我紧张了我 … ><

  8. Sunyanzi
    Sunyanzi January 7, 2012

    雪候鸟大牛好 …
    我现在在实现一个多进程 socket server … 所以 mpass 肯定是必看的一个东西 …
    我注意到您在 mpass 里面使用 stream_socket_create 来创建一个 socket server …
    我想问一下这种方式和使用 socket_create / socket_bind / socket_bind 这个方式有什么区别么 ..?
    我要实现的是 socket 不停接收另外一个 server 传过来的指令 …
    指令的处理时间可能很长 … 所以需要交由子进程完成 …
    在这样的情境下使用哪种方式创建我的 socket server 会比较合适呢 ..?
    恩就是这样 … 谢谢 …

  9. xiongrui888
    xiongrui888 November 7, 2011

    拜读了您的相关文章,很是钦佩,有一事想请教您,我用php做了一个socket服务端,但这个服务端怎么不能持久运行,一般只能运行几个小时。怎么才能保证这个服务端的一直运行呢?

  10. 小桑
    小桑 March 9, 2011

    我想问下博主你那结构图用神马工具做的….

  11. […] Mpass – PHP做Socket服务的解决方案 Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2) […]

  12. xi
    xi December 9, 2010

    如何避免内存泄露
    从后台程序的框架上讲,分两方面。
    一方面,考虑资源的完整释放。这个如果加载了业务代码,风险变得不可控。
    所以另一方面,考虑补救方法,当碰到意外的时候,如果处理意外。
    个人认为,work进程运行一次就退出,有点性能问题,一般设计运行次数,来解决。
    这样,listen进程到work进程的消息传递也是要考虑的。
    呵呵,php cli做server。是OK的。
    实际项目中有运用,空载来说的话,基本可以达到,c server的平均水平。

  13. 神仙
    神仙 November 7, 2010

    我倒是用libevent扩展做过一个服务。
    pcntl就用来变daemon了。

  14. grom
    grom November 3, 2010

    我想了解一下这个框架性能如何,支持并发量多少?
    过几天跟进看看。

  15. sharmy
    sharmy October 29, 2010

    太威武了,我手里的项目正在为这个东西头疼,在想要不要用c++做接口,看看这个再说。

  16. 灵气
    灵气 October 29, 2010

    脚本语言做守护还是很轻巧的。

  17. Once
    Once October 29, 2010

    鸟哥V5!

  18. 张二
    张二 October 29, 2010

    哈哈,一楼哦,狂顶一下。

Leave a Reply to grom Cancel reply

Your email address will not be published. Required fields are marked *