• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liqinliqin
58.52D
V2EX  ›  程序员

Swoole 正在准备一个大招 PHP AOT,让任意 PHP 代码直接生成二进制,比如 WordPress ,直接一个命令行 aot ./wordpress -o wd 生成二进制,可以拷贝到任何地方直接./wd 运行

  •  
  •   liqinliqin ·
    PRO
    ·
    smartarduino · Sep 19, 2025 · 3995 views
    This topic created in 241 days ago, the information mentioned may be changed or developed.
    预计元旦前发布,各位
    Supplement 1  ·  Sep 19, 2025
    实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    33 replies    2026-04-22 18:10:44 +08:00
    FarAhead
        1
    FarAhead  
       Sep 19, 2025
    这个标题好,比很多新闻专业的的都专业
    liqinliqin
        2
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @w7938940 #1 见笑了,发自内心喜欢 PHP,一分钟上手开始编程
    hanguofu
        3
    hanguofu  
       Sep 19, 2025
    能不能根据用户挑选的商品自动计算出总体积和总重量 ?
    jimzaizheli
        4
    jimzaizheli  
       Sep 19, 2025
    666
    liqinliqin
        5
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    php 这个最适合 Linux C 程序员了,写扩展、写库,不用面向对象,就面向 Money
    cmos
        6
    cmos  
       Sep 19, 2025
    WordPress 里面有大量的 do_action('xxx'),还有主题文件动态 include 。这些在编译期,没办法做到静态分析完整调用图,怎么 AOT ?更进一步,Zend Engine 怎么办?有这些钱,还不如找人用 Golang 重写 WordPress 。。。
    xtreme1
        7
    xtreme1  
       Sep 19, 2025   ❤️ 1
    先不谈具体如何搞, 你都 AOT 了还怎么"拷贝到任何地方直接运行"...
    我看了 php 现在貌似还没支持 musl
    diudiuu
        8
    diudiuu  
       Sep 19, 2025
    不会跟 python 打包一样吧
    javalaw2010
        9
    javalaw2010  
       Sep 19, 2025
    不是很看好。要解决的实际问题很多,光是 php 版本和 php 扩展就够喝一壶的了,另外还得考虑现有的框架兼容,比如 laravel: php artisan xxxx 的用法,怎么兼容进去。
    liqinliqin
        10
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @imes #6 这个就拿 WordPress 练了,到时发布版本,您直接用一下
    liqinliqin
        11
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @canteon #8 不是,这个是真正生成二进制,和打包两个概念
    liqinliqin
        12
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @javalaw2010 #9 一定要把这个搞定
    celaraze
        13
    celaraze  
       Sep 19, 2025
    我好几年前就用 frankenphp 搞过,这也是 swoole 的大招?
    liqinliqin
        14
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @celaraze #13 你是如何做的
    celaraze
        15
    celaraze  
       Sep 19, 2025
    @liqinliqin https://frankenphp.dev/cn/docs/static/ 你看一下,我刚翻了我的开源项目 commit 历史,我至少 2 年前就这么干了,一直都是./run 执行我的 php web 项目。
    querysecret
        16
    querysecret  
       Sep 19, 2025
    太好了,如果真能出我转 php
    zone10
        17
    zone10  
       Sep 19, 2025
    直接用 Go 不香吗, glibc 都不依赖, 部署方面无人出其右
    liqinliqin
        18
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @celaraze #13 有办法处理,实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    liqinliqin
        19
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    @zone10 #17 就是喜欢 php ,不需要理由的喜欢
    kakki
        20
    kakki  
       Sep 19, 2025
    用 php 不就图省事么,直接 ftp 传上去就行,常驻内存还真不如用 go
    Yanlongli
        21
    Yanlongli  
       Sep 19, 2025
    额,是不是将整个 php 环境打包、然后将代码打包、再将浏览器打包、然后 润
    liqinliqin
        22
    liqinliqin  
    OP
    PRO
       Sep 19, 2025
    实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    back0893
        23
    back0893  
       Sep 19, 2025
    有点鸡肋
    不如原来 php ,可以直接修改代码
    打包不如换语言
    容器化不好么?
    hronro
        24
    hronro  
       Sep 19, 2025
    按我的理解,JS/PHP/Python/Ruby 这类动态语言,必须要依赖 JIT 才能有可以看的性能,不然性能上就要慢 2 个数量级。要搞 AOT ,除非能支持 PBO ,不然性能能看么?
    hronro
        26
    hronro  
       Sep 19, 2025
    @xgdgsc 谢谢补充。但 Julia 还是和 PHP 这种古早的动态语言不太一样吧,没有可比性。
    CodeCodeStudy
        27
    CodeCodeStudy  
       Sep 19, 2025
    Java 的 GraalVM 的 native-image ,还是需要通过 java -agentlib:native-image-agent=config-merge-dir=/path/to/config-dir/将所有的代码跑一遍,收集运行中的反射、序列化、动态代理、资源等信息,然后再进行 native-image 的 AOT 编译。好奇 PHP 是怎么处理动态特性的?
    CodeCodeStudy
        28
    CodeCodeStudy  
       Sep 19, 2025
    public class Main {

    public static void main(String[] args) {
    try {
    String className = "java.util.Collections";
    Class<?> cl = Class.forName(className);
    System.out.println(cl.getName());
    } catch (Exception e) {
    e.printStackTrace();
    }

    try {
    long time = System.currentTimeMillis() / 1000L;
    String className = time % 2 == 0 ? "java.util.Base64" : "java.util.Timer";
    Class<?> cl = Class.forName(className);
    System.out.println(cl.getName());
    } catch (Exception e) {
    e.printStackTrace();
    }

    }

    }

    javac Main.java && native-image Main && ./main

    输出
    java.util.Collections
    java.lang.ClassNotFoundException: java.util.Base64
    或者
    java.util.Collections
    java.lang.ClassNotFoundException: java.util.Timer

    需要用到 java -agentlib:native-image-agent=config-merge-dir=./src/main/resources/META-INF/native-image Main 将动态特性收集起来,这里的 java 是指 GraalVM 的 jdk ,然后再 native-image 编译

    https://www.graalvm.org/latest/reference-manual/native-image/guides/use-reachability-metadata-repository-maven/

    https://www.graalvm.org/latest/reference-manual/native-image/metadata/AutomaticMetadataCollection/
    phreej
        29
    phreej  
       Sep 19, 2025
    编译打包功能嘿,webman 框架早就支持了!!!
    changz
        30
    changz  
       Sep 20, 2025 via Android
    生态才是最大的问题,举个例子,你能让 rocketmq 给你 swoole 写个 sdk 么
    julyclyde
        31
    julyclyde  
       Sep 20, 2025
    感觉 swoole 这个名字之下好像产品已经变了好几次了?
    cat1879
        32
    cat1879  
       Sep 21, 2025
    打包后还能反编译吗?另外运行的环境是怎么样的
    CodeCodeStudy
        33
    CodeCodeStudy  
       Apr 22
    https://mp.weixin.qq.com/s/05I3xe4pgRJufSBG-8Gz6w
    2026 年 4 月 22 日,Swoole 团队发布了 PHP 的 AOT
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1052 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 22:40 · PVG 06:40 · LAX 15:40 · JFK 18:40
    ♥ Do have faith in what you're doing.