PHP Windows 扩展的开发(1)

windows下编译php扩展 memcache Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。本篇主要简述编译php及其扩展memcache 阅读详情

做为从事PHP开发的人来讲, 有些时候要自己写一些扩展来方便自己的应用。

 

网络上有很多的PHP开发的例程, 有的讲的还不错, 有的很简单,我把自己学习的过程记录下来。

开发PHP Extension的过程基本可以分为如下几步:
1. 生成扩展框架
2. dsp配置
3. 编写核心代码
4. 配置、编译
5. 配置php.ini

 

生成扩展框架

下载PHP源代码,我使用的是PHP 5.2.5。进入PHP源代码目录可以看到有个ext目录,这里是和PHP Extension有关可以看到很多已经存在的PHP Extension,如pdo_mysql,json等

 

 

 

linux和windows会使用不同的方法来生成skeleton.

 

本文主要讲述在windows下的开发, 有两种方法

1. 安装cygwin,然后使用上图中的windows那个文件 php ext_skel_win32.php -extname=<EXT_NAME>, 这个网上有很多 的例子 , 本人不想装cygwin所以采用的下面的方法。

2. 直接修改skeleton文件的内容 。

   首先将ext/skeleton拷贝一份, 将名字改为你想用的extname, 本文用hello world为例。

 

 

=>>>>

dsp 配置

再将php/dev目录下的php5t.lib拷贝到当前的目录下。

将上面4个文件中所有的extname 变成 hello_world, 将EXTNAME 变成HELLO_WORLD, 注意大小写

 

这样就可以进行简单的编译生成 dsw工程文件。

 

 

分析PHP Extension核心代码

为了下面更好的介绍,这里先简单的介绍PHP Extension核心代码,打开hello_world.c文件

 

这里初始化了一个C语言中的结构体,每个PHP Extension其实就是一个zend_module_entry结构体,在该结构体中定义了每个扩展所需的字段,大家可以通过查看 zend_module_entry源代码看到。就本例而言,我们简单的介绍一下上面的代码:

1. STANDARD_MODULE_HEADER:C语言的宏,用来初始化zend_module_entry的前几个字段,包括结构体大小等
2. hello_world:指定了扩展的名字,对应结构体中的name字段
3. hello_world_functions:一个zend_function_entry类型的数组,指向扩展的函数表,所有需要暴露给用户的函数都需要在该函数表中注册
4. PHP_MINIT(hello_world):模块初始化回调函数,在扩展被加载时调用,MINIT = Module Initialization
5. PHP_MSHUTDOWN(hello_world):模块卸载回调函数,在扩展杯卸载时调用,MSHUTDOWN = Module Shutdown
6. PHP_RINIT(hello_world):请求初始化回调函数,每个请求开始时调用,RINIT = Request Initialization
7. PHP_RSHUTDOWN(hello_world):请求结束回调函数,每个请求结束时调用,RSHUTDOWN = Request Shutdown
8. PHP_MINFO(hello_world):扩展信息函数,在phpinfo()函数中会调用,用于显示模块的自定义信息。
9. 0.1:指定了扩展的版本号,对应结构体中的version字段
10. STANDARD_MODULE_PROPERTIES:C语言的宏,用来初始化zend_module_entry的后几个字段

大家可以看到,在4-8我们指定了4个回调函数,这四个函数可以说我们提供了一种注入机制,让我们能够在这几个关键点进行资源的初始化或者资源回 收。另外,需要说明的一点是,所有的回调函数我们都是通过Zend提供的宏定义的,主要是为了防止在PHP运行时的命名冲突问题,事实上不仅仅是函数,包 括函数返回值、全局变量等我们都会使用这种方式。

 

编写phpinfo()回调函数

打开hello_world.c文件,在PHP_MINFO_FUNCTION里面编写如下代码:

这里主要是phpinfo()函数调用时显示自定义信息,用到了四个函数:

1. php_info_print_table_start():定义phpinfo表格开始
2. php_info_print_table_header():定义phpinfo表格头,第一个参数指定列数,后面指定与第一个参数数量相等的自定义文字信息
3. php_info_print_table_row():定义phpinfo表格内容,第一个参数指定列数,后面指定与第一个参数数量相等的自定义文字信息
4. php_info_print_table_end():定义phpinfo表格结尾

在本例中我们定义了表格头,指定扩展是否可用;另外定义了两行内容,指定扩展的作者和版本。

 

 

编写核心代码

接下来是时候编写我们的扩展核心代码了,打开php_hello_world.h文件,添加一行声明:

 

 

 

注意这里不是用“原生”的编写C语言函数的方式,而是通过PHP_FUNCTION宏定义(具体原因前面讲过),say_hello是我们开发的扩展模块要暴露给用户的函数名称。

打开hello_world.c,在这里实现say_hello函数:

 

里面的具体实现很简单,接收到参数之后,返回“Hello 参数”字符串,需要解释的是:

