V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liqinliqin
58.51D
V2EX  ›  程序员

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

  •  
  •   liqinliqin ·
    PRO
    ·
    smartarduino · 11 小时 23 分钟前 · 1279 次点击
    预计元旦前发布,各位
    第 1 条附言  ·  10 小时 30 分钟前
    实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    30 条回复    2025-09-20 00:45:29 +08:00
    w7938940
        1
    w7938940  
       11 小时 16 分钟前
    这个标题好,比很多新闻专业的的都专业
    liqinliqin
        2
    liqinliqin  
    OP
    PRO
       11 小时 12 分钟前
    @w7938940 #1 见笑了,发自内心喜欢 PHP,一分钟上手开始编程
    hanguofu
        3
    hanguofu  
       11 小时 11 分钟前
    能不能根据用户挑选的商品自动计算出总体积和总重量 ?
    jimzaizheli
        4
    jimzaizheli  
       11 小时 10 分钟前
    666
    liqinliqin
        5
    liqinliqin  
    OP
    PRO
       11 小时 7 分钟前
    php 这个最适合 Linux C 程序员了,写扩展、写库,不用面向对象,就面向 Money
    imes
        6
    imes  
       11 小时 5 分钟前
    WordPress 里面有大量的 do_action('xxx'),还有主题文件动态 include 。这些在编译期,没办法做到静态分析完整调用图,怎么 AOT ?更进一步,Zend Engine 怎么办?有这些钱,还不如找人用 Golang 重写 WordPress 。。。
    xtreme1
        7
    xtreme1  
       11 小时 3 分钟前   ❤️ 1
    先不谈具体如何搞, 你都 AOT 了还怎么"拷贝到任何地方直接运行"...
    我看了 php 现在貌似还没支持 musl
    canteon
        8
    canteon  
       11 小时 1 分钟前
    不会跟 python 打包一样吧
    javalaw2010
        9
    javalaw2010  
       11 小时 0 分钟前
    不是很看好。要解决的实际问题很多,光是 php 版本和 php 扩展就够喝一壶的了,另外还得考虑现有的框架兼容,比如 laravel: php artisan xxxx 的用法,怎么兼容进去。
    liqinliqin
        10
    liqinliqin  
    OP
    PRO
       10 小时 47 分钟前
    @imes #6 这个就拿 WordPress 练了,到时发布版本,您直接用一下
    liqinliqin
        11
    liqinliqin  
    OP
    PRO
       10 小时 46 分钟前
    @canteon #8 不是,这个是真正生成二进制,和打包两个概念
    liqinliqin
        12
    liqinliqin  
    OP
    PRO
       10 小时 46 分钟前
    @javalaw2010 #9 一定要把这个搞定
    celaraze
        13
    celaraze  
       10 小时 43 分钟前
    我好几年前就用 frankenphp 搞过,这也是 swoole 的大招?
    liqinliqin
        14
    liqinliqin  
    OP
    PRO
       10 小时 39 分钟前
    @celaraze #13 你是如何做的
    celaraze
        15
    celaraze  
       10 小时 36 分钟前
    @liqinliqin https://frankenphp.dev/cn/docs/static/ 你看一下,我刚翻了我的开源项目 commit 历史,我至少 2 年前就这么干了,一直都是./run 执行我的 php web 项目。
    querysecret
        16
    querysecret  
       10 小时 32 分钟前
    太好了,如果真能出我转 php
    zone10
        17
    zone10  
       10 小时 31 分钟前
    直接用 Go 不香吗, glibc 都不依赖, 部署方面无人出其右
    liqinliqin
        18
    liqinliqin  
    OP
    PRO
       10 小时 30 分钟前
    @celaraze #13 有办法处理,实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    liqinliqin
        19
    liqinliqin  
    OP
    PRO
       10 小时 30 分钟前
    @zone10 #17 就是喜欢 php ,不需要理由的喜欢
    kakki
        20
    kakki  
       10 小时 23 分钟前
    用 php 不就图省事么,直接 ftp 传上去就行,常驻内存还真不如用 go
    Yanlongli
        21
    Yanlongli  
       10 小时 22 分钟前
    额,是不是将整个 php 环境打包、然后将代码打包、再将浏览器打包、然后 润
    liqinliqin
        22
    liqinliqin  
    OP
    PRO
       10 小时 21 分钟前
    实际上现在搞的 AOT 实现,是可降级的,是函数级别的,会把一部分 PHP 函数给转成 C++ 函数,遇到混杂 PHP 和 HTML 的模版文件,或者不支持的语法,就还是走 opcode 了,和 swoole compiler 这个是一起运行的
    back0893
        23
    back0893  
       10 小时 19 分钟前
    有点鸡肋
    不如原来 php ,可以直接修改代码
    打包不如换语言
    容器化不好么?
    hronro
        24
    hronro  
       10 小时 7 分钟前
    按我的理解,JS/PHP/Python/Ruby 这类动态语言,必须要依赖 JIT 才能有可以看的性能,不然性能上就要慢 2 个数量级。要搞 AOT ,除非能支持 PBO ,不然性能能看么?
    xgdgsc
        25
    xgdgsc  
       10 小时 3 分钟前 via Android
    hronro
        26
    hronro  
       9 小时 7 分钟前
    @xgdgsc 谢谢补充。但 Julia 还是和 PHP 这种古早的动态语言不太一样吧,没有可比性。
    CodeCodeStudy
        27
    CodeCodeStudy  
       9 小时 3 分钟前
    Java 的 GraalVM 的 native-image ,还是需要通过 java -agentlib:native-image-agent=config-merge-dir=/path/to/config-dir/将所有的代码跑一遍,收集运行中的反射、序列化、动态代理、资源等信息,然后再进行 native-image 的 AOT 编译。好奇 PHP 是怎么处理动态特性的?
    CodeCodeStudy
        28
    CodeCodeStudy  
       8 小时 44 分钟前
    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/
    phreej2voo
        29
    phreej2voo  
       8 小时 44 分钟前
    编译打包功能嘿,webman 框架早就支持了!!!
    changz
        30
    changz  
       1 小时 12 分钟前 via Android
    生态才是最大的问题,举个例子,你能让 rocketmq 给你 swoole 写个 sdk 么
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:57 · PVG 01:57 · LAX 10:57 · JFK 13:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.