hiphop 是facebook开发的一个php编译器项目.
hiphop先把php代码转换成c++代码,让后使用c++编译器如gcc编译成目标机器码.
hiphop用来提高facebook服务器的使用效率. 目前,超过90%的facebook网站流量经由hiphop编译的php代码处理.
hiphop还把一系列php脚本代码编译成了多线程web服务器, 这样, 编译后的php代码不仅运行更快, 同时也更好的利用了系统内存.
多线程web服务器使用更少的内存, 因为它使用单个内存池来处理所有并发请求. 这和多进程web服务器(如apache的pre-fork模式)有显著的不同.
目前绝大多数php web服务器都是多进程模式,在这种模式下,每个请求会被不同的系统进程处理。每个进程拥有自己的内存池。
多进程模式的主要问题是,如果一个进程占用了大量内存,在该进程退出之前,这些内存无法返回到系统中,即使该进程处理的后续请求并不需要这么多的内存,而多余的内存空间不能被利用来处理其他的并发请求。
apache设计上可以在一定时间内强制关闭某个进程,从而内存得以循环使用。不过进程退出前总会有内存浪费的情况存在。
内存使用情况对于大型网站而言至关重要,因为它决定了web服务器能够处理的并发请求数。
比如,如果你有一个1gb内存的web服务器,每个php请求占用10mb,那么理论上能够同时处理的并发请求数为100。
如果同时运行的应用程序使用的内存超出了可用的物理内存,操作系统会启用虚拟内存,把物理内存中的部分内存块置换到磁盘的虚拟内存区,这样系统性能将迅速下降。
过量的并发请求会让服务器瘫痪,即导致所谓的dos(服务拒绝)。对于apache,你可以使用配置项maxclients来限定并发访问数,这样超出限定的请求将进入服务队列,从而避免服务器瘫痪。不过这意味着部分请求会被延迟处理甚至会被忽略。
多线程还是多进程模式实际上之前已经有过讨论:use of multi-threaded web servers for handling high traffic. 注意这篇文章只推荐使用多线程web服务器来处理静态文件如图片,css和javascript。
hiphop一个新的方面是facebook工程师把php扩展转换成了线程安全的代码。
这里顺便提一下还有一些非机器码php编译器,比如编译成java字节码的quercus 和 project zero, 或者编译成.net assemblies 的phalanger。