1. 参数接收:这里接收函数的参数需要通过zend_parse_parameter函数解析,第一个参数指定用户传入say_hello函数的参数个 数,可以通过宏ZEND_NUM_ARGS()生成,TSRMLS_CC用来确保线程安全;第二个参数是一个字符串,每个字母代表一种类型,其中”s”代 表char*或者int类型,“b”代表布尔类型,“l”代表long类型,完整的类型映射可以看这里 ;后面几个参数是我们定义的局部变量,用来接收传入的参数值

2. 函数返回值:不能使用C语言原生的return语句,而应该使用Zend API里提供的宏定义,如RETURN_STRINGL返回一个字符串;而RETURN_TRUE返回布尔类型true。

 

声明扩展函数参数信息,我们的函数原型为say_hello(name),声明参数方式:

 

这里都是Zend API提供的宏定义,在后面我会专门介绍扩展函数参数声明。实现完say_hello函数之后,我们再注册该函数到函数表 hello_world_functions(前面介绍过),第一个参数为函数名,第二个参数为函数参数数组信息,如下代码所示:

 

注意最后一行{NULL, NULL, NULL}是必须的,只有注册到函数表中的函数才能暴露给用户使用。

 

配置、编译、安装

 

直接用VC6生成php_hello_world.dll, 将其拷贝到php/ext目录下, 配置php.ini如下

 

运行

上面的步骤完成后, 运行 php -i| findstr "hello_world"

 

 

编写一个简单的测试脚本,如下所示:

 

会得到 如下

 

 

 

总结

本文通过一个简单的示例,介绍了如何使用Zend API和C语言在windows下开发一个PHP Extension。

Windows下适用于PHP 7.1的memcache扩展工具编译 项目里需要PHP支持memcache扩展,首先来介绍一下memcache是啥吧介绍memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 memcache经常和memcached混淆 阅读详情

相关推荐

Windows开发和编译PHP扩展的方法

PHP扩展是一种用C语言编写的模块,可以增强PHP的功能和性能。本文将介绍如何在Windows环境下进行PHP扩展开发和编译过程。根据你的需求,你可以进一步扩展和定制你的PHP扩展,以满足特定的功能要求。首先,创建一个目录用于存放扩展项目的文件。在该目录下创建一个新的文件夹,用于存放扩展的源代码文件。打开浏览器,访问该PHP文件,如果一切正常,你将会看到输出"Hello, World!文件,编写你的PHP扩展代码。的PHP扩展,用于输出"Hello, World!的C源代码文件,用于编写扩展的代码。

MdlForward的博客 756

关于 PHP MySQL 长连接、连接池的一些探索

php连接mysql的方式,用的多的是mysql扩展、mysqli扩展、pdo_mysql扩展,是官方提供的。php的运行机制是页面执行完会释放所有该php进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据php跟web服务器的不同,会开相应的线程或者进程去处理该请求,请求完了会释放结果的。也就是php无法从语言层面从页面到页面之间传递一些数据

will5451的博客 1万+

window和linux下的php拓展开发

php拓展相关介绍,windows下利用vc++进行php拓展开发,linux下的php拓展开发

442

windowsPHP8.2扩展安装

这行扩展需要将librdkafka.dll放到PHP安装目录下,和php.ini同级,php_rdkafka.dll需要放到ex扩展目录中,否则会出错。6.添加完成扩展可以通过小皮面板的网站-管理-PHP扩展开启,也可以手动修改php.ini添加或者打开对应扩展。2.配置中全局的扩展文件目录配置extension_dir 默认是注释掉的,需要打开,指向ext目录。5.注意通过phpinfo()函数查看Thread Safety,因为扩展是不一样的。通过命令行 php -m查看。

weixin_42068315的博客 1878

Windows下编写php扩展(一)基本开发环境的搭建

Windows下编写php扩展比在Linux下要麻烦一些。

littlezhuhui的专栏 953

windows php 扩展_2018-02-02 配置Windows开发PHP扩展

写在前头这个配置是基于windows的IIS部署php的情况下,开发php扩展,编译出dll文件,供应php中代码可用function。通过2天在baidu来回折腾,终于自己摸索出了工作方案,记录备忘,也可以被其他程序员参考 。baidu上的内容,实在太模糊了,写到重点都没有。关键要素服务器OS:windows开发机是windows10http服务:IISphp版本:VC14编译php7.1....

weixin_31688167的博客 212

php交互式命令行工具window操作系统安装readline扩展函数实现interactive mode enabled到Interactive Shell

PHP 7.1.0 开始,这个扩展Windows上也可用。

挖掘大数据价值,让决策者快速洞悉趋势,让大众读懂数据背后的故事。 971

go语言开发php扩展,windows开发php扩展-Go语言中文社区

转自:http://www.widuu.com/archives/12/1150.html===================================windows环境(我个人的)windows8.1企业版(mac osBootCamp安装的)VisualStudio2012版本msysgit(http://msysgit.github.io/ 下载)php-sdk-binary-too...

