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

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

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