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

2016-12-11 13:27:42 +08:00
 changwei

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

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

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

3595 次点击
所在节点    问与答
28 条回复
gouchaoer
2016-12-11 22:00:03 +08:00
@sagaxu 我把强类型和静态类型搞混了,其实个人觉得强类型 /弱类型区别没那么大,无非是一些语法糖上的区别。。。

各个语言有自己的场景, lua 在 web 领域没有第三方库生态,谈性能没有意义。。。比如你说 go 性能好那为 web 领域 go 的第三方库都不成熟没法比啊。。。至于 node ,这就是我说过的异步调用的命令行方式,不耐艹而且写起来绕, php 也有: http://rango.swoole.com/archives/311 。。。
1990andy
2016-12-11 22:03:22 +08:00
要看场景额, PHP 也罢, node 也罢,如果说的都是 IO 密集型那就不要扯性能了,因为瓶颈都在 DB 那里。
ooh
2016-12-11 22:04:22 +08:00
@8e47e42 100 刀可以吃十个
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
2016-12-12 00:11:43 +08:00
@sagaxu 我对 py 挺熟悉的,因为做 cv 和机器学习很多算法库都提供 py 包装,虽然比不上 php , pip 安装库我在 win 下很多时候没法装上,兼容做不好的原因很简单,因为把扩展和纯 py 源码的库不区分

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

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

车轮互联?大厂真好
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
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
2016-12-12 13:37:13 +08:00
跨平台 win , unix 个人感觉是没有什么意义的。最近一直在用 python ,多线程多进程那块没有语法看起来那么好用,但是确实比 java 方便很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/326809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX