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

PHP 的 JIT 终于要来了

  •  3
     
  •   feiyuanqiu · 2019-02-01 11:41:33 +08:00 · 11453 次点击
    这是一个创建于 2155 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://wiki.php.net/rfc/jit

    Dmitry 提交了一个关于将 jit 加入 PHP 的 rfc,看起来已经开发地差不多了(感谢 Dmitry 和鸟哥~)。

    下面是 RFC 的大致内容(与原文不完全一致,加入了自己的一些理解)

    JIT 的好处

    主要是 JIT 带来的性能提升,以及性能提升对整个语言使用场景的扩展及语言生态发展的支持。

    1. 目前已经很难通过常规手段提升 PHP 的性能,JIT 基本上是目前性能提升的唯一手段;
    2. JIT 带来的性能提升可以让 PHP 在更多使用场景( CPU 密集)中发挥作用;
    3. 可以使用 PHP 来开发内置函数,而不用担心性能方面的问题。这一方面可以加速语言的发展(更多人可以参与进来),同时也可以减少目前使用 C 开发容易出现的内存管理、溢出等问题

    实现细节

    • 作为 OPcache 一个独立组件开发,可以在 PHP 内核编译时或运行时启用,生成的 native 代码保存在 OPcache 共享内存一个额外区域;
    • 使用 LuaJIT 的 DynAsm 库实现 native 代码生成,不使用 LLVM 是因为它生成代码的速度太慢了;
    • 目前只支持 x86、x86_64 POSIX 平台,未来会提供更多平台的支持;
    • 使用 PHP 7.4 跑分,开启 JIT 与不开启,性能大致提升 4 倍 (0.011 sec vs 0.046 sec).

    预计的发布节点

    • 在 PHP 7.4 中,作为试验特性加入,默认不开启;
    • 在 PHP 8 正式发布
    35 条回复    2019-05-12 00:06:24 +08:00
    shisang
        1
    shisang  
       2019-02-01 12:09:41 +08:00   ❤️ 1
    还不如来一个官方替代 fpm 的 server 来的实用
    gouchaoer
        2
    gouchaoer  
       2019-02-01 13:57:51 +08:00
    @shisang fpm 你有什么不满意的地方么?而且 fpm 早被官方收编了
    sheeta
        3
    sheeta  
       2019-02-01 14:02:06 +08:00
    nice
    gouchaoer
        4
    gouchaoer  
       2019-02-01 14:04:16 +08:00
    7.4 的 typed 类成员要来了,jit 也要 来了,我看再加入个 typed 局部变量就和写 java 差不多了
    希望不要重蹈 php7.2 的 count 那种 break BC 的覆辙
    vus520
        5
    vus520  
       2019-02-01 14:06:14 +08:00
    php 现在复杂得一逼,跟 java 还有啥区别
    hoyixi
        6
    hoyixi  
       2019-02-01 14:10:14 +08:00
    @vus520

    感觉以后编程语言都会演化成差不多的样子
    realpg
        7
    realpg  
       2019-02-01 14:22:02 +08:00
    搞的这么复杂 还不如去 java

    本来 PHP 的定位和分工就是很明确的,大部分 PHP 项目都是 IO 才是性能瓶颈
    非得把一个好好的轻量 web 脚本语言搞的无所不能有啥用
    jfcherng
        8
    jfcherng  
       2019-02-01 14:43:58 +08:00 via Android
    JIT 對 web 領域的提升非常有限(絕大部分的 web 應用都不是“計算繁重”的類型,見原文的 wordpress benchmark 提升 10%不到)。

    但 JIT 開啟了將 PHP 用在其他領域的可能性。Reddit 上也有人看了這個 RFC 之後,分享用 PHP 寫日常腳本(類似 shell script, python )的心得,不過 PHP 不是系統默認安裝的稍嫌麻煩。
    gouchaoer2
        9
    gouchaoer2  
       2019-02-01 14:46:48 +08:00
    @realpg
    @jfcherng
    现在 swoole 走 golang 那种纯的协程之后,io 就不再是瓶颈了,于是 cpu 就成了瓶颈了。。。不过这就抛弃了 fpm
    也抛弃了 fpm 下面的很多生态和优点,见仁见智吧
    oneonesv
        10
    oneonesv  
       2019-02-01 14:48:01 +08:00
    @jfcherng 大部分中小公司都在直接用 PHP 做计算的
    oneonesv
        11
    oneonesv  
       2019-02-01 14:49:33 +08:00
    应该是起步用 PHP 技术栈的中小公司
    gouchaoer2
        12
    gouchaoer2  
       2019-02-01 14:51:17 +08:00   ❤️ 1
    @jfcherng 我也分享一个我日常用 php 写脚本的心得:

    不习惯写 shell 的可以这样写:

    ```
    #!/bin/bash
    php -v > /dev/null 2>&1
    if [ $? -ne 0 ];then
    echo "Please install php and ensure 'php -v' output version info in command line"
    echo "For ubuntu/debian, 'sudo apt-get install php' or 'sudo apt-get install php5' for old distribution"
    echo "For centos/RHEL, 'sudo yum install php' "
    fi

    #php script
    php<<'PHPSCRIPT'
    <?php

    chdir("..");
    echo getcwd();
    exec("command 2>&1", $o, $r);//这里 exec 只保存 stdout 而不保存 stderr,所以需要把 stderr 重定向到 stdout
    if ($r!=0)
    {
    echo "command return code:{$r}, output:" . var_export($o, true);
    exit();
    }
    PHPSCRIPT
    ```
    fanpei0121
        13
    fanpei0121  
       2019-02-01 14:51:18 +08:00
    php 能做更多事情也是好事
    gouchaoer2
        14
    gouchaoer2  
       2019-02-01 14:53:06 +08:00
    shell 的语法实在是太暧昧了,经常看着看着不知道这是啥意思,弄个 bashdb 在那里 debug。。。做一件事有 N 种方法
    ihipop
        15
    ihipop  
       2019-02-01 14:55:00 +08:00
    @realpg 关于 IO 的部分,你目前说的说的是对的,但是其实已经有很好的方向而且现在我也实践在项目内了,那就是 Swoole 的协程,现在 swoole5 预备开始全面转向协程抛弃一部回调了,IO 密集操作的瓶颈变成 CPU 的瓶颈了。这部分的提升是很有意义的。

    @jfcherng 你还停留在 `PHP`=`传统 WEB` 的思维上,实际上你说的传统 web 的性能问题,有一部分就和上面我说的那个问题相关,而且实际上现在 PHP 能干的好的事情不只是`传统 WEB`,即使是传统 web,用不一样的方式去提供服务(比如 Swoole 那种常驻方式),性能也能有很大的提升(具体可以看下不带业务的压测),社会上目前关于 PHP 和 WEB 的刻板印象太深刻了。
    orangeade
        16
    orangeade  
       2019-02-01 14:55:28 +08:00
    脚本我就用 python 了,
    不过感觉 cpython 更需要优化解释器性能,语言特性差不多够用就行了
    jfcherng
        17
    jfcherng  
       2019-02-01 15:07:01 +08:00 via Android
    @ihipop 據我所知,PHP 目前的 JIT 只對“數學運算”有明顯的提升,也就是 RFC 裡那個做一堆加減乘除的 benchmark 以及幾年前忘記哪來的有個計算數學碎形的 benchmark。file IO 應該和 JIT 的關係不大?

    我感覺可能有用的是像做 PHP machine learning (不過 github 上有個項目已經在 port tensorflow 的 API 到 PHP 的 C 拓展上了)這種與數學計算高度相關的事情,從 JIT 獲得的好處是極大的。但不管怎樣,就算是做 i++ ,也是要變快了,哈哈 😄
    ihipop
        18
    ihipop  
       2019-02-01 15:17:21 +08:00
    @jfcherng 不能因为目前的 JIT 只能做到 `對“數學運算”有明顯的提升` 而不去继续发展 JIT,是吧?就好像小孩子学步一开始只能爬行,就不去让她继续学步走路是吧。JIT 解决的是 CPU 的运算速度问题,而现在 Swoole 全力发力的 Coroutine 是解决 IO 密集问题,这两个解决以后,语言层面影响性能的两大瓶颈就没有了。生态起来以后 @gouchaoer2 说的那种生态问题会慢慢好起来的。甚至一些现有的为老生态设计的包,如果遵循一定的设计理念(比如 Di ),拿来改造适应协程(现在 Swoole4 下面的一些协程还有一些限制,需要专门设计)是很快很方便的。
    realpg
        19
    realpg  
       2019-02-01 15:39:52 +08:00
    @ihipop #15
    大概我表述的不太明确,您可能理解错了我的意思

    非得把 PHP 一步步改造成 java 那样,为什么项目选型一开始不选择 java

    把自己优势的范围强化到极致,而不是天天盯着别的语言和别的范围,让自己包治百病,才是 php 的未来

    PHP 项目并不是一个上市公司,搞的像上市公司似的总去研究扩张速度,扩张加速度,只能让他更快的失去用户
    guanhui07
        20
    guanhui07  
       2019-02-01 15:52:24 +08:00
    赞个
    jfcherng
        21
    jfcherng  
       2019-02-01 16:03:40 +08:00 via Android
    @ihipop 當然的,JIT 的發展對 PHP 來說肯定能帶來好處的! JIT 本身就像 PHP 本身一樣能夠被再優化,現在只是非常初期一個能跑的版本而已,看好未來繼續發展。
    ihipop
        22
    ihipop  
       2019-02-01 16:10:10 +08:00
    @realpg
    不认同阁下说的 “复杂就是像 JAVA ”,如果说复杂就是像 Java,那么比 PHP 更“像” Java 的东西多的很,甚至还有那些在 Java VM 上自成一体的 Kotlin,如果都按照你的说法,这些都不要搞了,因为“既然这么像,为什么不选择 java ?" 是吧?如果都这么想,RUST 之类的东西都不该存在,TIDB 之类的项目全应该用 Java 搞,是吧?
    askfilm
        23
    askfilm  
       2019-02-01 16:14:50 +08:00
    赞! @jfcherng Reddit 上那个日常腳本分享能给个链接学习学习吗?
    jfcherng
        24
    jfcherng  
       2019-02-01 16:31:19 +08:00 via Android
    hheedat
        25
    hheedat  
       2019-02-01 17:34:26 +08:00
    支持
    tanszhe
        26
    tanszhe  
       2019-02-01 18:11:29 +08:00
    大赞 !!!
    danc
        27
    danc  
       2019-02-02 03:41:26 +08:00 via Android
    然而并没有什么用
    shellic
        28
    shellic  
       2019-02-02 06:24:41 +08:00 via Android
    PHP 现在其实也并不复杂,还是很简单上手,只是多了更多现代化的东西,更加的规范;相信 PHP 之前被人诟病的问题会渐渐好起来
    8355
        29
    8355  
       2019-02-02 10:06:02 +08:00
    没什么喷点 性能提升就行了. 老铁没毛病
    terrywater
        30
    terrywater  
       2019-02-03 08:53:41 +08:00
    你们说为什么不用 java ?
    知道 php 的高效开发效率吗?一个 php 顶 4 个 java 的开发效率吧?

    移动端十代,web 霸主 php 语言最大的短板就是性能,JIT 大幅度提升性能,你们还喷个卵?

    整天尼玛的黑 php,然并卵,看看招聘,还是很多公司在用 php。
    phpok
        31
    phpok  
       2019-02-09 06:07:35 +08:00
    @vus520 是啊,我也感觉现在的 php 是越来越复杂了,真心跟不上时代了~
    zxk7516
        32
    zxk7516  
       2019-03-27 09:33:07 +08:00
    我刚学 php 就学的是 php70,但是现在上班的公司还在 php55
    asstar
        33
    asstar  
       2019-05-11 17:51:40 +08:00
    @ihipop 兄弟,看了一下评论,我也是一个多年的 php 开发了,很理解你的心情。
    不过我觉得 php 确实特性越来越多像 java 的东西,之所以说像 java,是因为基于 class 的这套 oop 形式和 java 很像,当然早一点的 oop 语言都是 class based。其实本来动态语言有更多自己的特色,比如元编程的能力,ruby 和 python 基本都有。而 php 则一直在向 java 这样的“工业级编程语言”靠齐,本身动态语言的优势都在忽略,而 java 本身很多方式是因为静态语言不得不如此。这样一学下来,淡化了优势,反而加强了一些强加上来的东西。

    php 的使用相当多,走向正规化是必然。比如框架,包管理,,,学习成本因此而上升也是绝对值得的。但就像 python 和 ruby,lisp 之类的元编程方式都不一样。不是说像 java 就能成为“工业级编程语言”,从 5.x 开始,php 语法就越来越像 java 了。

    还有一点不太赞同,web 这一块,瓶颈基本都在 io,不存在说你换成 swoole 常驻了之后瓶颈就变成 cpu 了,只要不是做数值运算,基本瓶颈都是在 io。swoole 这种异步模式,其他语言里基本都不少见,像 tornado。也谈不上什么颠覆性的东西。编程模式和常见的 fastcgi 不一样,内存泄露的可能性增加,难度增加。要说 php 做通用编程,先不说别的,语言层面支持异步吗?现在靠 swoole 一个扩展支持,但是语言层面配套跟不上啊,swoole 只不过相当于用 c 开了个后门而已,比如你说的协程库什么的。而且说到并行,现在有成熟的线程实现吗?仅仅在 unix 下有一个多进程实现,更别说其他的通用库了。所以说,php 现在离通用语言还是很远,而社区似乎也没有搞成通用语言的趋势。

    php 向下兼容不错,但我有时候觉得还不如像 python 搞个不兼容的新版本出来,彻底整改。py2 到 py3 虽然很多人吐槽,但实际现在 2.7 已经停更了,大部分第三方库已经迁移到 py3 了,升级完成得很不错了。
    ihipop
        34
    ihipop  
       2019-05-11 23:42:17 +08:00 via Android
    @asstar 感谢兄弟你回复了这么多,Java 和动态语言优劣,PHP 线程的急需性(尽管我很赞同韩天峰在公开场合表达的一些看法),语言通用性发展规划,GC 实现等,这是一个很复杂且旷日持久的争论,贯穿整个软件工程发展史,不是你我在这里面回几句嘴就能争论清楚的,所以不评论,见仁见智,多说无益。我也从没期望他能成为通用语言,毕竟我要的只是能较快且高质量完成我业务的工具。

    但是对于 swoole 和异步,协程编程我还是要说两句,你存在较深的误解,源头还是因为你没用 PHP 做过相应的业务场景。

    首先你说的没错,web 场景下,很多时候 io 是瓶颈,但是也说明你经历过的业务场景下,也只能接触到的这种瓶颈。而我用 swoole 做的网络相关编程项目,本来涉及到大量数据读写,传统模式开发模式下,本来也是 IO 是最大瓶颈,然而 swoole 的协程引入,已经成功的帮我把 io 瓶颈消除了,现在反而是单核 CPU 算力成了瓶颈,(所以我是很期待 PHP 在计算能力上有较大提高的,并不是盲目鼓吹 PHP 成为通用语言)。你接触不到不代表没有这种业务模型存在。

    其次并不是说常驻解决所有 IO 问题,常驻也不是 swoole 的首创,在 PHP 的历史上比 swoole 出现的还要早,常驻解决的只是框架加载的 IO 消耗,顺便解决一下内存对象周期问题,等你接触到网络编程你就会发现还有很多常规业务线接触不到的新认知。

    从你的评价,你还是对异步编程和协程间区别不太弄得清,建议了解一下 swoole4 全新设计的协程设计,而且 swoole4.3+已经完全从主线移除了异步模型,协程在 io 方面完全可以发挥出比线程更小的开销,更好的性能。

    关于 PHP 语言层面的异步,既然你谈到了
    tornado,就应该了解下 react PHP,workerman,这些都是纯语言实现的事件驱动和网络编程框架(虽然高性能的事件底层循环要依赖 libevent,但是也是一个可选标准库,其他语言相关实现也是可选依赖),而且这些也是常驻框架,基于 react PHP,还实现了一个 PHP PPM,只是如果你只做 web 业务,你基本上很少会接触到这些东西。

    还是我说的那句话,PHP 设计的时候为 web 考虑了很多,但是不代表他只有在 web 开发才能发挥作用,但是更不代表 PHP 可以写个操作系统。我始终检查开头的那句话,我要的只是能较快且高质量完成我业务的工具。

    我从 Swoole2 开始关注 Swoole,但是只有 Swoole4 全新设计的协程吸引了我全身心投入。Swoole2 那种模仿 node 的回调地狱设计我也不怎么感冒,我可不是 eeChen,见什么都舔。
    ihipop
        35
    ihipop  
       2019-05-12 00:06:24 +08:00 via Android
    另外,我觉得韩天峰有句话说的很对,技术栈上,PHP 只是 C 的一个开发效率提升的补充,资深的高级 PHP 程序员,很多时候都是很好的 C 程序员(参考鸟哥),C 对于 PHP 不是后门,是基石。PHP 极早期很多函数就是对 C 的一些简单封装,你可以看下 PHP4 时代遗留下来的东西,很多有很重的 C 痕迹,PHP5 拥抱 oop 不是和 Java 学,而是跟着语言发展潮流走,拥抱开发方式的发展和变化,但是发展到现在,有人觉得弄出 laravel 那种花式封装的就是高级 PHP 程序员了,其实离真的高级资深 PHP 程序员还远着十万八千里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:19 · PVG 12:19 · LAX 20:19 · JFK 23:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.