在 php 里面如果要实现类似需求还得手动安装各种扩展,修改配置文件等等。
为什么他不直接像 Python 一样弄的自动化一点,方便用户使用?
这样的话普通的 php 开发者解决性能问题也就不用那么麻烦了
1
Tyanboot 2016-12-11 13:29:57 +08:00 via Android
我记得 PHP 好像运行时生成字节码。(好像是
|
2
ss098 2016-12-11 13:30:24 +08:00 via Android
HHVM 是这样的。
|
3
oisc 2016-12-11 13:35:59 +08:00
http://hhvm.com
php7 已经加入 JIT |
4
txlty 2016-12-11 13:41:52 +08:00
普通开发者,解决性能问题最简单方式是换 php7 。
|
5
ryd994 2016-12-11 13:59:45 +08:00
pyc 只是提高加载的效率而已啊
pyc 其实和 java 之类的字节码还是有区别的,只翻译没优化 毕竟现在都不是 cgi 了 fcgi 进程常驻,是不是字节码几乎没区别 |
6
gouchaoer 2016-12-11 14:06:06 +08:00 via Android
php 有 opcache ,只是不存在源码目录下,你看不见的
|
7
gouchaoer 2016-12-11 14:07:31 +08:00 via Android
py 出来喷 php 的性能。。。 php 的性能在脚本语言里的大多数场景下,那是数一数二的
|
8
gouchaoer 2016-12-11 14:13:03 +08:00 via Android
hhvm 和这个差了十万八千里好吧
php7 加 jit 是谁说的 fcgi 方式让字节码缓存失去意义也太厉害了吧,你 php-fpm 里开 opcache 和不开看看性能如何 |
9
sagaxu 2016-12-11 14:17:19 +08:00
@gouchaoer 坏就坏在 fastcgi 记不住东西,框架初始化和 app 初始化每个请求都要做一次, php 写的框架 rps 连 1000 都跑不到,脚本里找不到第二个这么慢的
|
10
gouchaoer 2016-12-11 14:25:43 +08:00 via Android
@sagaxu fastcgi 方式特点就是耐草,你要找和 node 那样常驻内存的 php 也有, yaf 、 swoole 这些大厂都用,开一个命令行应用盯着 80 端口这种方式部署和运维都有很高要求,这里我觉得就 java 做的很成熟,别的脚本语言还没有特别成熟
单纯比语言本身性能, php 做的很好的 |
11
dant 2016-12-11 14:30:58 +08:00
PHP 性能不差,只要不踩 CGI 和 GC 这两个坑(
|
12
sagaxu 2016-12-11 14:41:19 +08:00
@gouchaoer 那么多 python 和 ruby 开发的后台长年累月的跑,然而并没有很多关于不成熟方面的报道。
不考虑运行环境,只比语言本身性能, php 在常用脚本里大概能排第三吧。 php 最大的优点还是门槛低,对开发者要求低, phper 可以不懂多线程同步,也可以无视资源泄露,甚至分不清 string 和 number 就可以干活了,基本数据结构也只有 array 一种,不像别的语言各种花样。 |
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 还有一些数据结构,这些花样没人用就是了 |
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 |
17
changwei OP |
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 亮出来。。。后面的一些东西很暴露水平 |
19
gouchaoer 2016-12-11 21:45:02 +08:00 via Android
你知道 php 主机的 ftp 空间最高支持 php5.4 不正是说明部署简单么,而且有关键业务的谁会用 ftp 空间啊。。。。
我从前写过不少 py 吧,后来用 php 比较多。。。 php 和 py 不同场景优势不一样,不过 lz 提的这些场景 php 做的比 py 好 |
20
8e47e42 2016-12-11 21:49:23 +08:00
普通开发者纠结性能的意义不是很大, benchmark 什么的小用户感受不到。
像 php 开发的小站,性能不够果断硬件来压, 10 刀一个月的 VPS 跑不动就换 100 刀一个月的。 相比而言,你喊个码农帮你优化代码, 100 刀只能请吃个麻辣烫吧。。 世界第二好的语言 PHP 设计初衷就是为了易用,所以可能刚需没有那么足吧 |
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 。。。 |
22
1990andy 2016-12-11 22:03:22 +08:00 via iPhone
要看场景额, PHP 也罢, node 也罢,如果说的都是 IO 密集型那就不要扯性能了,因为瓶颈都在 DB 那里。
|
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 项目本身就是我们公司的天峰维护的。 |
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 嘛,高并发低消耗,但是比较复杂一点的系统就不那么适合了 车轮互联?大厂真好 |
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 只需要修改个环境变量就好了。 |
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 |
28
ofblyt 2016-12-12 13:37:13 +08:00
跨平台 win , unix 个人感觉是没有什么意义的。最近一直在用 python ,多线程多进程那块没有语法看起来那么好用,但是确实比 java 方便很多
|