workerman 这个 php 级的 socket 服务器框架 大家有了解过吗?

2015-02-11 16:58:40 +08:00
 nilai
性能怎么样? 能不能用到生产环境中?
38403 次点击
所在节点    PHP
42 条回复
aliang032
2015-02-12 13:36:07 +08:00
@scourgen
公司不是 10ss.net10ss.net 也是用了worekrman做的后台,听说产品已经在央视做广告了,产品卖的很不错
zhengkai
2015-02-12 15:24:37 +08:00
兜了半天圈子连个姓名都不敢报,早知道这样你还不如再多说点,几千几万台服务器的每天几百亿次请求什么的
benyur
2015-02-12 15:45:19 +08:00
我来看恐龙
zhengkai
2015-02-12 15:54:34 +08:00
可能是 @aliang032 是 Workerman 的作者之一,或者仅仅是个 fans,这项目能拿到四百个 github star 是不错,但是我相信业界的主流认识是 PHP 不是用来干这个的。你宣传自己的项目可以,但是没有根据的乱吹就不对了,所以说到几百台服务器用来跑这个时,我脑补的类比的就是一个人在吹嘘他们公司有十几个搞手绘的美术在用 Excel 画画

正确的解决方法是 golang/erlang 等适合做这个的语言,也可以辅以某种消息队列(这个选择就多了),把业务跟接口分开,业务还可以继续用 PHP

另外几百台服务器十几亿次请求我不知道是不是 @aliang032 的想象极限,首先我觉得既然都走 socket 了,应该强调的是并发而不是请求数吧,再次这数也没多少,20亿/86400秒/200台服务器,平均每秒也才130来个请求,峰值也上不了每秒一千,确实是 PHP 的作风,但这种效率完全没有必要专走 socket 啊,为什么不 over http。并且,要换个别的语言,用什么姿势都能秒了这么可怜的 qps 吧

什么语言适合做什么事情,是常识,跟你对这个语种的喜欢或者厌恶无关。这个项目是典型的“当你手里只有锤子时,你看什么都是钉子”
zhengkai
2015-02-12 15:59:45 +08:00
nilai
2015-02-12 16:24:41 +08:00
@zhengkai good 赞一个。
scourgen
2015-02-12 22:28:55 +08:00
@zhengkai 你看错了吧,坐网确实是我做过的项目,我负责底层框架的搭建和几个模块的重构和开发工作,所以就算我说了“是我做的”,我说得也没错啊,这难道有什么问题么?
aliang032
2015-02-14 11:53:05 +08:00
@zhengkai
呵呵,本来不想暴露隐私,没想到隐藏下公司名给你带来这么大的猜疑。

那我就说下吧,主要拿事实说话
本人名字叫李亮,是Workerman开源框架的作者,曾经在腾讯朋友、QQ相册、QQ空间做Coder工作。目前在聚美优品工作

1、腾讯朋友
我2010年毕业后第一份工作,持续2年左右。朋友网的后端开发全部是PHPer,朋友网使用的Server(当然不包括底层存储Server)也几乎都是PHP写的,包括Webserver(PWS)、 SOA服务器(PSF)、消息队列服务器(SAPS)。这些PHP写的Server部署超过千台,对,你没看错,超过千台的部署规模,具体可以参见PHP技术峰会 韩天峰 的PPT介绍或者视频录像。现在去朋友网抓下http头,还能看到 Server:Tencent/PWS 标识。

2、QQ相册
在朋友网任职期间曾负责photo.qq.com相册改版工作,同样除了底层存储,其他Server全部是用朋友网的那一套PHP写的Server部署的。由于photo.qq.com功能模块不复杂,所有Server只部署了十几台支撑了每天5000W左右的pv

3、QQ空间
QQ空间的开发都是写C/C++的,但是同样也部署了不少PHP写的Server,具体部署多少太不详,因为我只在QQ空间做了半年的开发。

前一阵看到CSDN关于企业QQ架构的专访,其中也说到了PHP写的Server在架构中的各种运用,这个是链接
http://www.csdn.net/article/2014-08-21/2821302-interview-tecent-b-qq-shuai-wang

我目前在聚美优品工作,聚美优品的后端Server(除了存储)几乎都是基于我写的PHPServer运行的,所有业务系统加起来确实有几百台。为何用这么多机器,我想你也应该知道原因了,聚美优品的限时抢购业务决定的,抢购的瞬时请求量非常恐怖,不用这么多机器,网站瞬间瘫痪了。

我待过的两家上市公司都有过这么大PHP server的部署规模,相信你不用再猜疑了。

