自己开发PHP扩展

什么是 php 扩展
通俗说 , PHP 扩展是增强 PHP 语言功能的插件 。PHP 提供了编程语言的语法 , 比如分支、循环、函数、类等 , 这些是 PHP 本身所提供的 。在某些情况下需要在 PHP 语言的基础上进行扩展 , 那么就需要通过 PHP 底层提供的数据结构和接口来开发 PHP 扩展 , 从而来补充或扩展 PHP 语言 , 使之更加的强大 。当然了 , PHP 本身就已经集成了一些基本的、强大的、优秀的 PHP 扩展 。
PHP 扩展的好处
从上面的了解得知 , PHP 扩展可以在 PHP 原有的基础上来扩展 PHP 的功能 , 使之更为的强大 。另一方面 , PHP 扩展可以通过“插件式”的方式来管理和维护 PHP 的功能 , 如果将全部的功能整合到 PHP 语言中 , PHP 想必会过于臃肿 , 且又不够灵活 。而有了扩展 , 就解决了这样的问题 。
PHP 扩展的存在形式
在 linux 系统下 , PHP 扩展以 .so 文件存在 , 在 windows 下以 .dll 文件存在 。
什么时候使用 PHP 扩展
单独的使用 PHP 语言并不能满足所有的开发 , 比如在项目中使用 redis 或 MongoDB 时 , 就需要相应的 PHP 扩展 , 来增强 PHP 语言 , 让 PHP 可以来操作 Redis 或者 MongoDB , 以完成更加功能强大的项目 。
什么时候开发自己的 PHP 扩展
开发自己的 PHP 扩展是必须的么?其实不是 。通常情况下 , 作为一个 PHPer 是不需要自己开发 PHP 扩展的 , 但是某些情况下可能是必须要开发 PHP 扩展的 。比如 , 我就遇到了这样的问题 。合作的第三方提供了 Windows 下的动态链接库文件(.dll 文件 , 非 COM 的 DLL 文件) , 而我又没有找到如何在 PHP 下加载调用 DLL 文件的方式 , 因此我需要写 PHP 扩展 , 通过 PHP 的扩展来加载和调用第三方提供的 DLL 文件 。
开发自己的 PHP 扩展
在前面我已经提到了我遇到的问题 , 合作的第三方提供了 Windows 下的动态链接库文件 , 而我又没有找到 PHP 下加载和调用 DLL 文件的方式 , 因此决定自己编写 PHP 扩展来加载和调用第三方提供的 DLL 文件中的导出函数 。以下 , 就是我对于搭建开发 PHP 扩展环境和编译 PHP 扩展源码的记录 。
准备工具
首先说明一点 , DLL 文件只能在 Windows 系统上运行 , Linux 系统上是无法进行运行的 。那么 , 我们这个扩展是不考虑 Linux 系统的 , 只考虑 Windows 系统即可 。因此 , 准备的开发工具是 VS2015 。起初 , 我在网上查找了一些资料 , 很多资料中都写到 , 在 Windows 下开发 PHP 扩展需要安装 CygWin , 经过我自己的学习 , 可以告诉大家“不需要” 。当然了 , 我们的扩展只在 Windows 系统上运行 , 如果需要在 Linux 系统上运行 , 是否需要 Cygwin 我就不得而知了 。当然了 , 其他版本的 VS 也应该是可以的 , 只是我只测试了 VS2015 罢了 。
下载 PHP 的源代码
除了需要安装 VS2015 以外 , 还需要下载 PHP 的源码 , 我下载的源码是 PHP 7.2 的源码 。
下载 PHP 源码的地址是:https://windows.php.net/download/
打开该地址后 , 下载如下图所示的源代码:

自己开发PHP扩展

文章插图
 
在这里 , 下载 PHP 7.2 的源码 , 并注意在源码下面有一个 VC15 x64 的字样 。
下载完的的文件为:php-7.2.20-src.zip
下载完源码进行解压 , 解压后的目录为:php-7.2.20-src
下载源码并不是一件复杂的事情 , 但是页面中有多个版本的源码可供下载 , 选择哪个有时也是比较纠结的问题 , 这里就下载 php7.2 的源码 , 因为我本地使用的就是 php7.2 的环境 。
创建扩展
进入 php-7.2.20-srcext 目录下 , 在该目录下有一个名为 ext_skel_win32.php 的文件 , 在命令行中执行:
1 php ext_skel_win32.php --extname=loaddll其中 , loaddll 是要创建的扩展的名称 。想要成功执行该命令 , 需要将 PHP 的可执行程序添加到环境变量中 。
执行情况如下:
λ php ext_skel_win32.php --extname=loaddllCreating directory loaddllFIND: Parameter format not correctchmod: missing operand after ‘644’Try 'chmod --help' for more information.FIND: Parameter format not correctchmod: missing operand after ‘755’Try 'chmod --help' for more information.Creating basic files: config.m4 config.w32 .gitignore loaddll.c php_loaddll.h CREDITS EXPERIMENTAL tests/001.phpt loaddll.php [done].To use your new extension, you will have to execute the following steps:1. $ cd ..2. $ vi ext/loaddll/config.m43. $ ./buildconf4. $ ./configure --[with|enable]-loaddll5. $ make6. $ ./sapi/cli/php -f ext/loaddll/loaddll.php7. $ vi ext/loaddll/loaddll.c8. $ makeRepeat steps 3-6 until you are satisfied with ext/loaddll/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.


推荐阅读