weixin_42210638的博客 369

php5.5 集成环境,windows下配置php5.5开发环境及开发扩展_PHP

网上的教程是比较多的,但是我发现在windows下的扩展开发比较少,而且大多都是php5.3版本以前的,今天我就给大家讲解一下php扩展开发,我就拿php5.5的版本来说明一下的了windows环境(我个人的)代码如下:windows 8.1 企业版(mac os Boot Camp安装的)Visual Studio 2012 版本msysgit (http://msysgit.github.i...

weixin_39682560的博客 250

php extname shared,WINDOWS开发PHP7扩展

最近在做个项目,需要用到唯一ID的生成,原本在Java和Delphi中,做了一个生成20位字符串(160bit)形式的唯一ID的算法,但是对比GUID(128bit),除了看起来比他短之外,其他并无优势。所以考虑重新采用Twitter-Snowflake的算法,做一个64bit的唯一ID生成。但是在纯PHP语言环境中,维护序列号是个麻烦的问题,所以考虑写php扩展,用C在底层实现支持。好了,现在这...

weixin_31653131的博客 161

php pthreads windows安装,Windows PHP 安装 pthreads 扩展

注意:现在仅支持 PHP 7.2+ 这是由于 PHP 7.0 和 7.1 上的 ZTS 模式存在安全问题。摘自:https://github.com/krakjoe/pthreads停止 PHP 7.4 的 pthread 开发我不再打算维护 pthread,也不想鼓励对其进行维护:我认为,这样做被设计所破坏并加以修复,根本不值得。我已经开始开发与未来兼容的新扩展程序:https://github...

weixin_33280675的博客 755

1.2.PHP7.1 狐教程-环境(Win下 PHP开发环境 配置及安装)

目录 Win下开发环境配置 下载 UPUPW 下载PHP 下载PHP-redis 解压缩 升级PHP版本 UPUPW启动 访问 程序文件存放目录 目录 http://www.foxwho.com/article/24 CSDN目录 http://blog.csdn.net/fenglailea/article/details/60330101   风.f...

风.foxwho(神秘狐) 2519

win10下搭建PHP7.1开发环境

PHP版本:7.1.5 在http://windows.php.net/download#php-7.1下载该版本 IIS一般与NTS(non thread safe)版本搭配使用,Apache与TS(thread safe)版本搭配使用。 在PHP根目录下找到php.ini.development和php.ini.production两个配置文件。 php.ini-development 适合开

ww564277453的博客 1017

win8 apache php mysql_windows8.1 下搭建配置apache+php+mysql,windows8.1apache_PHP教程

windows8.1 下搭建配置apache+php+mysql,windows8.1apache软件版本:MySql:5.5 win64Mysql安装:双击运行,设置用户名、密码、编码(utf8),步骤省略!PHP配置:1、解压下载的zip文件到一个目录,本教程中为:D:Program Filesphp2、复制文件php.ini-development并改名为php.ini;3、在php.ini...

weixin_39845206的博客 228

Windows下用Composer安装ThinkPHP 5.1的完整避坑指南(附PHP版本切换技巧)

本文详细介绍了在Windows环境下使用Composer安装ThinkPHP 5.1的完整流程,包括环境准备、PHP版本切换技巧及常见问题解决方案。通过Composer的依赖管理和阿里云镜像源配置,开发者可以高效搭建开发环境,避免常见陷阱,提升开发效率。

raspberrypi5的博客 235

windows nginx php7.2_【nginx】Windows下的nginx+php7的搭建

关于php的搭建,此前在《【php】本地开发环境的部署与helloworld》(https://blog.csdn.net/yongh701/article/details/41789753)和《【php】在Windows2003下配置Apache2.4与php5.4》(https://blog.csdn.net/yongh701/article/details/47080057)都有提及到。一种...

weixin_35426913的博客 764

ampone php windows,AmpOne

软件简介AmpOne基于Windows平台的Apache 、PHP、Mysql 极简轻量级开发环境 | One intergrated tools package ofApache + PHP + MySQL for windows特性利用HTA(Html Application)技术实现UI部分,混合Batch-Script和VBscript编写功能逻辑,这样的开发方式与Web开发者常用技术相接...

weixin_39870155的博客 113

windows下用c/c++开发php扩展

一:所需工具:cygwin ,它是一个在windows平台上运行的类unix模拟环境 php源码(压缩包) php二进制文件,也就是安装在windows上的php vs2008 或者更高(vs2010,vs2013) win32build.rar和bindlib_win32.rar(主要用来生成config.win32.h)二:配置过程1: 解压PHP源码,里面有一个ext目录,这里便是负责

ftd 3581
上一篇: PHP的ASCII码转换类
下一篇: PHP Windows 扩展的开发(2) 参数
php_boy
博客等级 码龄20年 11粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值