为何这些大公司热衷于PHP写的Server呢,而不转 golang/erlang, 我想大概有以下原因:
1、首先是PHP写的Server和golang/erlang等语言写的Server在性能上没有多大的差距,尤其是业务中涉及频繁的IO操作时,比如mysql数据库等存储。性能差距一般只有在CPU密集型计算时才会显示出来,当然编译型的语言肯定胜出,其他脚本语言差距仍然不太大。

2、大公司某个项目的开发人员众多,当新增一个语言时会给开发工程师和运维工程师以及项目管理带来巨大的挑战和风险

3、PHP在Web容器下运行确实有很大的性能损耗,包括apache、nginx等Web容器自身的开销、Web容器与PHP通讯的开销,Web容器下PHP自身每个请求周期反复初始化执行环境最后有销毁一切的开销等。为了避免这些问题,使得PHP开发者去用PHP实现自己的Server

4、PHP的开发效率非常高,例如朋友网20多个PHPer每天都发布版本很多版本,有时候我自己一天都会发布几个版本。使用PHP能够快速开发迭代,迅速占领市场。自然用PHP写Server也会带来开发效率大大提升的好处。


@zhengkai 说的没错,什么语言适合做什么事情,但我要说的是PHP也同样适合写Server,如果能用合适的又是大家熟悉的语言去做效果会更好。

最后建议@zhengkai 不要道听途说,“相信业界主流认识是 PHP 不是用来干这个的”,请实践后再下结论。在我看来腾讯以及我现在所在的公司对PHP写的Server的大规模部署和实践应该足以说明PHP同样适合干这个。
yanzhen
2015-02-16 10:00:29 +08:00
不错啊,workman我就在用。
kimmykuang
2015-02-16 13:46:51 +08:00
正在玩workman
Tianpu
2015-04-13 13:50:56 +08:00
壮哉我大php,项目已经收藏
laibinbin
2015-10-28 17:28:46 +08:00
哇哇哇,壮大我 PHP
songsong
2015-11-05 20:17:59 +08:00
@aliang032 这个必须要给点赞!
ugg
2016-01-20 11:44:38 +08:00
@aliang032 请问在项目中是怎么处理数据库的连接的?一直保持长连接吗?要是是长连接的高并发下数据库的 last insert id 是怎么处理的?
chaosue
2016-03-10 16:53:48 +08:00
@ugg 运行在类似 workerman php 服务框架中的 mysql (包括 redis 、 mc )等,自然都是长连接,不需使用 pconnect, 因为这里不象 fpm(cgi)会回收所有资源。 而且长连接和 last insert id 没什么必然关系, 业务代码在进行 insert 之后,如果需要 last insert id 后,自然会去取出。每个请求进来,业务流程都是同样的先 insert 再 get last insert id, 正常逻辑下,不会存在请求一进入业务代码,还没进行任何 insert 就去 get last insert id.

另外,在没有使用连接池的情况下,连接是被当前进程独占的,不会存在当前进程 insert 的 id 被另外一个进程获取到。
如果使用了连接池,而且在每次 insert 完之后立即释放连接(此时当前的其他业务代码还未执行完), 则需考虑 last insert id 的问题。 一般这种情况,在数据库访问层框架中会封装一个 insert 方法,此方法将数据 insert 到数据库 》取回 last insert id 》释放连接 》返回 last insert id.
chaosue
2016-03-10 17:23:50 +08:00
@zhengkai 其实 wokerman 的作用不仅仅只是提供了一个可运行的 socket 服务那么简单。

为什么 java 的 service/web 要用 tomcat 类的(java 开发)的服务容器 而不同 nginx + fcgi 的方案。

同样地, php 的 service 运行在 workerman 上,在语言特性上无缝整合,各个层上的对象都是 native 的,可共享和操作, workerman 层即可捕捉业务代码的异常,进行统一处理、汇报、统计。这里只提其中的一点优势,新特性和新系统需求的开发效率那些就不重述了。 其它的再经过实际的中大规模开发、合作、运行后自然能体会到。 当然,一般的业务 coder 可能不用去思考这方面,大多都是人云亦云,再和自己的某些经验对号入座,自然形成不同的认识。
chunguang
2016-07-22 16:24:10 +08:00
workerman 基于 PHP 多进程以及 libevent 事件轮询,性能不用多说,平均 qps 1.5w 没啥问题,当然硬件不要太烂!
elarity
2016-10-02 20:30:25 +08:00
@zhengkai 这脸被打的,啪啪的
zuohuadong
2018-01-03 18:00:41 +08:00
@zhengkai 666 这回复
xixilili
2018-04-29 10:58:14 +08:00
@zhengkai 啪啪啪啪啪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/170206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX