为什么 PHP 不像 Python 一样在脚本执行之后自动生成类似于 pyc 这种字节码文件? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
changwei
V2EX    问与答

为什么 PHP 不像 Python 一样在脚本执行之后自动生成类似于 pyc 这种字节码文件?

  •  
  •   changwei 2016-12-11 13:27:42 +08:00 4018 次点击
    这是一个创建于 3230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 php 里面如果要实现类似需求还得手动安装各种扩展,修改配置文件等等。

    为什么他不直接像 Python 一样弄的自动化一点,方便用户使用?

    这样的话普通的 php 开发者解决性能问题也就不用那么麻烦了

    28 条回复    2016-12-12 13:37:13 +08:00
    Tyanboot
        1
    Tyanboot  
    PRO
       2016-12-11 13:29:57 +08:00 via Android
    我记得 PHP 好像运行时生成字节码。(好像是
    ss098
        2
    ss098  
       2016-12-11 13:30:24 +08:00 via Android
    HHVM 是这样的。
    oisc
        3
    oisc  
       2016-12-11 13:35:59 +08:00
    http://hhvm.com
    php7 已经加入 JIT
    txlty
        4
    txlty  
       2016-12-11 13:41:52 +08:00
    普通开发者,解决性能问题最简单方式是换 php7 。
    ryd994
        5
    ryd994  
       2016-12-11 13:59:45 +08:00
    pyc 只是提高加载的效率而已啊
    pyc 其实和 java 之类的字节码还是有区别的,只翻译没优化
    毕竟现在都不是 cgi 了
    fcgi 进程常驻,是不是字节码几乎没区别
    gouchaoer
        6
    gouchaoer  
       2016-12-11 14:06:06 +08:00 via Android
    php 有 opcache ,只是不存在源码目录下,你看不见的
    gouchaoer
        7
    gouchaoer  
       2016-12-11 14:07:31 +08:00 via Android
    py 出来喷 php 的性能。。。 php 的性能在脚本语言里的大多数场景下,那是数一数二的
    gouchaoer
        8
    gouchaoer  
       2016-12-11 14:13:03 +08:00 via Android
    hhvm 和这个差了十万八千里好吧
    php7 加 jit 是谁说的
    fcgi 方式让字节码缓存失去意义也太厉害了吧,你 php-fpm 里开 opcache 和不开看看性能如何
    sagaxu
        9
    sagaxu  
       2016-12-11 14:17:19 +08:00
    @gouchaoer 坏就坏在 fastcgi 记不住东西,框架初始化和 app 初始化每个请求都要做一次, php 写的框架 rps 连 1000 都跑不到,脚本里找不到第二个这么慢的
    gouchaoer
        10
    gouchaoer  
       2016-12-11 14:25:43 +08:00 via Android
    @sagaxu fastcgi 方式特点就是耐草,你要找和 node 那样常驻内存的 php 也有, yaf 、 swoole 这些大厂都用,开一个命令行应用盯着 80 端口这种方式部署和运维都有很高要求,这里我觉得就 java 做的很成熟,别的脚本语言还没有特别成熟

    单纯比语言本身性能, php 做的很好的
    dant
        11
    dant  
       2016-12-11 14:30:58 +08:00
    PHP 性能不差,只要不踩 CGI 和 GC 这两个坑(
    sagaxu
        12
    sagaxu  
       2016-12-11 14:41:19 +08:00
    @gouchaoer 那么多 python 和 ruby 开发的后台长年累月的跑,然而并没有很多关于不成熟方面的报道。

    不考虑运行环境,只比语言本身性能, php 在常用脚本里大概能排第三吧。 php 最大的优点还是门槛低,对开发者要求低, phper 可以不懂多线程同步,也可以无视资源泄露,甚至分不清 string 和 number 就可以干活了,基本数据结构也只有 array 一种,不像别的语言各种花样。
    gouchaoer
        13
    gouchaoer  
       2016-12-11 14:57:17 +08:00 via Android
    @sagaxu
    1 ,脚本语言里分场景的, zend 性能 team 跑了一些场景下的 benchmark : https://link.zhihu.com/?target=https%3A//pages.zend.com/rs/zendtechnologies/images/PHP7-Performance%2520Infographic.pdf

    2 ,对开发者要求低是好事情,我喜欢 php 不装逼的特点,基本上就是把 c 语言写的库老老实实封装了一下,语法规规矩矩、该有的都有

    3 , string 和 number 不分这种 py 更是没脸来说, php 早意识到强类型的好处, php7 里参数类型更是连 string , int 这种基本类型都加进去了。。。 py 的参数真的是严重缺乏类型

    4 , array 就是好用,哈西是我, queue 是我,字典是我, stack 是我,数组还是我。。。。不好吗? spl 还有一些数据结构,这些花样没人用就是了
    sagaxu
        14
    sagaxu  
       2016-12-11 15:38:46 +08:00
    @gouchaoer

    1. zend 团队敢拿 lua 和 nodejs 跟 php 跑一下性能测试么? 似乎现在 dart 性能也上去了。

    2. 简单的事情用 php 可以更简单,但是一旦事情复杂了,用 php 会更复杂,对开发者要求反而更高。

    3. anyway , python 是强类型语言, php 却不是。 python3 参数可以声明类型, cython 可以用 python 的子集写 python 扩展,通过静态类型获得几十倍的性能提升。

    4. array 再好用,也改变不了不能从中间任意位置插入的硬伤。 Java
    sagaxu
        15
    sagaxu  
       2016-12-11 15:39:28 +08:00
    @sagaxu 和 C++ STL 那样的数据结构标准库,才能算好使。
    eoo
        16
    eoo  
       2016-12-11 18:10:55 +08:00
    @dant 求解
    changwei
        17
    changwei  
    OP
       2016-12-11 21:14:53 +08:00
    @gouchaoer 但是生成 opcode 这个过程是在运行时啊, Python 是在 import 的时候就生成好了 pyc 文件直接用
    @dant 命令行执行 php ,性能也低啊,有人做过测试,貌似 php5.6 比 python2.7 还低一点,
    @ss098 hhvm 的话程序可能有部分不兼容,我也没敢上
    @oisc php7 还没上,现在很多主机最高都还是 php5.4 ,
    gouchaoer
        18
    gouchaoer  
       2016-12-11 21:36:06 +08:00 via Android
    这么说吧,也许是你比较熟悉 py 而 php 接触少

    论跨平台性和部署简易性, php 比 py 做的好很多
    论性能, php 比 py 做的好非常多

    你的一些观点有点缺乏对 php 的了解。。。。首先你搞错了扩展和第三方库, php 为了追求性能把一些函数用 c 写了,官方就是 pecl 扩展,分为多线程 /单线程版本,你要用需要自己安装。。。而第三方库就是纯的 php 的代码库了,跨平台的,管理为 composer ,类似 nodejs 的 npm 的第三方库管理。。。 py 没有这个概念,什么东西都一股脑装进 py 系统文件夹那里。。。 py 的库管理存在很大问题,平台兼容也没做好。。。所以说 php 在这里被 py 鄙视是荒谬的


    opcode 在运行时,那 py 在 import 的时候不是运行时, hhvm 张口就来先去搞清楚概念, php5.6 和 py 比性能把各个场景的 benchmark 亮出来。。。后面的一些东西很暴露水平
    gouchaoer
        19
    gouchaoer  
       2016-12-11 21:45:02 +08:00 via Android
    你知道 php 主机的 ftp 空间最高支持 php5.4 不正是说明部署简单么,而且有关键业务的谁会用 ftp 空间啊。。。。

    我从前写过不少 py 吧,后来用 php 比较多。。。 php 和 py 不同场景优势不一样,不过 lz 提的这些场景 php 做的比 py 好
    8e47e42
        20
    8e47e42  
       2016-12-11 21:49:23 +08:00
    普通开发者纠结性能的意义不是很大, benchmark 什么的小用户感受不到。

    像 php 开发的小站,性能不够果断硬件来压, 10 刀一个月的 VPS 跑不动就换 100 刀一个月的。
    相比而言,你喊个码农帮你优化代码, 100 刀只能请吃个麻辣烫吧。。

    世界第二好的语言 PHP 设计初衷就是为了易用,所以可能刚需没有那么足吧
    gouchaoer
        21
    gouchaoer  
       2016-12-11 22:00:03 +08:00 via Android
    @sagaxu 我把强类型和静态类型搞混了,其实个人觉得强类型 /弱类型区别没那么大,无非是一些语法糖上的区别。。。

    各个语言有自己的场景, lua 在 web 领域没有第三方库生态,谈性能没有意义。。。比如你说 go 性能好那为 web 领域 go 的第三方库都不成熟没法比啊。。。至于 node ,这就是我说过的异步调用的命令行方式,不耐艹而且写起来绕, php 也有: http://rango.swoole.com/archives/311 。。。
    1990andy
        22
    1990andy  
       2016-12-11 22:03:22 +08:00 via iPhone
    要看场景额, PHP 也罢, node 也罢,如果说的都是 IO 密集型那就不要扯性能了,因为瓶颈都在 DB 那里。
    ooh
        23
    ooh  
       2016-12-11 22:04:22 +08:00
    @8e47e42 100 刀可以吃十个
    sagaxu
        24
    sagaxu  
       2016-12-11 23:45:49 +08:00
    @gouchaoer 可能你对 python 不大熟悉吧。 python 的包管理器叫 pip ,而且已经被官方收编了, python3 还搞了个 ensurepip 来保证 pip 的自举。 pip 是可以把库安装到每个账号自己的目录下的,是 system 还是 home 由用户自己决定。

    之前有人搞了个 virtualenv ,可以为每个 python 的 app 定制一个与众不同的运行时环境,相互之间是隔离的。官方吸收了这套理念,推出了 venv ,不过只有 python3 才有, python2 还是得继续用 virtualenv 。

    venv 和 pip 是可以搭配一起使用的,很容易就能把 python app 的所有依赖打包到一起。不过要说不熟简单, php 和 python 都比不了 Java 和 go 语言,一个二进制包搞定, Java 只依赖 JRE , go 只依赖内核。因为 Java 和 go 的 library 都倾向于 pure java/go 实现,不像 php/python 那样 wrap 一个 C 的库,搞的对 so/dll 有依赖,这里就涉及到不同发行版和版本的依赖问题了。不过现在有了 docker ,打包可以连系统级别的依赖一起打,用主流语言的部署都不会太麻烦了。

    lua 在 web 也是有实际应用的,比如说 openwrt 的 web 界面就是 lua 实现的。我司部分功能是用 nginx+lua 的实现的,这部分功能,如果换成 php ,除了 swoole ,可能没有第二个框架能扛得住。 nginx+lua 这种搭配,应该不算太过罕见吧。

    go 是主打的是 web 服务,他 release 的时期,服务端页面渲染已经不重要了,所以他没有好用的模板。而 url 路由和 db 或者 cache 方面, go 的库并不差。至于 swoole ,我们公司很多项目都是 swoole ,我估计我熟悉程度不比你低多少, swoole 项目本身就是我们公司的天峰维护的。
    gouchaoer
        25
    gouchaoer  
       2016-12-12 00:11:43 +08:00 via Android
    @sagaxu 我对 py 挺熟悉的,因为做 cv 和机器学习很多算法库都提供 py 包装,虽然比不上 php , pip 安装库我在 win 下很多时候没法装上,兼容做不好的原因很简单,因为把扩展和纯 py 源码的库不区分

    go 和 java 这些静态语言和脚本语言没法比,另外我很不喜欢 go ,除了无依赖编译成二进制和 goroutine 外,别的乏善可陈,然后在 web 端的第三方库 go 很缺乏啊

    nginx+lua 你直接说 openresty 嘛,高并发低消耗,但是比较复杂一点的系统就不那么适合了

    车轮互联?大厂真好
    sagaxu
        26
    sagaxu  
       2016-12-12 08:54:52 +08:00
    @gouchaoer

    区分 ext 和 lib 就能解决兼容性问题了?我不这么认为。当 composer 依赖 ext-xxx 的时候,难道会自动带上编译 xxx 依赖的那些 lib? 当你需要 ext 的时候,你就无法避免这个问题。当你不需要 ext 的时候, pip 一样不会有问题。不过我已经十几年不用 windows 了,谨慎的推测你说的兼容性问题是因为编译依赖。

    go 从发布第一版到现在不过六七年时间,第一个稳定版发布的时候, web 已经式微了,社区自然不会在这方面下功夫。 goroutine 已经是个大杀器了,在需要高并发又不想写层层回调的时候,除了各种 coroutine 还有别的选择吗。除了 goroutine ,和 C 之间便捷的互相调用,默认支持交叉编译,在 pc 上编译一个树莓派的 binary 只需要修改个环境变量就好了。
    jhdxr
        27
    jhdxr  
       2016-12-12 12:51:53 +08:00
    @sagaxu 我来猜测下 @gouchaoer 的意思,当 php 中依赖 ext-xxx 而不满足时, composer 会明确告诉我需要哪个 ext ,然后再 windows 下作为一个普通的应用开发者我只需要去下载对应的 dll 文件放到合适的目录,然后去 php.ini 里启用(的确不是那么简单,但是这种如果随随便便看过一篇教程,那也并非很复杂,而且对于几乎任意 ext 它的解决过程是相同的)。 pip 里遇到同样问题的时候,我得到的是编译失败的错误(当然我也好多年没用 python 了,不知是否改进了),这个错误分析和解决起来可麻烦的多。

    哦对了,还有你类比 nginx+lua 这种组合, php 其实 swoole 以外还有个叫 workerman 的框架你也许可以了解下。一种完全不同的实现思路, workerman 是纯 php 写的(虽然还是依赖了相关的库,例如 ext-pthread )。我个人其实更喜欢这种纯 php 实现的库,理由和你上面写的差不多。

    @changwei php 也会生成 opcode ,和 python 一样两者都是直译,没什么高下之分。如果你是觉得 php 每次都要翻译为 opcode 会浪费性能可以开启 opcache 。最高只支持 5.4 的一定是国内的各种非主流主机商了, php 官方现在还在提供维护的最低版本是 5.6 。

    @sagaxu 我并不知道你说的从中间任意位置插入是什么意思,如果你是觉得普通的 array 做不到这一点,那也许你需要去看一下 http://php.net/array_splice 这个函数, length 为 0 就是实现你所想要的效果的。另外附上你所想要的数据结果标准库: http://php.net/manual/zh/spl.datastructures.php
    ofblyt
        28
    ofblyt  
       2016-12-12 13:37:13 +08:00
    跨平台 win , unix 个人感觉是没有什么意义的。最近一直在用 python ,多线程多进程那块没有语法看起来那么好用,但是确实比 java 方便很多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     921 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 20:07 PVG 04:07 LAX 13:07 JFK 16:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86