VisualGDB_VS2010_开发PHP扩展-PHP-IT技术博客

VisualGDB_VS2010_开发PHP扩展

时间:2021-04-08 23:53:00 浏览: 字体: 放大 缩小


1、新建一个Linux项目

 

 

2、选择项目类型为:Shared Library

 

 

3、创建一个远程项目

 

 

 

4、完成

 

 

5、解决方案删除这两个文件

 

 

6、去php源码包的ext目录里生成一个php扩展框架,并拷贝两个文件:xxxx.c文件和xxxx.h头文件

 

使用命令:./ext_skel --extname=extension1

 

 

 

把这两个文件从虚拟机拿到开发环境来,并添加到项目里去

 

拷贝到项目目录去

 

 

 

再把这两个文件添加到项目里

 

可以直接拖进去或者添加现有项或者是复制粘贴都可以

 

 

接下来会提示找不到某些头文件,不用担心,我们可以设置头文件目录

 

 

在配置对话框选择:MakeFile Settings

 

 

添加包含目录

 

 

添加头文件目录如下:点+ 添加

 

 

 

然后点OK 再Apply

 

 

再OK 就可以了

 

在目录的外部依赖项可以看到我们添加的头文件

 

 

 

一切准备工作就序,可以先编译试试

 

我们可以看到编译时没有错误的

 

也生成了相应的so共享库文件

 

 

然后我们可以尝试在扩展源文件写点东西,我用的是VS2010,开发这个很方便,有强大的智能提示

 

 

好,重点来了,现在我们可以试着去把我们刚才编译的文件加入到php.ini中的 extension中看看效果

 

因为我们刚才建立的是远程项目,所以在自己的虚拟机中可以找到这个项目目录:

 

 

当然这个目录可以自定义,大家可以去试试

 

接下来,我们进这个项目目录看看

 

 

源文件什么的都在我们编译的时候自动上传到了这个远程目录里,然后呢,我们的so文件在 Debug目录里,因为我们在VS中的项目类型是Debug版本的

 

 

我们已经看到了这个so文件,那接下来我们要试着去把这个so文件复制到php的extension目录中去

 

我这边的路径是:/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718

 

接下来cp吧

 

 

OK,文件已经成功复制过了

 

 

接下来我们把这个库文件添加到php.ini中

 

 

保存,然后重启php-fpm看看效果吧。

 

重点来了,我们会看到一个提示: PHP Startup: Invalid library (maybe not a PHP library) 'Extension1.so' in <b>Unknown</b>

 

意思就是我们刚才编译的so文件不是一个php扩展,为什么呢?我们用的也是php为我们生成的代码,还有什么不对呢?那么接下来,

 

咱们去php源码找寻下答案吧

 

 

我们可以通过搜索 刚才那个提示的 字符串 很容易找到 那个输出错误信息的 源文件 在 php-7.2.28\ext\standard\dl.c 中的 195行

 

 

那么是什么原因呢?我们可以通过阅读代码,得知:

 

首先,会加载我们刚才的so文件

 

 

得到一个内核对象,所谓的句柄的玩意儿,不晓得句柄的无所谓,反正你晓得这个是后续我们要操作这个so文件的一把钥匙就行了

 

接下来是一顿判断操作,没有问题就会去执行这个地方:

 

 

这个意思是调用我那个so文件导出的一个方法:get_module,

 

然后返回一个结构体指针,这个结构体是:_zend_module_entry。

 

晓得原因就好办了,所以我们可以去我们刚才那个扩展的源文件看看有没有这样的方法,我们找遍了源文件,只发现这个:

 

 

也就是我们没有去调用这个:ZEND_GET_MODULE(extension1),而这个要调用的话是需要通过一个宏来控制的

 

那怎么才能调用呢?很简单,我们只需要在编译的时候加上宏就可以了:

 

 

双击打开:

 

 

我们可以加上这个宏:

 

 

再次编译,我们可以看到编译成功

 

 

我们自定义宏也加上了

 

gcc -ggdb -ffunction-sections -O0 -DCOMPILE_DL_EXTENSION1 -I/root/php-7.2.28 -I/root/php-7.2.28/ext -I/root/php-7.2.28/ext/date/lib -I/root/php-7.2.28/main -I/root/php-7.2.28/TSRM -I/root/php-7.2.28/Zend -DDEBUG=1 -fPIC -c extension1.c -o Debug/extension1.o -MD -MF Debug/extension1.dep

 

咱们再次去测试下我们新生成的so库文件,看看这次能不能成功。

 

重复第一次的步骤,把so文件拷贝到/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718,然后重启php-fpm 看看

 

 

这一次,php-fpm 没有给我们提示其他我们不想看到的信息,好,接下来,咱们用php -m 看看有没有加入咱们的扩展

 

 

这一次,我们的扩展库成功加入到了php豪华套餐组合,哈哈哈

 

标签: VisualGDB_VS2010_开发PHP扩展visualgdbvs2010开发php扩展