基于PHP5.5以上版本的扩展编译环境搭建

一、目标系统和开发工具
Windows 7 sp1 企业版 x64
Visual Studio 2012 sp3 中文版

二、官方文档地址
https://wiki.php.net/internals/windows
https://wiki.php.net/internals/windows/stepbystepbuild

三、下载相关程序包备用,已便于开发
a. 下载PHP源码包,按照官方一般是当前最新开发包 http://snaps.php.net/ ,也可以使适当的安装包。此处使用php5.5的
b. 下载php SDK包以及lib包,下载地址:http://windows.php.net/downloads/php-sdk/
根据php版本选择deps的版本,sdk可以选择任意版本,我一般习惯选择最新的

四、创建并部署开发环境
a. 在F盘创建文件夹php_sdk(在哪个盘无所谓的)
b. 解压缩 php-sdk-binary-tools-20110915.zip 里面的内容到php_sdk根目录(注意,bin,script.share在php_sdk根目录哦)
c. 修改 phpsdk_buildtree.bat
在 VC9 的代码段后面增加 VC11 的代码段

MD %_%vc11x86depsbin
MD %_%vc11x86depslib
MD %_%vc11x86depsinclude
MD %_%vc11x64depsbin
MD %_%vc11x64depslib
MD %_%vc11x64depsinclude

d. 打开 “打开 VS2012 x64 本机工具命令提示”(如果开始菜单可用的话,x86的话打开 x86的)

e. 在命令行模式下依次执行下面的命令:
F:
cd php_sdk
binphpsdk_setvars.bat
binphpsdk_buildtree.bat php55dev

f. 因为我们要创建vc11(VS 2012),x64的扩展编译,因此,进入到vc11下面的x64文件夹,将deps-5.5-vc11-x64.7z 解压缩到x64下,覆盖其deps目录哦
g. 解压缩php源码包到x64目录下(此次是基于 php5.5-201308300430.tar.gz2 的)
h. 在x64目录下创建 pecl 文件夹,用于存放 vld 扩展包源码;并将从 http://pecl.php.net 下载的 vld 源码包解压缩到pecl,并将文件夹重命名成 vld。也可以从 SVN 获取最新的开发版 svn://svn.xdebug.org/svn/php/vld/trunk
i. 在x64目录下创建obj文件夹,用于保存编译时生成的文件

五、开始编译
a. 执行下述命令行,创建.configure 文件(当前路径 F:php_sdk>)
cd php55devvc11x64php5.5-201308300430
buildconf

b. 输出帮助文档
configure –help >..php_configure_help.txt

c. 开始编译 Thread safety 版本
configure –disable-all –enable-snapshot-build –enable-cli –enable-cgi –enable-vld=shared –enable-object-out-dir=..obj –enable-session

d. 开始编译  Non Thread safety 版本
configure –disable-all –enable-snapshot-build –enable-cli –enable-cgi –enable-vld=shared –enable-object-out-dir=..obj –enable-session –disable-zts

e. 执行编译(当前路径:F:php_sdkphp55devvc11x64php5.5-201308300430)
nmake /x std_err.log >> ..output.log
f. 错误排除
..peclvldvld.c(120) : error C2106: “=”: 左操作数必须为左值
..peclvldvld.c(120) : warning C4550: 表达式计算为缺少参数列表的函数
..peclvldvld.c(141) : error C2106: “=”: 左操作数必须为左值
..peclvldvld.c(141) : warning C4550: 表达式计算为缺少参数列表的函数
..peclvldvld.c(166) : error C2106: “=”: 左操作数必须为左值
..peclvldvld.c(166) : warning C4550: 表达式计算为缺少参数列表的函数

以上错误是因为php 5.5 中不再允许重载 zend_execute
参见 UPGRADING.INTERNALS:
* extensions can’t override zend_execute() any more, they should override
zend_execute_ex() instead. The EG(current_execute_data) is already
initialized in zend_execute_ex(), so for compatibility extensions
may need to use EG(current_execute_data)->prev_execute_data instead.

因此,所有 zend_excute 的重载必须废除
修改 vld.c,增加定义:
static zend_op_array* (*old_compile_string)(zval *source_string, char *filename TSRMLS_DC);
static zend_op_array* vld_compile_string(zval *source_string, char *filename TSRMLS_DC);

在vld.c文件最后增加函数定义

/* {{{ void vld_execute_ex(zend_execute_data *execute_data TSRMLS_DC)
* This function provides a hook for execution */
static void vld_execute_ex(zend_execute_data *execute_data TSRMLS_DC)
{
// nothing to do
}
/* }}} */

其余修改
zend_execute        = old_execute; 替换为 zend_execute_ex = old_execute_ex; 共 2 处
old_execute = zend_execute; 替换为 old_execute_ex = zend_execute_ex;  共 1 处
zend_execute      = old_execute;  替换为  zend_execute_ex = old_execute_ex;  共 1 处

修改 config.w32
EXTENSION(“vld”, “vld.c set.c srm_oparray.c”); 修改为  EXTENSION(“vld”, “vld.c set.c branchinfo.c srm_oparray.c”);
否则无法编译
修改之后,需要重新执行 buildconf,重新 configure,重新 nmake

调整 srm_oparray.c
补充以及更新 opcode 代码

编译完成后,扩展文件就在 obj目录下的 Release_TS 的根目录
NTS 的需要重新执行 configure,重新nmake,存放在 obj 的 Release_NTS (好像是,忘记了…)的根目录

未经允许不得转载:SuperMan's blog » 基于PHP5.5以上版本的扩展编译环境搭建

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址