普通说,PHP 扩展是增强 PHP 措辞功能的插件。
PHP 供应了编程措辞的语法,比如分支、循环、函数、类等,这些是 PHP 本身所供应的。
在某些情形下须要在 PHP 措辞的根本上进行扩展,那么就须要通过 PHP 底层供应的数据构造和接口来开拓 PHP 扩展,从而来补充或扩展 PHP 措辞,使之更加的强大。
当然了,PHP 本身就已经集成了一些基本的、强大的、精良的 PHP 扩展。

PHP 扩展的好处

从上面的理解得知,PHP 扩展可以在 PHP 原有的根本上来扩展 PHP 的功能,使之更为的强大。
另一方面,PHP 扩展可以通过“插件式”的办法来管理和掩护 PHP 的功能,如果将全部的功能整合到 PHP 措辞中,PHP 想必会过于臃肿,且又不足灵巧。
而有了扩展,就办理了这样的问题。

php调用dllPHP 扩大开辟初探 Ruby

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 7.2 的源码,并把稳在源码下面有一个 VC15 x64 的字样。

下载完的的文件为:php-7.2.20-src.zip

下载完源码进行解压,解压后的目录为:php-7.2.20-src

下载源码并不是一件繁芜的事情,但是页面中有多个版本的源码可供下载,选择哪个有时也是比较纠结的问题,这里就下载 php7.2 的源码,由于我本地利用的便是 php7.2 的环境。

创建扩展

进入 php-7.2.20-src\ext 目录下,在该目录下有一个名为 ext_skel_win32.php 的文件,在命令行中实行:

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.

看到如上的输出提示,则解释我们创建的 PHP 扩展天生成功了。
以上输出如下所示:

此时,在 \ext 目录下天生了 loaddll 的目录,该目录是天生出的 PHP 的扩展模板,可以在模板的根本上进行开拓。

利用 VS2015 创建扩展项目

打开 VS2015,我这里利用的是 VS2015,其他开拓环境没有进行测试。

在 VS2015 中选择 “文件” -> “新建” -> “从现有代码创建项目”,来创建 PHP 扩展的办理方案,如下图:

选择了 “从现有代码创建项目” 后,会涌现创建项目的引导,如下图:

直接点击 “下一步”,到如下图:

在此步骤,选择刚才天生的扩展模板的目录,然后填入项目名称,这里是“loaddll”,点击“下一步”,到达如下图:

此步骤选择DLL项目,点击下一步,到达如下图:

直接点击“下一步”,到达如下图:

点击“完成”,等待 VS2015 开始创建项目。

配置编译选项并编译项目

在 VS2015 天生项目完毕后,切换项目为 “Release”和“x64”的选项,如下图:

切换完成后,在项目上右键选择“属性”,如下图:

修正配置类型为 DLL,这样天生的目标文件扩展名自动变为 .dll,如下图所示:

选择“配置属性” -> “C/C++” -> “常规”,在“附加包含目录”中点击“编辑”来添加干系的目录,如下图:

这里须要包含的目录包括如下图的几个目录:

这里紧张是添加了 PHP 源码的几个目录,由于编译 PHP 扩展的源码时须要 PHP 的底层内核数据构造进行支持,因此须要包含以上的目录。

选择“配置属性” -> “C/C++” -> “预处理器”,在“预处理器定义”中点击“编辑”来添加干系预处理指令,如下图:

在预处理中,HAVE_LOADDLL 中的 LOADDLL 是扩展的名称,COMPILE_DL_LOADDLL 中的 LOADDLL 同样也是扩展的名称,这个名称与最开始天生扩展模板时的名称该当同等。

编译源代码

把 php-7.2.20-src\win32\build\ 目录下的 config.w32.h.in 复制到 php-7.2.20-src\main\ 目录下,并重命名为 config.w32.h,这个 .h 文件在编译时是须要的,但是在 php-7.2.20-src\main\ 下并没有该文件,因此须要自己手动进行复制。

在 config.w32.h 中增加如下代码

#define PHP_COMPILER_ID "VC15"

把稳这里的 VC15 ,不才载源代码的时候,我们已经见到过这个标识了。

接着,从 PHP 的安装目录中复制 php7ts.lib 文件到 loaddll 目录下,把稳,是从PHP 的安装目录中,而不是 PHP 源代码的目录中。

php7ts.lib 在目录 php7.2.10\dev 目录下,我利用的是 wamp64 下的 php7.2.10,大家自己利用对应的 .lib 文件即可,当然,这个 .lib 文件也必须是 php7.2 的,由于我们下载的是 php7.2 的源码。

在项目的 resource Files 下添加 php7ts.lib 文件,添加该文件就比较大略了,同样是右键添加即可。

按下 F7 天生办理方案,如图:

看到“成功 1 个”文件往后,在目录 \php-7.2.20-src\ext\loaddll\x64\Release 下会天生一个 loaddll.dll 文件,这个文件便是我们的 PHP 扩展文件。

PHP 扩展的安装与测试

将VS2015 天生 loaddll.dll 重命名为 php_loaddll.dll ,将其拷贝到 PHP 环境的扩展中,我的路径是 php\php7.2.10\ext,想必熟习 PHP 的该当都会添加 PHP 扩展。
如下图:

在 php.ini 文件中增加配置,如下图:

利用 php -m 来查看是否有 loaddll.dll 模块,如下图:

phpinfo 查看,如下图:

通过上面可以看出,我们的 PHP 扩展已经正常安装了,接下来就须要测试我们的扩展是否可以运行了。

在 PHP 源码目录下 php-7.2.20-src\ext\loaddll\ 有一个 loaddll.php 的测试文件,在命令行下进行实行该命令:

php loaddll.php

输出内容如下:

λ php loaddll.phpFunctions available in the test extension:confirm_loaddll_compiledCongratulations! You have successfully modified ext/loaddll/config.m4. Module loaddll is now compiled into PHP.

如下图:

看到如上输出,解释该扩展的模板编译成功,可以连续开拓实际的扩展模块了。

总结

很多时候,学习编程的第一步便是搭建环境,而每每搭建环境的过程中由于步骤过于繁芜,而资料又没有傻瓜化的详细步骤,导致很多想要学习或入门的程序员连第一步都无法踏出。
对付开拓 PHP 扩展而言也是一样的。

如何通过 PHP 扩展来让 PHP 程序可以直接调用 DLL 中的函数,除了须要节制 C 措辞的知识以外,还须要节制 Windows 程序设计的知识,本文就不再谈论了,由于有 C 措辞的知识和 Windows 程序设计的知识,在 PHP 扩展中调用 DLL 并非难事。

希望本文对大家有所帮助!