`
saiyaren
  • 浏览: 225984 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hiphop 1.0 静态版使用说明(hhvm1.0和2.1可借鉴) 原创-胡志广

阅读更多

1       摘要

Hiphop是由facebook 公司开发的应用程序,主要是将php代码转换成C++代码进行高度优化,然后由g++生成二进制文件。

官方说明hiphop要比apache+php节约50%cpu

经测试,hiphop 要比nginx+fastcgi(加速器)的性能高出60%以上,要比nginx+fastcgi(无加速器)的性能高出150%左右。

本文对hiphop的部署、运行以及开发相关的规范和注意事项进行了详细说明。

2       部署

2.1     环境

操作系统版本Centos需要在6.2以上才可以很好的支持。

2.2     安装流程

安装环境支持建议通过yum方式进行安装,通过手动安装支持包的方式,会出现一些不可预见性的错误。

安装流程如下:

我们设定我们的安装目录在/export/dev

(1)       yum 相关环境支持包

sudo yum install git svn cpp make autoconf automake libtool patch memcached gcc-c++ cmake wget boost-devel mysql-devel pcre-devel gd-devel libxml2-devel expat-devel libicu-devel bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel binutils-devel pam-devel elfutils-libelf-devel

安装libmcrypt

cd /export

mkdir dev

cd dev

wget 'ftp://rpmfind.net/linux/epel/beta/6/x86_64/libmcrypt-devel-2.5.8-9.el6.x86_64.rpm'

wget 'ftp://rpmfind.net/linux/epel/beta/6/x86_64/libmcrypt-2.5.8-9.el6.x86_64.rpm'

sudo rpm -i libmcrypt-*.rpm

libmcrypt-devel-2.5.8-9.el6.x86_64.rpmlibmcrypt-2.5.8-9.el6.x86_64.rpm包下载后可进行直接安装。

(2)       获取hiphop 源码

cd /export/dev

git clone git://github.com/facebook/hiphop-php.git

cd hiphop-php

export CMAKE_PREFIX_PATH=`/bin/pwd`/../usr

export HPHP_HOME=`/bin/pwd`

export HPHP_LIB=`/bin/pwd`/bin

export USE_HHVM=1

cd ..

获取git hiphop最新源码,并且配置环境变量,代码我们会git指定某个版本进行部署。

环境变量:

CMAKE_PREFIX_PATH :hiphop第三方支持库的安装地址,如/export/dev/usr

HPHP_HOME:是hiphop的目录地址,如/export/dev/hiphop-php

HPHP_LIB:hiphop的库目录地址,如/export/dev/hiphop-php/bin

(3)       安装第三方库

l  libevent

cd /export/dev

git clone git://github.com/libevent/libevent.git

cd libevent

git checkout release-1.4.14b-stable

cat ../hiphop-php/src/third_party/libevent-1.4.14.fb-changes.diff | patch -p1

./autogen.sh

./configure --prefix=$CMAKE_PREFIX_PATH

make

make install

cd ..

git最新的libevent包,然后安装hiphoplibevent补丁,打好补丁后安装libevent

l  libCurl

cd /export/dev

git clone git://github.com/bagder/curl.git

cd curl

cat ../hiphop-php/src/third_party/libcurl-7.22.1.fb-changes.diff | patch -p1

./buildconf

./configure --prefix=$CMAKE_PREFIX_PATH

make

make install

cd ..

git最新的libCurl库,然后安装hiphoplibcurl补丁,打好补丁后安装libCurl

l  libmemcached

wget http://launchpad.net/libmemcached/1.0/0.49/+download/libmemcached-0.49.tar.gz

tar -xzvf libmemcached-0.49.tar.gz

cd libmemcached-0.49

./configure --prefix=$CMAKE_PREFIX_PATH

make

make install

cd ..

         下载libmemcached库,然后进行安装。

l  JEMalloc 3.0(可选)

wget http://www.canonware.com/download/jemalloc/jemalloc-3.0.0.tar.bz2

tar xjvf jemalloc-3.0.0.tar.bz2

cd jemalloc-3.0.0

./configure --prefix=$CMAKE_PREFIX_PATH

make

make install

cd ..

下载JEMalloc库,然后进行安装

l  Tbb

cd /export/dev

wget 'http://threadingbuildingblocks.org/uploads/77/187/4.0%20update%205/tbb40_20120613oss_src.tgz'   

tar -zxf tbb40_20120613oss_src.tgz

cd tbb40_20120613oss

make

 

sudo mkdir -p /usr/include/serial

sudo cp -a include/serial/* /usr/include/serial/

 

sudo mkdir -p /usr/include/tbb

sudo cp -a include/tbb/* /usr/include/tbb/

 

sudo cp build/linux_intel64_gcc_cc4.4.6_libc2.12_kernel2.6.32_release/libtbb.so.2 /usr/lib64/

sudo ln -s /usr/lib64/libtbb.so.2 /usr/lib64/libtbb.so

cd ..

下载并安装tbb

l  Libdwarf

git clone git://libdwarf.git.sourceforge.net/gitroot/libdwarf/libdwarf

cd libdwarf/libdwarf

./configure

make

sudo cp libdwarf.a /usr/lib64/

sudo cp libdwarf.h /usr/include/

sudo cp dwarf.h /usr/include/

cd ../..

git最新libdwarf库并进行安装

 

l  安装libiconv

tar zxvf libiconv-1.13.1.tar.gz

cd libiconv-1.13.1

./configure

make

make install

cd ..

l  安装libunwind

wget 'http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.tar.gz'

tar -zxf libunwind-1.0.tar.gz

cd libunwind-1.0

autoreconf -i -f

./configure --prefix=$CMAKE_PREFIX_PATH

make

make install

cd ..

(4)            安装hiphop

cd /export/dev/hiphop-php

git submodule init

git submodule update

export HPHP_HOME=`pwd`

export HPHP_LIB=`pwd`/bin

mkdir build

cd build

cmake ../

make

这里注意,需要创建build文件夹,在buildcmakemake hiphop,如果在根目录编译则会与源码混淆出现不可预见性的错误。

到此安装hiphop的环境、第三方库和hiphop源码安装完毕。

注:

上述的是官方提供的安装方式,我们会将需要的安装内容进行打包和编写脚本进行自动化安装。

3       运行hiphop

3.1     编译

(1)       编译单个php文件

$HPHP_HOME/src/hphp/hphp test.php --keep-tempdir=1 --log=3

编译成功会提示如下内容:

running hphp...

creating temporary directory /tmp/hphp_knJ6dL ...

parsing inputs...

parsing inputs took 0'00" (34 ms) wall time

pre-optimizing...

pre-optimizing took 0'08" (8175 ms) wall time

analyze includes...

analyze includes took 0'00" (0 ms) wall time

inferring types...

inferring types took 0'00" (56 ms) wall time

post-optimizing...

post-optimizing took 0'00" (68 ms) wall time

creating CPP files...

creating CPP files took 0'00" (256 ms) wall time

saving code errors...

compiling and linking CPP files...

compiling and linking CPP files took 1'09" (69308 ms) wall time

all files saved in /tmp/hphp_knJ6dL ...

running hphp took 1'18" (78058 ms) wall time

(2)       编译整个目录的php文件

首先,在php应用目录,查找php内容并生成files.list文件:

find . -name "*.php" > files.list

编译files.listphp文件内容

$HPHP_HOME/build/src/hphp/hphp --input-list=files.list -k 1 --log=3 \

  --cluster-count=50 \

  -v "AllDynamic=true" –o /export/hphp_project/test

编译成功会提示如下内容:

running hphp...

parsing inputs...

parsing inputs took 0'00" (43 ms) wall time

pre-optimizing...

pre-optimizing took 0'08" (8208 ms) wall time

analyze includes...

analyze includes took 0'00" (0 ms) wall time

inferring types...

inferring types took 0'00" (43 ms) wall time

post-optimizing...

post-optimizing took 0'00" (69 ms) wall time

creating CPP files...

creating CPP files took 0'00" (291 ms) wall time

saving code errors...

compiling and linking CPP files...

compiling and linking CPP files took 1'09" (69585 ms) wall time

all files saved in /export/hphp_project/test_a/ ...

running hphp took 1'18" (78437 ms) wall time

 

如果失败会提示如下内容:

……

compiling and linking CPP files took 1'27" (87731 ms) wall time

hphp failed

running hphp took 1'36" (96498 ms) wall time

 

(3)       基本参数解释

$HPHP_HOME/build/src/hphp/hphp:是hphp的编译命令,可通过—help查看编译参数的详细内容

--input-list:引入查找后的php生成的列表文件,如果要编译单一的php文件则不用该参数

-k[--keep-tempdir]:k为真时(1),如果没有指定输出路径,则会每次生成一个临时文件夹在tmp目录中,如(1)中没有指定输出目录,则输出到了临时文件夹:

creating temporary directory /tmp/hphp_knJ6dL ...

--log:输出的日志级别,默认-10是不输出日志;1是只输出错误日志;2是警告和错误日志;3是基本信息输出;4完整的日志信息

--cluster-count:生成cpp 的数量,在生成二进制文件的路径下的cpp文件夹中可以查看生成的cpp文件,数量12生成的数量为12,3以上的生成数量为n+10是每个php生成一个cpp文件。

--force:配置force=1,那么将在编译时强制忽略php转换二进制代码中的警告和错误,只有在运行时才会发现这些错误。

-v "AllDynamic=true"-v 是配置参数以key-value的方式配置,详细参数可见hiphop文档,AllDynamic=true可支持动态的函数调用和动态方法调用,所以建议开启。

-o-o 文件输出路径,-o这个参数可以指定输出的hiphop编译好的二进制文件的路径,如果不指定路径,那么则会将编译好的二进制内容输出到临时文件夹。

3.2     执行

(1)       简单执行

进入生成二进制文件的目录,然后执行如下命令:

./program –m server

然后屏幕上会输出如下内容:

mapping self...

mapping self took 0'00" (35 ms) wall time

loading static content...

searching all files under source root...

analyzing 342 files under source root...

loaded 0 bytes of static content in total

loading static content took 0'00" (5 ms) wall time

page server started

admin server started

all servers started

输出如上内容后,说明服务已经启动成功,我们可以通过浏览器访问URL,如:

http://192.168.12.63/test.php,成功后会显示出页面,如果失败或者抛了错误,会在控制台或日志中输出具体错误的内容。

-m server采用的是非守护进程模式启动,默认端口是80,默认管理端口是8088

(2)       配置日志

配置日志格式是和apache的日志格式一致的,详细配置日志格式可参照apache的配置,下面进行配置一个日志的demo:

Log {

    Level = Info

    UseLogFile = true

    File = /export/hphp_project/info.log

    # access log settings

    AccessLogDefaultFormat = %h %l %u %t \"%r\" %>s %b

    Access {

      * {

        File = /export/hphp_project/access.log

        Format = %h %l %u %t \"%r\" %>s %b

                }

    }

    # admin server logging

    AdminLog {

    File = /export/hphp_project/ admin.log

      Format = %h %t %s %U

        }

     }

配置内容解释:

Level: None (default) | Error | Warning | Info | Verbose(完整)

File:是输出日志的路径,最外层的File,上面配置为info.log的日志是记录服务日志信息的。

Access中的File是记录访问的日志信息的,可进行自定义每种访问类型的日志格式如(*.php,*.jpg),也可采用默认的日志格式进行输出,日志格式和apache 的日志配置一致。

AdminLog:是配置管理平台日志的

注:

File的路径需要采用绝对路径,相对路径在server模式下没有问题,可以正常输出日志,但是在守护进程(daemon)模式下必须用绝对路径日志才可以输出日志。

这个配置在一个文件中,然后在启动程序时进行加载即可,配置文件名字为program.conf,如:

./program –m server –c program.conf

这样配置文件即加载,如果启动时没有提示配置错误那么即加载成功,如果提示了加载错误,那么需要查找配置中的问题进行修改后重新启动。

如果在启动多进程时,那么输出的日志最好进行每个进程一个,那么配置日志就可以如此配置:

./program –m server –c program.conf -v “Log.File=/export/hphp_project/info_8080.log”

这样就覆盖了program.conf中的File地址,输出日志到info_8080.log中,这样就可以执行每个进程到某个指定路径下,-v是进行key-value这样的配置选项的,key是我们配置中的选项,如配置中的最外层是Log,然后二级是File,依次类推,就可以通过Log.File.xxxx.xxx这样的形式去配置,具体的配置需要参照配置文档中的结构。

(3)       开启守护进程

Hiphop生成可执行文件后,执行可以采用多种模式进行运行,program的模式分为如下几种:

run | debug (d) | server (s) | daemon | replay | translate (t)

我们常用的一般是server(启动命令行模式) 和daemon(守护进程)

./program –m server|daemon

启动守护进程模式,最好配置日志,否则出现问题后,无法跟踪

./program –m daemon –c program.conf –v “Log.File=/export/logs/program.log”

我们应用的日志配置采用(2)中的,输出日志到/export/logs/program.log,如果不配置日志,在守护进程模式下会提示:

Log file not specified under daemon mode.\n\n错误,守护进程模式下配置日志需要绝对路径

(4)       开启多进程

开启多进程可对program 的负载进行均匀分摊提高吞吐能力;

开启多进程需要设置programhttp监听端口和管理端口

设置http监听端口是 –p 端口

设置管理端口是 –admin-port 端口

例:

./program –m server –p 8080 –admin-port 18080

Hiphop生成的二进制代码后,默认的http监听端口是80,管理端口8088

(5)       Server配置

Server配置一些应用相关的基本信息,如压缩、域名、IP、默认页等等。

Server一般配置如下:

Server {

    #域名

    Host = www.xxx.com

    IP = 192.168.12.63

    Port = 80

    #线程数量

    ThreadCount = 16

    #post最大提交大小

    MaxPostSize = 10MB

    #上传文件的最大大小

    UploadMaxFileSize = 10MB

    # 图片处理文件内存最大byte

    ImageMemoryMaxBytes = UploadMaxFileSize * 2

    #默认页

    DefaultDocument = index.php

    #404

    ErrorDocument404 = 404.php

    #500

    ErrorDocument500 = 500.php

    #压缩级别1-90是不压缩

    GzipCompressionLevel = 3

    #启用keepAlive

    EnableKeepAlive = true

    #允许分块编码response

    EnableEarlyFluh = true

    #强制分块编码reponse 不管客户端是否接受

    ForceChunkedEncoding = false

    #允许文件上传

    EnableFileUploads = true

    #这是libevent的微调选项,libeventSyncSend允许将响应报文直接发给工作线程,从而使服务器响应更快

    LibEventSyncSend = true

    #指定发送多少响应队列

    ResponseQueueCount = 0

    #连接超时时间

    ConnectionTimeoutSeconds=1

    #默认编码

    DefaultCharsetName = UTF-8

}

这个是添加到配置文件中的,然后通过-c 添加即可如:

./program –m server –c program.conf

也可以针对某个选项进行单一配置,用key-value形式,如

./program –m server -v Server. DefaultCharsetName=UTF-8

4       扩展引入

CMake/HPHPFind.cmake文件的最后位置添加上这些引用

include_directories(/export/dev_hhvm/usr/include)

/export/dev_hhvm/usr/lib/mongodb_c_driver/libmongoc.so)

        target_link_libraries(${target} /export/dev_hhvm/usr/lib/mongodb_c_liulei/libmongoc.so)

 

 #ICE

#   include_directories(/export/huzhiguang/files/Ice-3.4.1/include)

    include_directories(/export/dev_hhvm/usr/include/freetds)

    include_directories(/export/dev_hhvm/usr/include/Ice)

 

     target_link_libraries(${target} /export/huzhiguang/files/Ice-3.4.1/lib64/libIce.so)

     target_link_libraries(${target} /export/huzhiguang/files/Ice-3.4.1/lib64/libIceUtil.so)

#    target_link_libraries(${target} /export/dev_hhvm/usr/lib/Ice/libIce.so)

#    target_link_libraries(${target} /export/dev_hhvm/usr/lib/Ice/libIceUtil.so)

 

#   target_link_libraries(${target} /export/servers/freetds/lib/libsybdb.so)

    target_link_libraries(${target} /export/dev_hhvm/usr/lib/freetds/libsybdb.so)

    target_link_libraries(${target} /export/dev_hhvm/usr/lib/fastlz/fastl

5       Hiphop 配置的环境变量

BOOST_INCLUDE=/export/servers/boost-1.50/include/

BOOST_LIB=/export/servers/boost-1.50/lib

export BOOST_INCLUDE BOOST_LIB

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/servers/gmp-4.3.2/lib:/export/servers/mpc-1.0/lib:/export/servers/mpfr-3.1.1/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/servers/gcc-4.6.1/lib64

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BOOST_INCLUDE:$BOOST_LIB

export PATH=/export/servers/gcc-4.6.1/bin:$BOOST_INCLUDE:$BOOST_LIB:$PATH

export CMAKE_PREFIX_PATH=/export/dev_hhvm/usr/

export HPHP_HOME=/export/dev_hhvm/hiphop-php_hzg

export HPHP_LIB=$HPHP_HOME/bin

export USE_HHVM=1

export LANG="C"

ulimit -c unlimited

 

export ICE_HOME=/export/huzhiguang/files/Ice-3.4.1

export PATH=/export/huzhiguang/files/Ice-3.4.1:$PATH

export DB_HOME=/export/huzhiguang/files/db-4.8.30.NC

export PHP_HOME=/export/servers/php-5.3.5

export PHP_BIN=$PHP_HOME/bin

export PATH=$PHP_BIN:$PATH

 

export PATH=$PATH:/export/servers/freetds/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/servers/freetds/lib

export PATH=/export/servers/freetds/include:/export/servers/freetds/lib:$PATH

 

分享到:
评论

相关推荐

    hhvm-ext-uuid:HipHop VM 的 UUID 扩展 (HHVM HNI DSO)

    HHVM 的 UUID (uuid) 扩展这是 HipHop 虚拟机的 PECL uuid 扩展的一个端口。先决条件此扩展需要安装头文件和libuuid库。 在 Ubuntu 12.04 上,您需要安装“uuid-dev”和“libuuid1”包。建筑与安装需要 HHVM 3.0 或...

    执行PHP代码的虚拟机HHVM.zip

    HipHop VM(HHVM)是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点。Facebook表示,HHVM将替代HPHPi,用于所有的PHP执行。根据 Facebook...

    user-documentation, 为那些使用HHVM和写入黑名称和PHP代码的HHVM编写文档 http.zip

    user-documentation, 为那些使用HHVM和写入黑名称和PHP代码的HHVM编写文档 http HHVM和 hack-用户文档这是HHVM和 hack 用户文档文件的repo 。 欢迎使用贡献和反馈。什么?这里 repo 有三个键区域:用户文档: 指南 。...

    hack-hhvm-docs, 黑客和HHVM手册和文档.zip

    hack-hhvm-docs, 黑客和HHVM手册和文档 我们移动了仓库我们有新的文档。 它们位于 http://github.com/hhvm/user-documentation的新 repo 中。请检查一下,欢迎捐赠。如果仍然需要这里 repo的源代码,则可以签出最终...

    适用于hhvm平台的Swoole扩展。-PHP开发

    hhvm-swoole HHVM上的Swoole。 要求Linux PHP-7.1或更高版本GCC-5或更高版本Swoole-4.2.12或更高版本HHVM-3.21或更高版本构建libswoole.so git clone https://github.com/swoole/swoole-src.git hhvm-swoole开启...

    Benchmark-PHP-HHVM-Zephir, 基准 PHP,HHVM和 Zephir.zip

    Benchmark-PHP-HHVM-Zephir, 基准 PHP,HHVM和 Zephir PHP vs HHVM vs Zephir vs QB这个基准是使用 Mandelbrot集作为它的任务。 Mandelbrot我的实际算法代码不是我的,由贡献者编写的计算机语言基准测试游戏( ...

    baidu-hhvm, 预构建HHVM到 make install,并轻松尝试 HHVM.zip

    baidu-hhvm, 预构建HHVM到 make install,并轻松尝试 HHVM http://bcs.duapp.com/hhvm-package/hhvm-3.0.1-V0.1.tar.gz 1.解压hhvm。tar 。gztar zxvf hhvm.tar.gzcd

    hhvm-ext-uv:HHVM libuv扩展

    hhvm-ext-uv hhvm-ext-uv是具有高性能异步I / O的的扩展。 功能亮点 异步TCP和UDP套接字 异步DNS解析 信号处理 SSL支持 Http 1.1保持活动支持 带有路由的高性能Web服务器 建造要求 自动配置 自动制作 促进 查看 g +...

    Facebook开源的高效的PHP运行环境HHVM.zip

     通过以上技术,HipHop和HHVM获得了性能的提升。据官方介绍,与PHP 5.2引擎 APC相比,HHVM可以处理的Web请求吞吐量增加了9倍,而内存消耗减少了5倍。实际上HHVM之前有朋友留言提起过它,亲自测试过后发现HHVM在提升...

    docker-nginx-hhvm:在 CentOS-7 上使用 Nginx+HHVM 的 Docker

    这是一个带有 Nginx 和 HHVM镜像。 包括的东西: - HHVM HHVM 版本 3.6-dev(下一个 LTS - 长期支持)从 CentOS-7 上的源代码构建。 注意:如果你想自己构建它,需要一段时间......(小时)。 HHVM 服务器已启动...

    vagrant-ubuntu14-trusty-hhvm:Ubuntu 14 Trusty上HHVM的流浪文件

    $ cd hhvm-vagrant $ vagrant up 虚拟机启动后,您可以通过SSH登录 $ vagrant ssh $ ... 服务器根文件夹是/vagrant/www (在地图上),它是主机上的www文件夹。 HHVM服务器可从主机操作系统上

    vagrant-hhvm-nginx-posgresql-symfony-hack:使用 hhvmnginxpostgresqlsymfony 和 Hack 创建 webapp 的基础项目

    Vagrant + nginx + posgresql + hhvm + symfony + Hack 请不时阅读和检查此自述文件,以免以后浪费时间想知道如何做这里已经解释过的事情如果有什么错误或遗漏:告诉我,如果你不告诉我,我没有办法改进它 =) 注意:...

    hhvm-master.zip

    hack,php编辑调试工具,facebook发布的可供2亿人使用的web编程语言,借鉴了java和php的优点,很有前途

    docker-hhvm:可以运行 hacklang 的 docker 容器

    创建Dockerfile和src目录后, docker build -t chara/hhvm . docker run -i -t -d -v ' pwd ' /src:/home --name hhvm chara/hhvm /bin/bash docker attach hhvm 你可以这样做。 登录后,可以通过在本地src/创建一...

    ab压力测试hhvm运行ci

    自己搭建了hhvm+nginx运行ci 和 nginx+php-fpm的一点测试数据

    HHVM安装与性能测试

    关于HHVM 安装 与 性能测试,性能测试与opcache进行了对比

    最新版本PHP 7 vs HHVM 多角度比较

    PHP 7 是 PHP 社区对 HHVM 的回应。...不过,PHP 还有一个竞争对手 HHVM (HipHop Virtual Machine) 一个运行 PHP 代码的虚拟工具。二者直接的比较正在升温,那么让我们来看一下他们直接的性能对比吧

    hhvm-yaf:hhvm-yaf是php-yaf的hhvm扩展

    $ git clone https://github.com/sherlockhua/hhvm-yaf.git $ /path/to/hphpize $ cmake . $ make $ cp yaf.so /path/to/your/hhvm/ext/ 文档 Yaf手册可以在以下位置找到: ://www.php.net/manual/zh/book.yaf.php ...

Global site tag (gtag.js) - Google Analytics