centos 6.5下hhvm的安装过程

时间:2022-12-03 08:21:46

HHVM(HipHop Virtual Machine)会将PHP代码转换成高级别的字节码(通常称为中间语言)。然后在运行时通过即时(JIT)编译器将这些字节码转换为x64的机器码。在这些方面,HHVM十分类似与C#的CLR和Java的JVM。

2008年Facebook就开始使用HipHop(现在成为HPHP),这是一种PHP执行引擎;最初是为了将Fackbook的大量PHP代码转成C++,以提高性能和节约资源。最初的版本成为HPHPc,是一个PHP到C++的编译器。
 
之后的两年里,Fackbook又向HipHop中增加了HPHPi和HPHPd,HPHPi其实就是开发版的HPHP,HPHPd则是HipHop的调试器。通过HPHPd开发人员可以单步调试运行在HipHop平台上的PHP代码。
 
使用HipHop的PHP代码在性能上最大可以是原生的6倍。但是,第一版的HipHop有不少确定,具体如下:
HPHPc无法完全支持PHP的所有特性,最典型的是无法支持create_function()和eval()两个函数。但老实说,不支持后一个函数我不觉得是件坏事。
Facebook的开发者不得不维护两种不同的引擎(HPHPc和HPHPi),这直接导致了重复劳动和资源浪费。

最后,HPHPc部署步骤繁杂,这点很让PHP开发者头疼。.

在2010年初,Fackbook因为这些问题做出了2个重大的决定。首先是将HipHop平台开源,通过这种方式来加快HipHop的发展。
其次,Facebook开始开发HipHop的更高版本,也就是HHVM(HipHop虚拟机),HHVM加强了HPHPc的健壮性,同时还修复了许多重要错误。
 
HHVM是在HPHPc的基础上构建,它会将PHP代码转换成高级别的字节码(一种中间语言),在运行时即时(JIT)编译器会将这些字节码翻译成机器码。
 
下面是一些关于字节码、机器码和即时(JIT)编译器的概念,快速的浏览以下概念,可以清楚这些概念在HHVM所处的角色。

  • 字节码:是一种人类无法阅读的代码,专门用来给编译器高效执行的。当HHVM首次加载项目时,它会将所有的PHP代码转换成字节码;字节码的生成是与平台无关的。
  • 机器码:是一系列供CPU执行的指令。用过汇编的都应该清楚机器码,估计没人喜欢用汇编编程。通过编译器就可以把汇编转成机器码,然后供CPU处理。
  • JIT(即时)编译器:即时编译是种软件优化技术,指在运行时才会去编译字节码。字节码会存放在内存中,然后JIT编译器会根据需要加载并编译所涉的字节码。

通过以上技术,HipHop和HHVM获得了性能的提升。



RPM安装过程:
[root@node1 ~]# cd /etc/yum.repos.d
[root@node1 ~]# sudo wget http://www.hop5.in/yum/el6/hop5.repo
[root@node1 ~]# yum clean all
[root@node1 ~]# yum install hhvm
[root@node1 ~]# hhvm --version
HipHop VM 3.0.1 (rel)
Compiler: 
Repo schema: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

rpm安装的hhvm在编译mysql指令时,会自动查找/var/lib/mysql/mysql.sock这个文件

检查mysql.sock的位置。
通过/etc/my.cnf中的socket的字段。
如果socket如下所示:

socket=/tmp/mysql.sock

为mysql.sock增加软连接(相当于windows中的快捷方式)。比如实际的mysql.sock在/tmp/下。
则运行如下命令。

ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock



配置过程:


[root@node1 ~]# groupadd www
[root@node1 ~]# useradd -g www -M -s /sbin/nologin www
[root@node1 ~]# vim /etc/init.d/hhvm
#!/bin/bash
#
# hhvm        Starts The HHVM FastCGI Daemon
#
# chkconfig: - 85 15
# description: Starts The HHVM FastCGI Daemon
# processname: hhvm
# config: /etc/hhvm/server.ini
# config: /etc/sysconfig/hhvm
# pidfile: /var/run/hhvm/hhvm.pid
#
### BEGIN INIT INFO
# Provides: hhvm
# Short-Description: start and stop the HHVM FastCGI Daemon
# Description: Starts The HHVM FastCGI Daemon
### END INIT INFO


# Standard LSB functions
#. /lib/lsb/init-functions


# Source function library.
. /etc/init.d/functions


# Check that networking is up.
. /etc/sysconfig/network


if [ "$NETWORKING" = "no" ]
then
exit 0
fi


RETVAL=0
HHVM=/usr/bin/hhvm
prog="Hhvm"
pidfile=${PIDFILE-/var/run/hhvm/pid}
lockfile=${LOCKFILE-/var/run/hhvm/lock}


CONFIG_HDF_FILE="/etc/hhvm/config.hdf"
CONFIG_FILE="/etc/hhvm/server.ini"
SYSTEM_CONFIG_FILE="/etc/hhvm/php.ini"
MODE=daemon
USER=www
ARGS="--config ${CONFIG_FILE} --config ${SYSTEM_CONFIG_FILE} --config ${CONFIG_HDF_FILE}"


if [ -f /etc/sysconfig/hhvm ]; then
. /etc/sysconfig/hhvm
fi




start() {
echo -n $"Starting $prog: "
dir=$(dirname ${pidfile})
[ -d $dir ] || mkdir $dir
daemon ${HHVM} --mode ${MODE} --user ${USER} ${ARGS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${lockfile}
}




stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} ${HHVM}
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f ${lockfile} ${pidfile}
fi
}


restart () {
stop
start
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} ${HHVM}
        RETVAL=$?
        ;;
  restart)
restart
        ;;
  *)
        echo $"Usage: $prog {start|stop|status|restart}"
        RETVAL=2
esac


exit $RETVAL


:wq

或者直接下载:
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm


[root@node1 ~]# chmod +x /etc/init.d/hhvm

[root@node1 ~]# cd /etc/hhvm
[root@node1 ~]# vim server.hdf
fastcgi模式:
Server {
  Port = 9001
  DefaultDocument = index.php
  Type = fastcgi
}
可以用于nginx代理转发模式,像php-fpm一样用法
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:
location ~ .*\.(php|php5)?$  {
                fastcgi_pass   127.0.0.1:9001;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
                }

/user/local/nginx/sbin/nginx -s reload


web服务器模式:
Server {
  Port = 9001
  SourceRoot = /var/www/ #服务器根目录
  DefaultDocument = index.php
}
这样设置可以脱离nginx或apache,直接通过浏览器访问URL:http://域名:端口号/php文件名
类似http://localhost:9001/test.php



[root@node1 ~]# service hhvm start
Starting Hhvm: [  OK  ]


参考文章:

http://nareshv.blogspot.com/2014/04/installing-hhvm-301-on-centos-65-64-bit.html

http://blog.linuxeye.com/396.html