开发者社区> 杰克.陈> 正文

用VS开发PHP扩展

简介: 原文:用VS开发PHP扩展 开发前准备工作: VS(我用的2013) Cygwin(下载地址:http://www.cygwin.com/) 搭载了php运行环境的IIS7.5 (用来测试) php编译后的程序和编译前的源码,我用的当前最新版本5.
+关注继续查看
原文:用VS开发PHP扩展

开发前准备工作:

VS(我用的2013)

Cygwin(下载地址:http://www.cygwin.com/)

搭载了php运行环境的IIS7.5 (用来测试)

php编译后的程序和编译前的源码,我用的当前最新版本5.6.9(下载地址:http://windows.php.net/download/)

编译后的程序路径:E:\php-5.6.9-nts-Win32-VC11-x86\

编译前的源码路径:E:\php-5.6.9-src\

步骤:

1.安装Cygwin

 

从网络安装

 

 

 

默认安装C盘

下载缓存随意,安装结束记得删掉,我是放在桌面的

在中国,就选http://mirrors.63.com,后面一直下一步到结束。

2.找到php源码目录我的是(E:\php-5.6.9-src,以下用这个代表源码目录),打开E:\php-5.6.9-src\ext\ext_skel_win32.php

这里改成你的cygwin安装目录,我的就是C盘,所以不用改。

3.运行cmd,进入E:\php-5.6.9-src\ext\里,运行php.exe  ext_skel_win32.php --extname=test,这里test代表你的php扩展名

打开E:\php-5.6.9-src\ext\就会看到一个test文件夹,这个就是你的扩展。

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

选择C++

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

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

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

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

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

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

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

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

ZEND_DEBUG=0
PHP_EXTENSION
PHP_WIN32
ZEND_WIN32
HAVE_TEST=1(这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别
COMPILE_DL_TEST这里红色部分,要改成你的扩展名称,不改成你的扩展名,php会不识别
ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全

生成解决方案,错误信息显示找不到“config.w32.h”,在源代码文件目录里搜索“config.w32.h”,在E:\php-5.6.9-src\win32\build\文件夹里找到“config.w32.h.in”,将这个文件复制到E:\php-5.6.9-src\main\文件夹里,去掉后面的“.in”

再次生成解决方案,显示错误信息LNK1120

错误 7 error LNK1120: 5 个无法解析的外部命令 E:\php-5.6.9-src\ext\test\Release\phptest.dll 1 1 phptest

右键项目属性,连接器,输入,附加依赖项,编辑,将php5.lib的路径放进去(这个文件在php编译后的程序文件夹里,根目录的dev文件夹里)

打开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的性能。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Windows下PHP微服务框架Hyperf Swoole开发部署(Docker方式)
Windows下PHP微服务框架Hyperf Swoole开发部署(Docker方式)
77 0
搭建交易所开发订单管理PHP语言简单示例
这个例子连接到一个数据库,从一个订单表中检索所有的订单,并输出订单的详细信息。该代码使用了PHP的mysqli扩展,它提供了一组访问和操作数据库的函数。请注意,这只是一个基本的例子,在真实世界的情况下,代码需要处理错误、安全和其他要求。
26 0
PHP开发中,让var_dump调试函数输出更美观
PHP开发中,让var_dump调试函数输出更美观
43 0
PHP开发API接口签名生成及验证
PHP开发API接口签名生成及验证
31 0
秘乐短视频开发源码丨秘乐短视频系统开发详细(PHP开发)丨秘乐短视频系统源码运营版
 短视频系统开发的内容产出的核心就在于视频内容的录制和编辑。录制短视频之前,用户可以提前设定更改短视频的滤镜,视频的清晰度,视频比例,码率等设置,通过不同的设置程度拍摄出别出心裁的短视频。而短视频之所以如此受人关注,主要还是在于视频录制和编辑中的特效内容的加入。在短视频录制时加入美颜等基于AI技术打造的特殊效果,给人以展示不同的自己。
27 0
php进阶编程-easyswoole框架的学习和开发
php进阶编程-easyswoole框架的学习和开发
18 0
【锦囊妙计】我做PHP开发时踩的坑
这篇文章整理了我在开发过程中遇到的一些问题,比如“如何更好的比较字符串”,“什么场景下应该用什么函数读取文件”。
28 0
node.js 开发网站和传统PHP等开发网站的区别|学习笔记
快速学习 node.js 开发网站和传统PHP等开发网站的区别
74 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
PHP安全开发_从白帽角度做安全
立即下载
PHP在机器学习上的应用及云深度学习平台的架构设计与实现
立即下载
PHP与APM_技术内幕和最佳实践
立即下载