1
firebroo 2017-05-23 13:54:37 +08:00
牛逼~
|
2
NoAnyLove 2017-05-23 14:07:19 +08:00
每次看到这种东西,我就想往自己的 TODO List 上加入新的想学的内容。。。。。。然而 TODO List 尚未有一项完成任务,我也很绝望啊
|
4
jhdxr 2017-05-23 17:57:16 +08:00
然而这是 benchmark,在实际项目中的提升并不知道是多少(最近一次的消息依然是 jit 在实际项目是略微下降的)。
php 7.2 还有两个月 feature freeze,我觉得不一定能赶上 btw, 上周 internals 的邮件组里有提到一个 hybrid vm ( http://news.php.net/php.internals/99043 )这才是 php7.2 更有可能搭载的东西 |
5
vus520 2017-05-23 18:01:40 +08:00
拥抱 GO,回头草还得吃啊
|
6
liuxu 2017-05-23 18:42:48 +08:00
没有最好的语言,只有最好的开发者。。6 了
|
7
wujunze 2017-05-23 18:49:55 +08:00
我推测 php7.2 不会有 JIT php8 可能会有 JIT
|
9
wdlth 2017-05-23 21:17:23 +08:00
只是 benchmark 提升的话意义不大,毕竟大多数瓶颈在 IO 上。
|
10
sagaxu 2017-05-23 22:37:31 +08:00 1
赶紧把 fpm 这种记不住东西的方式 deprecate 吧,不常驻内存,限制还是太大了
|
11
gouchaoer OP @sagaxu 单纯 helloworld 的话 php-fpm 和 swoole 啥的 qps 是一样的。。。不常驻内存的好处你又不是不知道,只此一家别无分店
|
12
hxdhttk 2017-05-24 00:37:40 +08:00
PHP 的 jit 不知道有没有人对下面的项目感兴趣:
http://www.peachpie.io |
13
hjc4869 2017-05-24 00:51:47 +08:00 via iPhone
想试试这个 bench 用 peachpie 编译成 .NET 字节码能跑多快
|
17
gouchaoer OP |
18
sagaxu 2017-05-24 09:59:31 +08:00
@gouchaoer 这两点跟常驻没关系啊,python 容器和 ruby 容器也有每处理 xx 个请求重启进程的功能,像 tomcat 这样不重启的,也没见过容易挂的。热部署连 Java 这样的都支持。
|
19
jarlyyn 2017-05-24 10:05:55 +08:00
@gouchaoer
不要搞挂服务?服务该挂的时候就该挂。不然数据都可能被污染…… 至于热更新代码,php 还真不很很好的热更新代码。至少在“热更新”的时候,是可能混杂几个版本的程序运行的。 而 php-fpm 也和普通的 cgi 程序没什么本质区别。 php 的确会有其独特的生命力。 但真心不在这几块。 |
20
szopen 2017-05-24 10:14:40 +08:00
@gouchaoer 如果官方能将 libevent, ev, eio 等扩展优化好,我想大家都会很热忠于在框架中集成 web 服务组件,
这就和 python 有 gevent 之类的扩展一样, |
21
gouchaoer OP @szopen 首先跑在 php-fpm 里面的框架基本上用不上 libevent 之类的,php-cli 才会用。。。其次,php 的事件扩展有几个 Event、Ev 等(包装的 libevent,ev 之类的)。。。。。gevent 我没直接用过,不过基于 gevent 的 GRequests 我用过,php 下的 Guzzle 你可以选择用 Event 或者不用,二者的可用性啥的那当然是 php 好啊。。。gevent 的那个改变同步接口的实现不是本来就不好么,连 py 的 gevent 都来和 php 叫板。。。
|
22
gouchaoer OP @jarlyyn 我觉得服务还是不要挂比较好,数据会被污染是啥意思?
git 热更新的时候的确可能混杂几个版本,但是不用停止服务,以及大部分时候热更新也只是更新一两个文件,比起别的语言还是很方便的。 那你来说说 php 独特的生命力在哪里 |
23
jarlyyn 2017-05-24 10:36:28 +08:00
@gouchaoer
首先,不知道你挂服务的意思,一般程序也就挂个当前链接。如果连服务都挂了,那错误就严重了。严重错误下,个人觉得,数据都不可信了。 其次,真的线上更新能这样更么…… 生命力? 对虚拟空间的支持,最强大的模板语言,专注于网络其他方面干扰的库很少,数量庞大的轮子。 |
24
tabris17 2017-05-24 10:39:25 +08:00
让别人去试错,技术成熟了再使用,这样文档和资料也会多很多,不要去趟雷
|
25
gouchaoer OP @jarlyyn 我还是无法理解你这个宁愿服务挂了的逻辑
真的线上更新为啥不能这么做,要不然你要怎么做?把 php-fpm 停了,git 更新完代码,把 php-fpm 启动,哦对了这么做还得先把流量切到别的应用服务器,完了切回来 |
27
PythonAnswer 2017-05-24 11:10:05 +08:00 via Android
可惜我大 python 不给力
|
29
sagaxu 2017-05-24 12:39:09 +08:00
@gouchaoer 现在谁还玩手动发布啊?都是提交到库里,然后自动跑单元测试,测试完自动打包,发布的时候选一个版本,勾上要发布到集群里哪几台机器,然后点发布就完事了,不管什么语言什么打包机制,统统都一样。
Java 应用手动发布也很简单,把新 war 包扔到 tomcat 发布目录,它会在完成解压和 load 之后自动把流量切给新部署的 app,python 的也很简单,文件更新后,执行一下 uwsgi --reload 就可以了。 |
32
jevonszmx 2017-05-24 13:26:12 +08:00
@gouchaoer
原理和流程 sagaxu 写得蛮清楚的了,按照他这个思路自己写脚本即可。可以用脚本自己实现,也可以依赖其他的持续集成工具。 我们大致的流程是: # 制定 svn/git 规范,比如 release/master 就是线上代码,trunk 就是生产代码; # 制定代码目录规范,比如 tests 目录是单元测试用例代码; # 代码全部测试完成,leader 合并分支代码到线上目录; # 发布后台点击“发布”,脚本依次执行: ## 从指定分支 checkout 代码; ## 运行单元测试; ## 代码打包:php 可能要 require 一些依赖项目 /配置,java 可能要打成 war 包; ## 代码传到指定服务器(也可以先到测试服务器):php 直接复制到指定目录即可; java 要多一点,kill 掉 tomcat、复制 war 包、重启 tomcat ; ## 检测环境是否正常:预先写好一些本地脚本,当前机器发布完自动调用测试一下响应和状态; ## 发送邮件 /记日志... 通过一系列的 shell 脚本串联起来即可。 |
33
gouchaoer OP @jevonszmx 太难了我不会,我要那种开源在 github 上的,我 clone 下了改几下就能用的,最好有图文教程的,轻轻松松就能搞定的。。。。单元测试不是重点,重点是怎么在后台点一下就把代码发布到主机上,而且发布的时候流量是不走发布机器的,发布完了又自动把流量切回来的
|
35
gouchaoer OP 我觉得这个方案不错诶: http://www.oschina.net/question/942494_2208510?sort=default
我在每台机器上跑个 php-cli 监控 redis 的更新指令,更新指令来了先去通知 nginx/load balancer 把我这个节点的流量关了,然后 php-cli 调用 git 去 repo 拉代码,完了通知 nginx 把流量切回来 |
36
jhdxr 2017-05-24 15:35:39 +08:00
@gouchaoer 实际上大厂的服务都是集群,更新的时候就是下线部分 server,更新完再上线的。切流量这种事情不应该是 LBS 的最基础的工作么。再举个热更新的例子,你研究过输入法,或者至少是搜狗这种的更新么?已经打开的继续用老版本的,新开的程序要用输入法时去用新的。不同语言有不同的实现方案而已,但还是都能实现的。
@sagaxu 我觉得 @gouchaoer 的『不常驻』指的是每一个请求对于 userland 都是全新的(会重新走 RINIT 到 RSHUTDOWN ),userland 始终不用去考虑别的请求对自身的影响,而别的语言,或者 swoole 的模式,如果编写时写错了(无论是出于疏忽还是无知)就有可能导致相应的问题 @xujif web 领域 python 是绝对的小众,怎么跟 php 叫板?小的用 php 大的用 java,python 粉丝才会去选择 python,看看 web 相关的岗位招聘需求就知道了 |