用 HHvm 运行 Wordpress 是用 Apache 好还是 Nginx 好一点?
系统: 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的方式解决内存泄露)
我之前整理的两个社区的科普文:
PHP7和HHVM的性能之争介绍 想知道答案的方法,就是自己去实践。以下内容仅供参考:
apache / nginx 两者侧重点不同,前者适合搭配各种apache旗下软件使用,后者是单纯的前端代理软件。如果你单纯的跑给站的话,hhvm自己就可以,但是如果要权衡前端缓存,反响代理,细致的客户端缓存设置,还是用nginx吧。
而且如果你没有特殊的需求(svn?hadoop?)的话,nginx完全可以满足你的各种需求,而且配置简单。
至于热加载,你需要的是tengine,支持dso(动态加载模块)。
关于安装和配置,可以参考:
- 配置Ubuntu WebServer基础环境
- 简单配置服务端代理Apache
- 简单配置服务端代理Tengine
如果你用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)吗?
上一篇: 静态方法调用等价于new对象吗