最近想研究一下 hhvm,但是在网上没找到详细的技术文档,所以想自己做一个 wordpress 实例研究一下,选择 web 服务器时让我犹豫了一下:
系统: ubuntu or redhat
因为我自己对 nginx 没有太多研究(我只钟爱apache)。不知道它支不支持虚拟路径。
所以在这里问一下懂 hhvm 的人,是选 apache 或是 nginx 好一点?
也可以提供相关技术文档。
注:我是一个菜鸟……
回复内容:hhvm通常搭配nginx比较多,apache当然也可以,通信方式走fastcgi。
hhvm的介绍如下:
hhvm是一个开源的php虚拟机,使用jit的编译方式以及其他技术,让php代码的执行性能大幅提升。据传,可以将当前版本的原生php代码提升5-10倍的执行性能。
hhvm起源于facebook公司,facebook早起的很多代码是使用php来开发的,但是,随着业务的快速发展,php执 行效率成为越来越明显的问题。为了优化执行效率,facebook在2008年就开始使用hiphop,这是一种php执行引擎,最初是为了将 fackbook的大量php代码转成 c++,以提高性能和节约资源。使用hiphop的php代码在性能上有数倍的提升。后来,facebook将hiphop平台开源,逐渐发展为现在的 hhvm。
hhvm提升php执行性能的方式
hhvm提升php性能的途径,采用的方式就是替代zend引擎来生成和执行php的中间字节码(hhvm生成自己格式的中间字节 码),执行时通过jit(just in time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)转为机器码执行。zend引擎默认做法,是先编译为opcode,然后再逐条 执行,通常每条指令对应的是c语言级别的函数。如果我们产生大量重复的opcode(纯php写的代码和函数),对应的则是zend多次逐条执行这些c代 码。而jit所做的则是更进一步,将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发jit的条件是代码或者函数被多 次重复调用。
普通的php代码,因为无法固定变量的类型,需要额外添加判断类型的逻辑代码,这样php代码是不利于cpu执行和优化 的。因此,hhvm通常需要用到hack写法(为了兼容某种特性而额外添加的技巧性质的代码)的php代码来“配合”,就是为了让变量类型固定,方便虚拟 机编译执行。php追求以一种形式来容纳一切类型,而hack则可以将被容纳的一切标记上确定的类型。
php代码的hack写法的例子:
上面的例子中,php代码主要被添加上了变量类型。hack写法的总体方向,就是将之前“动态”的写法变为“静态”的写法,来配合hhvm。
hhvm因为它的高性能而吸引了不少人的关注,一些一线互联网公司也开始跟进使用。从纯语言执行性能测试结果来看,hhvm领先了开发中的php7版本不少。
不过,从具体业务场景来看,hhvm和php7的差距并没有那么大,以wordpress开源博客首页为测试场景的结果中,他们目前的差距并不明显。
但是,php7目前还在开发中,就已经可用的技术方案来看,目前的hhvm略胜一筹。不过,hhvm的部署和应用都存在一些的问题:
服务部署比较复杂,有一定维护成本。对php原生代码并非完整支持,php拓展也需要做适当的兼容。hhvm是个新虚拟机,长时间运行有内存泄露。(据说,一线互联网公司在应用这个技术时,是通过自己打patch的方式解决内存泄露)ps:php7是php官方社区的下一个大版本,旨在提升php代码的执行性能。
我之前整理的两个社区的科普文:
php7和hhvm的性能之争介绍想知道答案的方法,就是自己去实践。以下内容仅供参考:
apache / nginx 两者侧重点不同,前者适合搭配各种apache旗下软件使用,后者是单纯的前端代理软件。如果你单纯的跑给站的话,hhvm自己就可以,但是如果要权衡前端缓存,反响代理,细致的客户端缓存设置,还是用nginx吧。
而且如果你没有特殊的需求(svn?hadoop?)的话,nginx完全可以满足你的各种需求,而且配置简单。
至于热加载,你需要的是tengine,支持dso(动态加载模块)。
关于安装和配置,可以参考:
配置ubuntu webserver基础环境
简单配置服务端代理apache
简单配置服务端代理tengine如果涉及上传,参考php的设置,在/etc/hhvm/php.ini 设置upload_limit/post_limit...
如果你用hhvm跑前端代理和runtime两个角色的话,那么请参考官方文档。
最后,如果只是通过网站响应速度来评定好坏的话,可以参考:
天下武功,唯快不破标题中的『好』在哪里?不太明白。
先简单来说下 php 运行方式,大概有三种:
1. 命令行(解释器),这个跟 web server 无关
2. mod_php,这个就是说 apache 的模块
3. fpm,官方提供的 fastcgi 协议管理程序,走 fastcgi 协议,apache 和 nginx 都可以做 fastcgi 协议代理转发,不过这种方式一般人都会选择 nginx
对于上面的 2、3 中,个人建议采用 apache(mod_php)方式来运行,主要是简单,稳定,省事,等你折腾到 php 自身(优化、配置)的时候再考虑 nginx 方式。
楼主提到 hhvm 是另外一个东西,这里有个文章:hhvm 是如何提升 php 性能的?请看鸟哥的测试:http://www.laruence.com/2014/12/18/2976.html博客的话,简单就好。如@smallfish所言。
nginx的话主要是高并发,性能高。 apache对于多用户访问采用的是每一个用户一个fork,对内存,线程切换开销可想而知。
apache对于第三方插件可以“热”插拔,重启apache即可。nginx则需要重新编译。
hackshell和php与@smallfish说的一样,fadtcgi,可以说是php的“虚拟机”,相当于是php自身是个服务器,apache和nginx是用来做代理用,处理http请求的一些细节。这件事情取决于你博客的访问量. 大部分人的博客访问量, 对apache+phpmod或者nginx+php-fpm, 压力不会太大, 这点区别, 跟在wordpress启用页面cache插件比, 还是比较小的.
你提供的场景信息太少, 没法做详细的分析nginx + hhvm 运行时候, 跟nginx + php-fpm 运行时候。hhvm 此时等同于 php-fpm 的。都是监听端口或者unix 本地 sock解释php的。就是hhvm解析速度快,目前感受是废一点内存,cpu省一半儿, 兼容性良好, 就是稳定性大概我用hhvm3.3.0 2个月进程意外崩一次, 目前的hhvm 3.5应高好一点。
最快最省服务器的,是 nginx + hhvm(hhvm监听本地sock, 比如 /dev/shm/hhvm.sock)这样是最快最好的 ,也很稳定。听说最好的办法不是nginx+apache+php(wordpress)吗?