msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

29 Oct 10 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


分享到:



Related Posts:

Tags: , , ,

29 Responses to “Mpass – PHP做Socket服务的解决方案”

  1. 《转载》Mpass – PHP做Socket服务的解决方案 – 猫の家 |

    [...] 本文地址: http://www.laruence.com/2010/10/29/1774.html [...]

  2. 《转载》PHP CLI模式下的多进程应用 – 猫の家 |

    [...] 本文地址: http://www.laruence.com/2010/10/29/1774.html [...]

  3. hwj |

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

  4. 漂泊云间 |

    果真是好东西

  5. walkor |

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

  6. walkor |

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

  7. KingW |

    http://www4swoole.sinaapp.com/ Swoole是一个PHP的C扩展,可用来开发PHP的高性能高并发TCP/UDP Server。

  8. 始终不够 |

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

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

  9. 03776 |

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

  10. Sunyanzi |

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

    勘误 … 我紧张了我 … ><

  11. Sunyanzi |

    雪候鸟大牛好 …

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

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

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

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

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

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

    恩就是这样 … 谢谢 …

  12. xiongrui888 |

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

  13. 雪候鸟 |

    @小桑 xmind

  14. 小桑 |

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

  15. 132CC.com » Blog Archive » 又一个PHP低概率Core的分析(PHP内存管理) |

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

  16. 132CC.com » Blog Archive » Mpass – PHP做Socket服务的解决方案 |

    [...] 本文地址: http://www.laruence.com/2010/10/29/1774.html [...]

  17. xi |

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

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

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

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

  18. PHP WebService得到通讯的SOAP包内容 | 路漫漫其修远兮 |

    [...] 本文地址: http://www.laruence.com/2010/10/29/1774.html [...]

  19. Mpass – PHP做Socket服务的解决方案 | 路漫漫其修远兮 |

    [...] 作者: laruence 原文地址:http://www.laruence.com/2010/10/29/1774.html [...]

  20. Mpass – PHP做Socket服务的解决方案 » NoNZero's Blog |

    [...] 本文地址: http://www.laruence.com/2010/10/29/1774.html [...]

  21. 神仙 |

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

  22. grom |

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

  23. 蘑菇姐姐 |

    顶一下。

  24. sharmy |

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

  25. baikaizhlg |

    鸟哥威武!!

  26. hfcorriez |

    期待中…

  27. 灵气 |

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

  28. Once |

    鸟哥V5!

  29. 张二 |

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

Leave a Reply

*