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 2015-10-14

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

  2. 漂泊云间
    漂泊云间 2015-08-19

    果真是好东西

  3. walkor
    walkor 2014-04-12

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

  4. walkor
    walkor 2014-04-10

    我参照着鸟哥的思路自己写了一个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. 始终不够
    始终不够 2013-02-13

    真心谢谢风大大了。我毕业设计,基于PHP的HTTP服务器,您这个框架解决了我一半的工作。

    不过也要研究透彻了才好,毕竟拿来直接用没什么意义。

  6. 03776
    03776 2012-12-03

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

  7. Sunyanzi
    Sunyanzi 2012-01-07

    上文最后一个 socket_bind 应该是 socket_listen …

    勘误 … 我紧张了我 … ><

  8. Sunyanzi
    Sunyanzi 2012-01-07

    雪候鸟大牛好 …

    我现在在实现一个多进程 socket server … 所以 mpass 肯定是必看的一个东西 …

    我注意到您在 mpass 里面使用 stream_socket_create 来创建一个 socket server …

    我想问一下这种方式和使用 socket_create / socket_bind / socket_bind 这个方式有什么区别么 ..?

    我要实现的是 socket 不停接收另外一个 server 传过来的指令 …

    指令的处理时间可能很长 … 所以需要交由子进程完成 …

    在这样的情境下使用哪种方式创建我的 socket server 会比较合适呢 ..?

    恩就是这样 … 谢谢 …

  9. xiongrui888
    xiongrui888 2011-11-07

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

  10. 小桑
    小桑 2011-03-09

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

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

  12. xi
    xi 2010-12-09

    如何避免内存泄露
    从后台程序的框架上讲,分两方面。
    一方面,考虑资源的完整释放。这个如果加载了业务代码,风险变得不可控。
    所以另一方面,考虑补救方法,当碰到意外的时候,如果处理意外。

    个人认为,work进程运行一次就退出,有点性能问题,一般设计运行次数,来解决。

    这样,listen进程到work进程的消息传递也是要考虑的。

    呵呵,php cli做server。是OK的。
    实际项目中有运用,空载来说的话,基本可以达到,c server的平均水平。

  13. 神仙
    神仙 2010-11-07

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

  14. grom
    grom 2010-11-03

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

  15. sharmy
    sharmy 2010-10-29

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

  16. 灵气
    灵气 2010-10-29

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

  17. Once
    Once 2010-10-29

    鸟哥V5!

  18. 张二
    张二 2010-10-29

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

Leave a Reply

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