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

PHP -jit 进展顺利

  •  
  •   gouchaoer · 2017-05-23 13:38:03 +08:00 via Android · 8494 次点击
    这是一个创建于 2739 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚鸟哥放出了 php-jit 性能 benchmark: https://m.weibo.cn/1170999921/4110546237847160

    还没放出的 php7.2 大家看到没有,我大胆估计 php-jit 会搭载到 opcache 随 php7.2 放出,这是 php-jit 是透明兼容的
    38 条回复    2017-05-24 23:29:21 +08:00
    firebroo
        1
    firebroo  
       2017-05-23 13:54:37 +08:00
    牛逼~
    NoAnyLove
        2
    NoAnyLove  
       2017-05-23 14:07:19 +08:00
    每次看到这种东西,我就想往自己的 TODO List 上加入新的想学的内容。。。。。。然而 TODO List 尚未有一项完成任务,我也很绝望啊
    mrgeneral
        3
    mrgeneral  
       2017-05-23 15:00:20 +08:00
    @NoAnyLove #2 把 list 删掉就好了
    jhdxr
        4
    jhdxr  
       2017-05-23 17:57:16 +08:00
    然而这是 benchmark,在实际项目中的提升并不知道是多少(最近一次的消息依然是 jit 在实际项目是略微下降的)。
    php 7.2 还有两个月 feature freeze,我觉得不一定能赶上

    btw, 上周 internals 的邮件组里有提到一个 hybrid vm ( http://news.php.net/php.internals/99043 )这才是 php7.2 更有可能搭载的东西
    vus520
        5
    vus520  
       2017-05-23 18:01:40 +08:00
    拥抱 GO,回头草还得吃啊
    liuxu
        6
    liuxu  
       2017-05-23 18:42:48 +08:00
    没有最好的语言,只有最好的开发者。。6 了
    wujunze
        7
    wujunze  
       2017-05-23 18:49:55 +08:00
    我推测 php7.2 不会有 JIT php8 可能会有 JIT
    gouchaoer
        8
    gouchaoer  
    OP
       2017-05-23 19:11:57 +08:00 via Android
    @wujunze 短期内不会有 php8 的
    wdlth
        9
    wdlth  
       2017-05-23 21:17:23 +08:00
    只是 benchmark 提升的话意义不大,毕竟大多数瓶颈在 IO 上。
    sagaxu
        10
    sagaxu  
       2017-05-23 22:37:31 +08:00   ❤️ 1
    赶紧把 fpm 这种记不住东西的方式 deprecate 吧,不常驻内存,限制还是太大了
    gouchaoer
        11
    gouchaoer  
    OP
       2017-05-23 23:33:22 +08:00 via Android
    @sagaxu 单纯 helloworld 的话 php-fpm 和 swoole 啥的 qps 是一样的。。。不常驻内存的好处你又不是不知道,只此一家别无分店
    hxdhttk
        12
    hxdhttk  
       2017-05-24 00:37:40 +08:00
    PHP 的 jit 不知道有没有人对下面的项目感兴趣:
    http://www.peachpie.io
    hjc4869
        13
    hjc4869  
       2017-05-24 00:51:47 +08:00 via iPhone
    想试试这个 bench 用 peachpie 编译成 .NET 字节码能跑多快
    vibbow
        14
    vibbow  
       2017-05-24 01:12:19 +08:00
    @hjc4869 欸,之前 devsense 搞得那个把 PHP 编译成.Net 被弃坑了么...
    orvice
        15
    orvice  
       2017-05-24 01:54:54 +08:00
    @gouchaoer 好处除了不用担心内存泄露还有啥?
    jarlyyn
        16
    jarlyyn  
       2017-05-24 02:56:16 +08:00 via Android
    @gouchaoer

    没听说过 Cgi 么

    怎么可能只此一家……
    gouchaoer
        17
    gouchaoer  
    OP
       2017-05-24 09:16:12 +08:00 via Android
    @orvice 不容易搞挂服务;热更新代码
    这 2 点非常重要


    @jarlyyn php 之外的语言提供 http 服务实际上是开了一个命令行应用监听端口,而 php-fpm 是一组 c 实现的 php 进程管理器在动态的解析被请求的 php 文件,二者有本质区别
    sagaxu
        18
    sagaxu  
       2017-05-24 09:59:31 +08:00
    @gouchaoer 这两点跟常驻没关系啊,python 容器和 ruby 容器也有每处理 xx 个请求重启进程的功能,像 tomcat 这样不重启的,也没见过容易挂的。热部署连 Java 这样的都支持。
    jarlyyn
        19
    jarlyyn  
       2017-05-24 10:05:55 +08:00
    @gouchaoer

    不要搞挂服务?服务该挂的时候就该挂。不然数据都可能被污染……

    至于热更新代码,php 还真不很很好的热更新代码。至少在“热更新”的时候,是可能混杂几个版本的程序运行的。

    而 php-fpm 也和普通的 cgi 程序没什么本质区别。

    php 的确会有其独特的生命力。

    但真心不在这几块。
    szopen
        20
    szopen  
       2017-05-24 10:14:40 +08:00
    @gouchaoer 如果官方能将 libevent, ev, eio 等扩展优化好,我想大家都会很热忠于在框架中集成 web 服务组件,
    这就和 python 有 gevent 之类的扩展一样,
    gouchaoer
        21
    gouchaoer  
    OP
       2017-05-24 10:29:08 +08:00
    @szopen 首先跑在 php-fpm 里面的框架基本上用不上 libevent 之类的,php-cli 才会用。。。其次,php 的事件扩展有几个 Event、Ev 等(包装的 libevent,ev 之类的)。。。。。gevent 我没直接用过,不过基于 gevent 的 GRequests 我用过,php 下的 Guzzle 你可以选择用 Event 或者不用,二者的可用性啥的那当然是 php 好啊。。。gevent 的那个改变同步接口的实现不是本来就不好么,连 py 的 gevent 都来和 php 叫板。。。
    gouchaoer
        22
    gouchaoer  
    OP
       2017-05-24 10:32:52 +08:00
    @jarlyyn 我觉得服务还是不要挂比较好,数据会被污染是啥意思?
    git 热更新的时候的确可能混杂几个版本,但是不用停止服务,以及大部分时候热更新也只是更新一两个文件,比起别的语言还是很方便的。

    那你来说说 php 独特的生命力在哪里
    jarlyyn
        23
    jarlyyn  
       2017-05-24 10:36:28 +08:00
    @gouchaoer

    首先,不知道你挂服务的意思,一般程序也就挂个当前链接。如果连服务都挂了,那错误就严重了。严重错误下,个人觉得,数据都不可信了。

    其次,真的线上更新能这样更么……

    生命力?

    对虚拟空间的支持,最强大的模板语言,专注于网络其他方面干扰的库很少,数量庞大的轮子。
    tabris17
        24
    tabris17  
       2017-05-24 10:39:25 +08:00
    让别人去试错,技术成熟了再使用,这样文档和资料也会多很多,不要去趟雷
    gouchaoer
        25
    gouchaoer  
    OP
       2017-05-24 10:43:10 +08:00
    @jarlyyn 我还是无法理解你这个宁愿服务挂了的逻辑

    真的线上更新为啥不能这么做,要不然你要怎么做?把 php-fpm 停了,git 更新完代码,把 php-fpm 启动,哦对了这么做还得先把流量切到别的应用服务器,完了切回来
    jarlyyn
        26
    jarlyyn  
       2017-05-24 10:47:13 +08:00
    @gouchaoer

    如果不能理解,那么就算了。

    线上更新肯定是把流量先切掉的吧?
    PythonAnswer
        27
    PythonAnswer  
       2017-05-24 11:10:05 +08:00 via Android
    可惜我大 python 不给力
    wujunze
        28
    wujunze  
       2017-05-24 11:13:43 +08:00
    @hxdhttk 记得之前看到过 把 PHP 运行在 JVM 上的项目
    sagaxu
        29
    sagaxu  
       2017-05-24 12:39:09 +08:00
    @gouchaoer 现在谁还玩手动发布啊?都是提交到库里,然后自动跑单元测试,测试完自动打包,发布的时候选一个版本,勾上要发布到集群里哪几台机器,然后点发布就完事了,不管什么语言什么打包机制,统统都一样。

    Java 应用手动发布也很简单,把新 war 包扔到 tomcat 发布目录,它会在完成解压和 load 之后自动把流量切给新部署的 app,python 的也很简单,文件更新后,执行一下 uwsgi --reload 就可以了。
    gouchaoer
        30
    gouchaoer  
    OP
       2017-05-24 12:48:11 +08:00 via Android
    @sagaxu 你能教我这一套怎么搞么?不会
    gouchaoer
        31
    gouchaoer  
    OP
       2017-05-24 12:48:57 +08:00 via Android
    @sagaxu 我毕业后就在一个小厂工作,大厂的工具没见过
    jevonszmx
        32
    jevonszmx  
       2017-05-24 13:26:12 +08:00
    @gouchaoer

    原理和流程 sagaxu 写得蛮清楚的了,按照他这个思路自己写脚本即可。可以用脚本自己实现,也可以依赖其他的持续集成工具。

    我们大致的流程是:

    # 制定 svn/git 规范,比如 release/master 就是线上代码,trunk 就是生产代码;
    # 制定代码目录规范,比如 tests 目录是单元测试用例代码;
    # 代码全部测试完成,leader 合并分支代码到线上目录;
    # 发布后台点击“发布”,脚本依次执行:
    ## 从指定分支 checkout 代码;
    ## 运行单元测试;
    ## 代码打包:php 可能要 require 一些依赖项目 /配置,java 可能要打成 war 包;
    ## 代码传到指定服务器(也可以先到测试服务器):php 直接复制到指定目录即可; java 要多一点,kill 掉 tomcat、复制 war 包、重启 tomcat ;
    ## 检测环境是否正常:预先写好一些本地脚本,当前机器发布完自动调用测试一下响应和状态;
    ## 发送邮件 /记日志...

    通过一系列的 shell 脚本串联起来即可。
    gouchaoer
        33
    gouchaoer  
    OP
       2017-05-24 13:34:02 +08:00 via Android
    @jevonszmx 太难了我不会,我要那种开源在 github 上的,我 clone 下了改几下就能用的,最好有图文教程的,轻轻松松就能搞定的。。。。单元测试不是重点,重点是怎么在后台点一下就把代码发布到主机上,而且发布的时候流量是不走发布机器的,发布完了又自动把流量切回来的
    xujif
        34
    xujif  
       2017-05-24 13:43:21 +08:00
    @gouchaoer 应该说连 python 都敢和 php 叫板( web 领域)
    gouchaoer
        35
    gouchaoer  
    OP
       2017-05-24 13:50:35 +08:00 via Android
    我觉得这个方案不错诶: http://www.oschina.net/question/942494_2208510?sort=default


    我在每台机器上跑个 php-cli 监控 redis 的更新指令,更新指令来了先去通知 nginx/load balancer 把我这个节点的流量关了,然后 php-cli 调用 git 去 repo 拉代码,完了通知 nginx 把流量切回来
    jhdxr
        36
    jhdxr  
       2017-05-24 15:35:39 +08:00
    @gouchaoer 实际上大厂的服务都是集群,更新的时候就是下线部分 server,更新完再上线的。切流量这种事情不应该是 LBS 的最基础的工作么。再举个热更新的例子,你研究过输入法,或者至少是搜狗这种的更新么?已经打开的继续用老版本的,新开的程序要用输入法时去用新的。不同语言有不同的实现方案而已,但还是都能实现的。


    @sagaxu 我觉得 @gouchaoer 的『不常驻』指的是每一个请求对于 userland 都是全新的(会重新走 RINIT 到 RSHUTDOWN ),userland 始终不用去考虑别的请求对自身的影响,而别的语言,或者 swoole 的模式,如果编写时写错了(无论是出于疏忽还是无知)就有可能导致相应的问题


    @xujif web 领域 python 是绝对的小众,怎么跟 php 叫板?小的用 php 大的用 java,python 粉丝才会去选择 python,看看 web 相关的岗位招聘需求就知道了
    jevonszmx
        37
    jevonszmx  
       2017-05-24 17:47:27 +08:00
    @gouchaoer 一般都是一组服务器一起发的,比如说我们有 200 台 php 服务器,每次发布 10 台服务器,下线=>发代码=>检测代码发布完成=>上线,服务器集群会自动把下线的机器从集群在线列表下掉的,用户无感知。

    一般公司大了,多多少少会有一些历史问题,想完全用别人的,很难。。。
    Citrus
        38
    Citrus  
       2017-05-24 23:29:21 +08:00
    @gouchaoer 这个是可以实现的,现在有 2 ~ 3 个 lua 库可以做到动态更新 Upstream,比如官方的 balance_by_lua,阿里同事做的 ngx_http_dyups_module,还有另外一个忘了名字的,都可以实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3540 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:25 · PVG 12:25 · LAX 20:25 · JFK 23:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.