V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nilai
V2EX  ›  PHP

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

  •  
  •   nilai · 2015-02-11 16:58:40 +08:00 · 38062 次点击
    这是一个创建于 3363 天前的主题,其中的信息可能已经有所发展或是发生改变。
    性能怎么样? 能不能用到生产环境中?
    42 条回复    2018-07-23 16:27:19 +08:00
    zhengkai
        1
    zhengkai  
       2015-02-11 17:06:03 +08:00   ❤️ 1


    用 PHP 干这个就跟用 Excel 画恐龙差不多
    t6attack
        2
    t6attack  
       2015-02-11 17:15:56 +08:00
    推荐php扩展:swoole
    nilai
        3
    nilai  
    OP
       2015-02-11 17:18:42 +08:00
    @zhengkai 怎么回复的图片呢?
    thankyourtender
        4
    thankyourtender  
       2015-02-11 17:43:54 +08:00
    @zhengkai 不错啊
    zhengkai
        5
    zhengkai  
       2015-02-11 18:03:48 +08:00
    @nilai 把图片传到 http://imgur.com/ ,注意要贴图片地址,而不是网页地址
    aliang032
        6
    aliang032  
       2015-02-11 18:15:43 +08:00   ❤️ 1
    我们公司几百台服务器用着呢,没出现任何问题,非常好用。每天十几亿的请求请求哦
    zhengkai
        7
    zhengkai  
       2015-02-11 18:24:34 +08:00
    @aliang032 你们用几百台 php server 处理纯 socket 请求?很好奇是哪家公司
    aliang032
        8
    aliang032  
       2015-02-11 19:03:59 +08:00
    对,几百台 php server 处理纯socket请求,公司所有的服务都是 这个些 php server提供的
    nilai
        9
    nilai  
    OP
       2015-02-11 19:20:17 +08:00
    @aliang032 是不是c++或者Go 性能要好些呢。
    raincious
        10
    raincious  
       2015-02-11 19:40:49 +08:00
    @nilai

    说到C++,如果你不想一边写网页一边担心缓冲区溢出、对象没事放干净什么的,还是别考虑了,用Go挺好。
    zhengkai
        11
    zhengkai  
       2015-02-11 20:14:00 +08:00   ❤️ 1
    @aliang032 能说下哪家公司么?
    scourgen
        12
    scourgen  
       2015-02-11 20:25:11 +08:00
    @zhengkai 应该是10ss.net,能上网的小票打印机,他们应该在使用workerman处理订单业务。
    zhengkai
        13
    zhengkai  
       2015-02-11 21:06:18 +08:00
    @scourgen 呦,在这碰见了,或许咱们可以再聊聊 @coolish

    另外我对你花了三个月把 zuo.com 换完框架然后到猫扑上说是你做的这件事非常无语……
    mactalk
        14
    mactalk  
       2015-02-11 23:02:01 +08:00
    swoole
    mactalk
        15
    mactalk  
       2015-02-11 23:15:38 +08:00
    invite
        16
    invite  
       2015-02-12 08:32:13 +08:00
    @mactalk 多线程的?
    nilai
        17
    nilai  
    OP
       2015-02-12 09:52:34 +08:00
    @mactalk swoole这个看了下介绍,还挺厉害的。
    mactalk
        18
    mactalk  
       2015-02-12 12:00:45 +08:00
    @invite 嗯,其实就是c写的扩展啦。跟node主要依靠c/c++道理一样
    aliang032
        19
    aliang032  
       2015-02-12 13:30:43 +08:00
    @zhengkai
    点错按钮了。公司名不说了,是一家上市公司
    aliang032
        20
    aliang032  
       2015-02-12 13:34:13 +08:00
    @nilai
    挂上业务mysql数据库等存储,c++或者Go 大家的性能都差不多。

    php的优势是开发敏捷,性能又够用,加上PHPer好找啊。
    aliang032
        21
    aliang032  
       2015-02-12 13:36:07 +08:00
    @scourgen
    公司不是 10ss.net10ss.net 也是用了worekrman做的后台,听说产品已经在央视做广告了,产品卖的很不错
    zhengkai
        22
    zhengkai  
       2015-02-12 15:24:37 +08:00
    兜了半天圈子连个姓名都不敢报,早知道这样你还不如再多说点,几千几万台服务器的每天几百亿次请求什么的
    benyur
        23
    benyur  
       2015-02-12 15:45:19 +08:00
    我来看恐龙
    zhengkai
        24
    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
        25
    zhengkai  
       2015-02-12 15:59:45 +08:00
    nilai
        26
    nilai  
    OP
       2015-02-12 16:24:41 +08:00
    @zhengkai good 赞一个。
    scourgen
        27
    scourgen  
       2015-02-12 22:28:55 +08:00
    @zhengkai 你看错了吧,坐网确实是我做过的项目,我负责底层框架的搭建和几个模块的重构和开发工作,所以就算我说了“是我做的”,我说得也没错啊,这难道有什么问题么?
    aliang032
        28
    aliang032  
       2015-02-14 11:53:05 +08:00   ❤️ 5
    @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
        29
    yanzhen  
       2015-02-16 10:00:29 +08:00
    不错啊,workman我就在用。
    kimmykuang
        30
    kimmykuang  
       2015-02-16 13:46:51 +08:00
    正在玩workman
    Tianpu
        31
    Tianpu  
       2015-04-13 13:50:56 +08:00 via iPhone
    壮哉我大php,项目已经收藏
    laibinbin
        32
    laibinbin  
       2015-10-28 17:28:46 +08:00
    哇哇哇,壮大我 PHP
    songsong
        33
    songsong  
       2015-11-05 20:17:59 +08:00
    @aliang032 这个必须要给点赞!
    ugg
        34
    ugg  
       2016-01-20 11:44:38 +08:00
    @aliang032 请问在项目中是怎么处理数据库的连接的?一直保持长连接吗?要是是长连接的高并发下数据库的 last insert id 是怎么处理的?
    chaosue
        35
    chaosue  
       2016-03-10 16:53:48 +08:00   ❤️ 1
    @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
        36
    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
        37
    chunguang  
       2016-07-22 16:24:10 +08:00
    workerman 基于 PHP 多进程以及 libevent 事件轮询,性能不用多说,平均 qps 1.5w 没啥问题,当然硬件不要太烂!
    elarity
        38
    elarity  
       2016-10-02 20:30:25 +08:00
    @zhengkai 这脸被打的,啪啪的
    zuohuadong
        39
    zuohuadong  
       2018-01-03 18:00:41 +08:00
    @zhengkai 666 这回复
    xixilili
        40
    xixilili  
       2018-04-29 10:58:14 +08:00
    @zhengkai 啪啪啪啪啪
    bigxu
        41
    bigxu  
       2018-05-07 10:42:24 +08:00
    v2ex 是不是发主帖和回复都不可删除,或者编辑,最多只能补充?如果是这样,我觉得有意思。 试一试
    dosgo
        42
    dosgo  
       2018-07-23 16:27:19 +08:00
    我修改了一个 swoole 版本的 socket.io 服务器。https://github.com/dosgo/sw-socketio
    正在测试准备丢生产环境。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2875 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:28 · PVG 17:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.