文档章节

PHP7 VS2015编译(扩展开发)

c
 colin_86
发布于 2017/05/10 21:18
字数 1203
阅读 387
收藏 0
  • php7要求使用vc2015


Visual Studio 2015 社区版本

PHP-sdk-binary-tools-20110915.zip (http://windows.php.net/downloads/php-sdk/下载)
deps-7.0-vc14-x86                  (http://windows.php.net/downloads/php-sdk/下载)
php-7.0.2                        (http://php.net/downloads.php下载)

 

第一步

  • 解压php-sdk-binary-tools的二进制包,譬如我解压到我的D:\vcmyprojects\php-sdk文件夹中,现在的目录结构如下


D:\vcmyprojects\php-sdk
    --bin
    --script
    --share

 

然后,这个是你已经安装完成了visual studio 2015,打开VS2015开人员命令提示,注意,编译是一定要用这个进,普通的cmd不行,走了很多弯路。。。

 

  •  #进入目录
cd D:\vcmyprojects\php-sdk
  • #设置环境变量
bin\phpsdk_setvars.bat
  • 编辑c:\php-sdk\php-sdk-binary-tools\bin\phpsdk_buildtree.bat文件
    在GOTO EXIT前加入
MD %_%\vc14\x86\deps\bin
MD %_%\vc14\x86\deps\lib
MD %_%\vc14\x86\deps\include
MD %_%\vc14\x64\deps\bin
MD %_%\vc14\x64\deps\lib
MD %_%\vc14\x64\deps\include
  • #创建常用的php-sdk目录
bin\phpsdk_buildtree.bat phpdev
  • 解压deps-7.0-vc14-x86.7z到D:\vcmyprojects\php-sdk\phpdev\vc14\x86\deps文件夹下覆盖,里边都是我们需要的库文件和一些必要的工具等等。
  • 安装cygwin,我用的是最新的x86版本的,下载安装到c:\cygwin,这样子不需要修改ext_skel_win32.php

编译安装php

回到VS2015开发人员命令提示

  • #进入php源目录文件夹
cd D:\vcmyprojects\php-sdk\phpdev\vc11\x86\php-7.0.2
buildconf

 

  • #查看带的扩展和编译命令
configure --help
  • 如果你没有安装php,现在这里就帮助到你了,可以先编译安装一下php
configure --disable-all --enable-cli


然后,你会看到Type 'nmake' to build PHP,然后编译

nmake

在D:\vcmyprojects\php-sdk\phpdev\vc11\x86\php-7.0.2\Release_TS文件夹下就生成了php.exe文件,环境变量中加入这个路径,好在命令行中能使用php命令。

开发PHP的第一个扩展

  • 进入扩展目录,生成扩展文件夹
cd D:\vcmyprojects\php-sdk\phpdev\vc11\x86\php-7.0.2\ext
php ext_skel_win32.php --extname=raintest1


这时候我们在D:\vcmyprojects\php-sdk\phpdev\vc11\x86\php-7.0.2\ext就看到了自己的目录raintest1,打开raintest1\php_raintest1.h,在

打开ext\就会看到一个test文件夹,这个就是你的扩展。

  •  打开VS选择“文件”--“新建”--“从现有代码创建目录”

  • 选择C++

  • 这里选择你的php扩展文件夹路径,并且给项目命名

  • 选择“使用 visual studio”,项目类型选择“动态链接库(DLL)项目”,后面一直默认下一步一直到完成。

  • 刚开始打开会有很多错误,我们接下来开始配置项目。

  • 先把项目解决方案配置改为Release

  • 右键项目属性,C/C++,常规,附加包含目录,编辑

加入以下几个php源码目录(实际目录以开发者自己的目录为准):

E:\php-xxx-src
E:\php-xxx-src\main
E:\php-xxx-src\TSRM
E:\php-xxx-src\Zend

右键项目属性,C/C++,预处理器,预处理器定义,编辑,加入以下变量:

ZEND_DEBUG=0
PHP_EXTENSION
PHP_WIN32
ZEND_WIN32
HAVE_XXX=1
COMPILE_DL_XXX
ZTS

注意,要把上面的 XXX 改为大写的扩展名 (如扩展叫 tonyenc 就把 XXX 改成 TONYENC),否则 PHP 将无法识别扩展。ZTS用于告诉编译器开启线程安全(如果去掉就是不开启)。注意,线程安全的开启与否,取决于前面下载到的 C:\php7-Win32-VC14-x64-ts,它也是启用了线程安全编译,所以这里开启线程安全。

  • 在左侧「连接器」-「输入」栏目下,「附加依赖项目」中,加入:C:\php7-Win32-VC14-x64-ts\dev\php7ts.lib,即前面下载得到的已编译的 PHP 程序。
  • 点确定,然后菜单中选择「生成」-「生成解决方案」,恭喜你,编译器报错:无法打开包括文件 ../main/config.w32.h,这时把 C:\php7-Win32-VC14-x64-ts\win32\build\config.w32.h.in 复制到 C:\php7-Win32-VC14-x64-ts\main\config.w32.h (注意没有了后面的 in),然后在 config.w32.h 中加入:
#define PHP_COMPILER_ID "VC14"

这将指明运行库是 VC14,与前面下载到的已编译 PHP 程序匹配,重新生成下解决方案,这样就能成功编译了!

 

打开test.c

找到这一段代码:

复制代码

PHP_FUNCTION(confirm_test_compiled)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

    len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "test", arg);
    RETURN_STRINGL(strg, len, 0);
}

复制代码

将confirm_test_compiled改成test_echo

再找到这一段代码:

const zend_function_entry test_functions[] = {
    PHP_FE(confirm_test_compiled,    NULL)        /* For testing, remove later. */
    PHP_FE_END    /* Must be the last line in test_functions[] */
};

将里面的confirm_test_compiled也改成test_echo

生成解决方案,在项目根目录的Release文件夹里找到自己的php扩展phptest.dll,复制到php的ext文件夹里,在php.ini里配置上:

extension=phptest.dll

重启IIS,新建一个站点,在里面新建一个test.php文件

<?php 
echo test_echo("123");

运行得到结果:

这个test_echo函数,就是我们自己的自定义函数了,你也可以根据需求,开发自己的扩展来提高php的性能。

© 著作权归作者所有

c
粉丝 3
博文 177
码字总数 25967
作品 0
成都
高级程序员
私信 提问
编译安装PHP7并安装Redis扩展Swoole扩展

编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么编译参数应该为 --with-apx...

豆花饭烧土豆
2016/02/15
59
0
通过 Visual Studio 为 Linux 编写 C++ 代码

Build 2016大会上Microsoft首次公布的Visual Studio 2015扩展提供了在VS2015中编写C++代码,随后通过Linux/UNIX计算机进行编译和执行的能力。这种想法非常简单:使用Visual Studio 2015编写和...

oschina
2016/06/27
8.5K
79
解决php7安装memcache扩展问题

解决php7安装memcache扩展问题 在最近一段时间,公司的架构从php5.6.22升级到了php7.1.12,但是在期间又开发了一套新的框架,但是这个框架需要使用memcache的扩展,当时找到我叫我帮忙安装一...

legehappy
2018/08/07
0
0
这句话如何理解?

先说前提,我是准备用树莓派和opencv做运动物体的识别,树莓派系统是win10IOT10586. 然后,远程连接成功之后开始交叉编译,往树莓派里面装opencv,但是安装CSDN的教程,在第六步卡住了。 原帖...

天涯有多远
2018/03/17
51
0
php扩展模块安装

PHP动态扩展模块 > 本节操作使用PHP7 查看php模块: 安装 Redis模块 > redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、s...

豆渣锅
2017/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部