什么时候开发自己的PHP扩展是增强PHP语言功能的插件

2023-06-03 1090阅读 0评论
小熊猫权益

温馨提示:这篇文章已超过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内核源码分析_php内核源码_php 内核源码分析

下载PHP源码的地址是:

打开该地址后,下载如右图图示的源代码:

php内核源码_php内核源码分析_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扩展生成成功了。以上输出如下所示:

php 内核源码分析_php内核源码_php内核源码分析

php 内核源码分析_php内核源码分析_php内核源码

此时,在\ext目录下生成了的目录,该目录是生成出的PHP的扩展模板,可以在模板的基础上进行开发。

使用构建扩展项目

打开,我这儿使用的是,其他研发环境没有进行检测。

在中选择“文件”->“新建”->“从现有代码构建项目”,来建立PHP扩展的缓解方案,如下图:

php内核源码分析_php 内核源码分析_php内核源码

选择了“从现有代码构建项目”后,会出现建立项目的向导,如下图:

php 内核源码分析_php内核源码_php内核源码分析

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

php内核源码_php 内核源码分析_php内核源码分析

在此方法php内核源码分析,选择今天生成的扩展模板的目录,然后填入项目名称,这里是“”,点击“下一步”,到达如下图:

php内核源码分析_php 内核源码分析_php内核源码

此方法选取DLL项目,点击下一步,到达如下图:

php内核源码分析_php内核源码_php 内核源码分析

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

php 内核源码分析_php内核源码_php内核源码分析

php 内核源码分析_php内核源码分析_php内核源码

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

配置编译选项并编译项目

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

php 内核源码分析_php内核源码_php内核源码分析

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

php内核源码分析_php 内核源码分析_php内核源码

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

php内核源码分析_php内核源码_php 内核源码分析

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

php 内核源码分析_php内核源码_php内核源码分析

此处应该包含的目录涵盖如下图的几个目录:

php内核源码_php内核源码分析_php 内核源码分析

此处主要是添加了PHP源码的几个目录,因为编译PHP扩展的源码时必须PHP的底层内核数据结构进行支持,因此必须包括以上的目录。

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

php 内核源码分析_php内核源码_php内核源码分析

在预处理中,中的是扩展的名称,中的相同只是扩展的名称,这个名称与最起初生成扩展模板时的名称必须一致。

编译源代码

把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生成解决方案,如图:

php内核源码_php内核源码分析_php 内核源码分析

发现“成功1个”文件之后,在目录\php-7.2.20-src\ext\\x64\下会生成一个.dll文件,这个文件就是我们的PHP扩展文件。

PHP扩展的安装与检测

将生成.dll重命名为.dll,将其拷贝到PHP环境的扩展中,我的模式是php\php7.2.10\ext,想必熟悉PHP的应当都会添加PHP扩展。如右图:

php内核源码分析_php内核源码_php 内核源码分析

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

使用php-m来查看是否有.dll组件,如下图:

php内核源码_php内核源码分析_php 内核源码分析

查看,如下图:

php内核源码_php内核源码分析_php 内核源码分析

通过里面可以看出,我们的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并非难事。

本文来自网络,如有侵权请联系网站客服进行删除

什么时候开发自己的PHP扩展是增强PHP语言功能的插件  您阅读本篇文章共花了: 

  • 1.注意:本站资源多为网络收集,如涉及版权问题请及时与站长联系,我们会在第一时间内删除资源。
  • 2.您购买的只是资源,不提供解答疑问和安装服务。免费源码里的接口不保证一直可以用
  • 3.本站用户发帖仅代表本站用户个人观点,并不代表本站赞同其观点和对其真实性负责。
  • 4.本站资源大多存储在云盘,如发现链接失效,请及时与站长联系,我们会第一时间更新。
  • 5.转载本网站任何内容,请按照转载方式正确书写本站原文地址
  • 6.如果发现侵权可以联系站长删除,站长vx:xiaoxiongmao0504或者邮箱通知3326096692@qq.com
  • 小熊猫权益

    发表评论

    快捷回复: 表情:
    评论列表 (暂无评论,1090人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码
    请先 登录 再评论,若不是会员请先 注册