- PHP 版本
- 简要说明
- Linux 系统
- Mac 系统
- 常见问题
- 1. static libc++ library "libstdc++.a" unavailable 警告
- 2. php_pcre_free 未定义错误
PHP 版本
简要说明
本文档仅适用于 1.0 版本,新的文档还在编写中。目前请参考 git 目录下的 build-php5.sh / build-php7.sh 来了解如何编译
PHP 版本依赖于如下几个库:
- Google V8 - 5.9
- fswatch - 1.11.2 (已经集成源代码,无需下载)
- libcurl - 7.61.1
- openssl - 1.0.2q
- pcre - 8.4.1
Linux 系统
对于 Linux 系统,我们要求使用 g++ 4.9
或者更高版本进行编译,并静态链接 libstdc++
,否则可能在其他机器出现兼容性问题。当然,为了保证最大兼容性,我们建议你使用和生产环境相同的环境进行编译。
下面,我们以 CentOS 6
为例,讲解如何编译 OpenRASP PHP 扩展。值得注意的是,CentOS 7
的安装方法、要执行的命令完全一样。
首先,我们来准备编译环境
使用如下命令,安装 devtools-3 (g++ 4.9.2)
以及 xxd
命令
yum install -y centos-release-scl vim-common libuuid-devel pcre-devel
yum install -y devtoolset-3-gcc-c++
如果你使用的是发行版自带的 PHP 软件,你还需要安装对应的头文件
yum install -y php-devel
安装完成后,执行如下命令进入编译环境
scl enable devtoolset-3 bash
-或者-
source /opt/rh/devtoolset-3/enable
然后,我们来编译 Google V8。为了节省编译时间,我们提供了编译好的 libv8-5.9-linux.tar.gz,可直接下载使用。我们下载并解压到 /tmp
:
wget https://packages.baidu.com/app/openrasp/libv8-5.9-linux.tar.gz -P /tmp
tar -xvf /tmp/libv8-5.9-linux.tar.gz -C /tmp
最后,我们来编译 OpenRASP PHP 扩展
进入源代码目录,执行下面的命令即可;如果你的 PHP 是自己编译的,请使用对应路径的 phpize
命令。
# 如果之前编译过,清理下临时文件
phpize --clean
# 生成 configure 文件
phpize
# 生成 makefile
./configure --with-v8=/tmp/libv8-5.9-linux --enable-openrasp-remote-manager --with-gettext -q
# 编译
make
若要指定 curl/pcre/openssl 路径,请在 configure 阶段增加如下参数,e.g
--with-curl=/tmp/static-lib --with-openssl=/tmp/static-lib --with-pcre-regex=/tmp/static-lib
如果 make 命令没有出错,可以继续执行 make install
安装。也可以将生成的扩展 modules/openrasp.so
复制到其它机器安装。对于扩展的具体安装方法,请参考 PHP 服务器安装
Mac 系统
为了节省时间,我们也提供了编译好的类库 libv8-5.9-macos.tar.gz,适用于 MacOS 10.X,可直接下载使用。其余步骤同 Linux 系统。
常见问题
1. static libc++ library "libstdc++.a" unavailable 警告
当编译环境缺少 C++ 静态链接库时,即 libstdc++.a
,我们会在 configure
脚本里打印这个警告:
# ./configure --with-v8=/tmp/libv8 -q
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
Warning: static libc++ library "libstdc++.a" unavailable, porting to other system may fail!
如果不能静态链接 C++ 函数库,将编译好的扩展安装到生产环境时可能会出现找不到 libstdc++.so
这样的错误。当然,如果你的编译环境和生产环境完全相同,可以忽略这个错误。
2. php_pcre_free 未定义错误
PHP 集成了 pcre 源代码,并在自己的头文件里,将 pcre_free 重新定义为了 php_pcre_free,所以出现了这个错误。一个简单的方法是修改 php_compat.h
,去掉这个 define
。e.g 打开 /usr/include/php/main/php_compat.h
,找到如下代码:
#if defined(HAVE_BUNDLED_PCRE) || !defined(PHP_VERSION)
将这一行修改为:
#ifdef WHATEVER_YOU_LIKE
然后重新编译即可。