什么时候开发自己的PHP扩展是增强PHP语言功能的插件
温馨提示:这篇文章已超过537天没有更新,请注意相关的内容是否还可用!
什么是PHP扩展
通俗说,PHP扩展是提高PHP语言用途的软件。PHP提供了编程语言的词汇,比如分支、循环、函数、类等,这些是PHP原本所提供的。在这些状况下必须在PHP语言的基础上进行扩展,那么就必须借助PHP底层提供的数据结构和接口来研发PHP扩展,从而来补充或扩充PHP语言,使之非常的超强。当然了,PHP原本就早已集成了一些基本的、强大的、优秀的PHP扩展。
PHP扩展的好处
从上面的知道得知,PHP扩展可以在PHP原有的基础上来扩展PHP的功能,使之更为的超强。另一方面,PHP扩展可以借助“插件式”的方法来管控和维护PHP的功能,如果将全部的功能融合到PHP语言中,PHP想必会更加臃肿,且又不够灵活。而有了扩展,就解决了这种的难题。
PHP扩展的存在方式
在Linux平台下,PHP扩展以.so文件存在,在下以.dll文件存在。
什么之后使用PHP扩展
单独的使用PHP语言并不能满足所有的开发,比如在项目中使用Redis或时,就必须相应的PHP扩展,来提高PHP语言,让PHP可以来操作Redis或者,以完成非常功能超强的项目。
什么之后开发自己的PHP扩展
开发自己的PHP扩展是需要的么?难道不是。通常状况下,作为一个PHPer是不应该自己开发PHP扩展的,但是这些状况下或许是必需要开发PHP扩展的。比如,我就遭遇了这种的难题。合作的第三方提供了下的动态链接库文件(.dll文件,非COM的DLL文件),而我又没有找到怎样在PHP下读取调用DLL文件的方法,因此我必须写PHP扩展,通过PHP的扩充来读取和调用第三方提供的DLL文件。
开发自己的PHP扩展
在上面我终于提到了我见到的难题,合作的第三方提供了下的动态链接库文件,而我又没有找到PHP下读取和调用DLL文件的方法,因此决定自己编写PHP扩展来读取和调用第三方提供的DLL文件中的导出函数。以下,就是我针对建立研发PHP扩展环境和编译PHP扩展源码的记录。
准备工具
首先说明一点,DLL文件只能在平台上运行,Linux系统上是能够进行运行的。那么,我们这个扩展是不考量Linux平台的,只考量系统就能。因此,准备的开发工具是。起初,我在网上查找了一些资料,很多资料中都提到,在下研发PHP扩展需要调试,经过我自己的学习,可以告诉你们“不必须”。当然了,我们的扩展只在平台上运行,如果必须在Linux平台上运行,是否应该我就不得而知了。当然了,其他版本的VS也需要是可以的,只是我只测试了罢了。
下载PHP的源代码
比如必须安装以外,还必须下载PHP的源码,我下载的源码是PHP7.2的源码。
下载PHP源码的地址是:
打开该地址后,下载如右图图示的源代码:
在此处,下载PHP7.2的源码,并注意在源码下面有一个VC15x64的字样。
下载完的的文件为:php-7.2.20-src.zip
下载完源码进行解压,解压后的目录为:php-7.2.20-src
下载源码并不是一件复杂的事情,但是页面中有多个版本的源码可供下载,选择什么有时也有相当苦恼的弊端,这里就下载php7.2的源码,因为我本地使用的就是php7.2的环境。
创建扩展
进入php-7.2.20-src\ext目录下,在该目录下有一个名为.php的文件,在命令行中执行:
1 php ext_skel_win32.php --extname=loaddll
其中,是要建立的扩展的名称。想要顺利执行该命令,需要将PHP的可执行程序添加到环境变量中。
执行情况如下:
λ php ext_skel_win32.php --extname=loaddll Creating directory loaddll FIND: Parameter format not correct chmod: missing operand after ‘644’ Try 'chmod --help' for more information. FIND: Parameter format not correct chmod: 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.m4 3. $ ./buildconf 4. $ ./configure --[with|enable]-loaddll 5. $ make 6. $ ./sapi/cli/php -f ext/loaddll/loaddll.php 7. $ vi ext/loaddll/loaddll.c 8. $ make Repeat steps 3-6 until you are satisfied with ext/loaddll/config.m4 and step 6 confirms that your module is compiled into PHP. Then, start writing code and repeat the last two steps as often as necessary.
发现如上的输出提示,则表明我们建立的PHP扩展生成成功了。以上输出如下所示:
此时,在\ext目录下生成了的目录,该目录是生成出的PHP的扩展模板,可以在模板的基础上进行开发。
使用构建扩展项目
打开,我这儿使用的是,其他研发环境没有进行检测。
在中选择“文件”->“新建”->“从现有代码构建项目”,来建立PHP扩展的缓解方案,如下图:
选择了“从现有代码构建项目”后,会出现建立项目的向导,如下图:
直接点击“下一步”,到如下图:
在此方法php内核源码分析,选择今天生成的扩展模板的目录,然后填入项目名称,这里是“”,点击“下一步”,到达如下图:
此方法选取DLL项目,点击下一步,到达如下图:
直接点击“下一步”,到达如下图:
点击“完成”,等待开始创建项目。
配置编译选项并编译项目
在生成项目完毕后,切换项目为“”和“x64”的选项,如下图:
切换完成后,在项目上右键选取“属性”,如下图:
修改配置类型为DLL,这样生成的目标文件扩展名自动变为.dll,如右图图示:
选择“配置属性”->“C/C++”->“常规”,在“附加包括目录”中点击“编辑”来添加相关的目录,如下图:
此处应该包含的目录涵盖如下图的几个目录:
此处主要是添加了PHP源码的几个目录,因为编译PHP扩展的源码时必须PHP的底层内核数据结构进行支持,因此必须包括以上的目录。
选择“配置属性”->“C/C++”->“预处理器”,在“预处理器定义”中点击“编辑”来添加相关预处理指令,如下图:
在预处理中,中的是扩展的名称,中的相同只是扩展的名称,这个名称与最起初生成扩展模板时的名称必须一致。
编译源代码
把php-7.2.20-src\win32\build\目录下的.w32.h.in复制到php-7.2.20-src\main\目录下,并重命名为.w32.h,这个.h文件在编译时是必须的,但是在php-7.2.20-src\main\下并没有该文件,因此必须自己手动进行复制。
在.w32.h中降低如下代码
1 #define PHP_COMPILER_ID "VC15"
注意此处的VC15php内核源码分析,在下载源代码的之后,我们将要看到过这个标识了。
接着,从PHP的安装目录中复制.lib文件到目录下,注意,是从PHP的安装目录中,而不是PHP源代码的目录中。
.lib在目录php7.2.10\dev目录下,我使用的是下的php7.2.10,大家自己使用对应的.lib文件就能,当然,这个.lib文件也需要是php7.2的,因为我们下载的是php7.2的源码。
在项目的Files下添加.lib文件,添加该文件就非常简洁了,同样是单击添加即可。
按下F7生成解决方案,如图:
发现“成功1个”文件之后,在目录\php-7.2.20-src\ext\\x64\下会生成一个.dll文件,这个文件就是我们的PHP扩展文件。
PHP扩展的安装与检测
将生成.dll重命名为.dll,将其拷贝到PHP环境的扩展中,我的模式是php\php7.2.10\ext,想必熟悉PHP的应当都会添加PHP扩展。如右图:
在php.ini文件中增加配置,如下图:
使用php-m来查看是否有.dll组件,如下图:
查看,如下图:
通过里面可以看出,我们的PHP扩展已经正常安装了,接下去就必须测试我们的扩展是否可以运行了。
在PHP源码目录下php-7.2.20-src\ext\\有一个.php的测试文件,在命令行下进行执行该命令:
1 php loaddll.php
输出内容如下:
1 λ php loaddll.php 2 Functions available in the test extension: 3 confirm_loaddll_compiled 4 5 Congratulations! You have successfully modified ext/loaddll/config.m4. Module loaddll is now compiled into PHP.
如下图:
发现如上输出,说明该扩展的模板编译成功,可以再次开发实际的扩展组件了。
总结
这些之后,学习编程的第一步就是建立环境,而通常构建环境的过程中因为流程更加复杂,而资料又没有傻瓜化的具体方法,导致很多想要学习或入门的程序员连第一步都能够踏出。对于研发PHP扩展而言只是一样的。
如何借助PHP扩展来让PHP程序可以直接读取DLL中的变量,除了必须把握C语言的常识以外,还必须把握程序设计的常识,本文就不再讨论了,因为有C语言的常识和程序设计的知识,在PHP扩展中调用DLL并非难事。
本文来自网络,如有侵权请联系网站客服进行删除
还没有评论,来说两句吧...