V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
changwei
V2EX  ›  问与答

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

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

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

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

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

    28 条回复    2016-12-12 13:37:13 +08:00
    Tyanboot
        1
    Tyanboot  
       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   ·   实用小工具   ·   870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.