PHP -jit 进展顺利

2017-05-23 13:38:03 +08:00
 gouchaoer
刚鸟哥放出了 php-jit 性能 benchmark: https://m.weibo.cn/1170999921/4110546237847160

还没放出的 php7.2 大家看到没有,我大胆估计 php-jit 会搭载到 opcache 随 php7.2 放出,这是 php-jit 是透明兼容的
8382 次点击
所在节点    PHP
38 条回复
gouchaoer
2017-05-24 10:29:08 +08:00
@szopen 首先跑在 php-fpm 里面的框架基本上用不上 libevent 之类的,php-cli 才会用。。。其次,php 的事件扩展有几个 Event、Ev 等(包装的 libevent,ev 之类的)。。。。。gevent 我没直接用过,不过基于 gevent 的 GRequests 我用过,php 下的 Guzzle 你可以选择用 Event 或者不用,二者的可用性啥的那当然是 php 好啊。。。gevent 的那个改变同步接口的实现不是本来就不好么,连 py 的 gevent 都来和 php 叫板。。。
gouchaoer
2017-05-24 10:32:52 +08:00
@jarlyyn 我觉得服务还是不要挂比较好,数据会被污染是啥意思?
git 热更新的时候的确可能混杂几个版本,但是不用停止服务,以及大部分时候热更新也只是更新一两个文件,比起别的语言还是很方便的。

那你来说说 php 独特的生命力在哪里
jarlyyn
2017-05-24 10:36:28 +08:00
@gouchaoer

首先,不知道你挂服务的意思,一般程序也就挂个当前链接。如果连服务都挂了,那错误就严重了。严重错误下,个人觉得,数据都不可信了。

其次,真的线上更新能这样更么……

生命力?

对虚拟空间的支持,最强大的模板语言,专注于网络其他方面干扰的库很少,数量庞大的轮子。
tabris17
2017-05-24 10:39:25 +08:00
让别人去试错,技术成熟了再使用,这样文档和资料也会多很多,不要去趟雷
gouchaoer
2017-05-24 10:43:10 +08:00
@jarlyyn 我还是无法理解你这个宁愿服务挂了的逻辑

真的线上更新为啥不能这么做,要不然你要怎么做?把 php-fpm 停了,git 更新完代码,把 php-fpm 启动,哦对了这么做还得先把流量切到别的应用服务器,完了切回来
jarlyyn
2017-05-24 10:47:13 +08:00
@gouchaoer

如果不能理解,那么就算了。

线上更新肯定是把流量先切掉的吧?
PythonAnswer
2017-05-24 11:10:05 +08:00
可惜我大 python 不给力
wujunze
2017-05-24 11:13:43 +08:00
@hxdhttk 记得之前看到过 把 PHP 运行在 JVM 上的项目
sagaxu
2017-05-24 12:39:09 +08:00
@gouchaoer 现在谁还玩手动发布啊?都是提交到库里,然后自动跑单元测试,测试完自动打包,发布的时候选一个版本,勾上要发布到集群里哪几台机器,然后点发布就完事了,不管什么语言什么打包机制,统统都一样。

Java 应用手动发布也很简单,把新 war 包扔到 tomcat 发布目录,它会在完成解压和 load 之后自动把流量切给新部署的 app,python 的也很简单,文件更新后,执行一下 uwsgi --reload 就可以了。
gouchaoer
2017-05-24 12:48:11 +08:00
@sagaxu 你能教我这一套怎么搞么?不会
gouchaoer
2017-05-24 12:48:57 +08:00
@sagaxu 我毕业后就在一个小厂工作,大厂的工具没见过
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 脚本串联起来即可。
gouchaoer
2017-05-24 13:34:02 +08:00
@jevonszmx 太难了我不会,我要那种开源在 github 上的,我 clone 下了改几下就能用的,最好有图文教程的,轻轻松松就能搞定的。。。。单元测试不是重点,重点是怎么在后台点一下就把代码发布到主机上,而且发布的时候流量是不走发布机器的,发布完了又自动把流量切回来的
xujif
2017-05-24 13:43:21 +08:00
@gouchaoer 应该说连 python 都敢和 php 叫板( web 领域)
gouchaoer
2017-05-24 13:50:35 +08:00
我觉得这个方案不错诶: http://www.oschina.net/question/942494_2208510?sort=default


我在每台机器上跑个 php-cli 监控 redis 的更新指令,更新指令来了先去通知 nginx/load balancer 把我这个节点的流量关了,然后 php-cli 调用 git 去 repo 拉代码,完了通知 nginx 把流量切回来
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 相关的岗位招聘需求就知道了
jevonszmx
2017-05-24 17:47:27 +08:00
@gouchaoer 一般都是一组服务器一起发的,比如说我们有 200 台 php 服务器,每次发布 10 台服务器,下线=>发代码=>检测代码发布完成=>上线,服务器集群会自动把下线的机器从集群在线列表下掉的,用户无感知。

一般公司大了,多多少少会有一些历史问题,想完全用别人的,很难。。。
Citrus
2017-05-24 23:29:21 +08:00
@gouchaoer 这个是可以实现的,现在有 2 ~ 3 个 lua 库可以做到动态更新 Upstream,比如官方的 balance_by_lua,阿里同事做的 ngx_http_dyups_module,还有另外一个忘了名字的,都可以实现。

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

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

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

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

© 2021 V2EX