很多PHPer都有尝试写PHP扩展的经历,但网上现有的扩展开发教程大都晦涩难懂,官方文档更是让人看的云里雾里。无形之中垒高了PHP扩展开发的门槛。"每个PHPer都应该抽空看一些PHP扩展的源码" 这话虽然很有道理,但PHP扩展的源码确实很难看懂。

最近我在修改tideways扩展的bug,这个扩展是当前最流行的PHP性能分析工具之一。我需要先读懂源码,然后定位到具体功能点,最后改Bug,整个过程下来也是焦头烂额。于是我想办法搭建了一套断点调试工具。

不夸张的说,这篇文章是最简洁明了的 PHP扩展开发与调试 类文章,看了这篇文章你会发现开发PHP扩展其实很简单。

一. 下载PHP源码

查看当前PHP版本

1

2

3

4

$ php -v

PHP 7.1.14 (cli) (built: Feb  7 2018 18:33:30) ( NTS )

Copyright (c) 1997-2018 The PHP Group

Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

下载PHP源码

1

2

3

$ git clone git@github.com:php/php-src.git

$ cd php-src

$ git checkout php-7.1.14

从github clone源码后记得切换到与本地一致的版本。或者直接从github下载zip包,比如我的版本是php-7.1.14,就需要下载 https://codeload.github.com/php/php-src/zip/php-7.1.14

二. 使用工具初始化扩展

PHP扩展的开发文档虽然写的一般,但提供的 ext_skel 工具还是非常人性话。

新建一个扩展

新建扩展前,我们需要为扩展程序找一个相对独立的目录,比如 /code/project/专门来存放扩展。其他目录也行,看心情来,别和官方扩展重复就行,比如mysql就不要使用了。我给扩展取的名字是layne。

1

2

3

$ cd php-src/ext/

$ ./ext_skel --extname=layne

$ mv layne /code/project/

看看扩展的文件结构

1

2

3

4

5

6

7

8

CREDITS

EXPERIMENTAL

config.m4

config.w32

layne.c

layne.php

php_layne.h

tests

自动生成的文件就几个,可以都浏览一遍。m4文件会影响编译,w32在Windows下才需用到,c和h文件是具体的扩展逻辑,php文件都是常见的PHP代码。

三. 配置调试环境

下载vscode,并安装

大名鼎鼎的编辑器,下载地址:https://code.visualstudio.com/

配置调试环境

首先用vscode打开 /code/project/layne(第二步中新建的扩展)。

1

2

$ mkdir .vscode

$ cd .vscode

.vscode目录一般会自动生成,这里为了方便就手动新建吧。这里面都放着.json的文件,vscode通过这些文件来保留用户当前的各种配置信息。我们需要新建 launch.json 和 tasks.json 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

$ vi launch.json

{

// 使用 IntelliSense 了解相关属性。

// 悬停以查看现有属性的描述。

// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387

"version": "0.2.0",

"configurations": [

{

"name": "php_ext_dbg",

"type": "cppdbg",

"request": "launch",

"program": "/usr/bin/php",

"args": ["/Users/sibenx/Projects/php-ext/php-xhprof/tests/test.php"],

"stopAtEntry": false,

"cwd": "${workspaceRoot}",

"environment": [],

"externalConsole": true,

"MIMode": "lldb",

"preLaunchTask": "php_ext_task"

}

]

}

launch.json 文件用来控制 调试 的相关参数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

$ vi tasks.json

{

// See https://go.microsoft.com/fwlink/?LinkId=733558

// for the documentation about the tasks.json format

"version": "2.0.0",

"tasks": [

{

"label": "php_ext_task",

"type": "shell",

"command": "cd /Users/sibenx/Projects/php-ext/php-xhprof && sudo /usr/bin/phpize && ./configure --with-php-config=/usr/bin/php-config && make &&sudo make install",

"problemMatcher": [

"$gcc"

]

}

]

}

tasks.json 文件用来做调试前的各种初始化工作,比如编译扩展,将扩展拷贝到指定目录等等。

引入扩展

php并不会自动在 php.ini 文件中引入扩展,我们需要手动添加

1

2

$ vi /etc/php.ini

extension=layne.so

tasks.json 和 launch.json 文件中的php目录相关的配置改为自己的

点击vscode中的调试按钮

什么都不用做,10s左右会断下来。

四. 写在最后

很多教程在开始就写需要修改.m4文件,.c文件等,让很多有兴趣的开发者觉得扩展开发很高深很复杂。其实PHP本身就是一门比较实用的语言,从时间转换,字符串处理等功能就能看出来。官方提供的 ext_skel 工具也是依照这种传统,开箱即用不用改任何代码。最后配合vscode实现断点调试,写扩展可以变的很轻松。这篇文章还没有提到PHP扩展的具体代码,之后会结合实际的例子写几篇

php扩展调试,5分钟学会PHP扩展开发与断点调试相关推荐

  1. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  2. 5分钟学会区块链 - 开发一条区块链 Develop BlockChain with Tendermint

    本文攻略:解惑区块链开发,学习 Tendermint,给自己造一条区块链 建议玩家等级:技术小白,学生党,初级码农 阅读此文先解锁技能: 一点点命令行基础 一点点 GO 基础:三天包学会 一点点区块链 ...

  3. CAD二次开发--CAD2007(.Net3.5环境)等低版本CAD二次开发在VS中无法捕获断点调试解决办法(CAD二次开发无法断点调试解决办法)

    目录 1.说明 2.解决办法 1.说明 在进行CAD二次开发的时候如果想进行断点调试,众所周知,在VS环境里设置断点后直接启动类库项目就好了,只需要在启动项属性里设置下"启动外部程序&quo ...

  4. 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站

    2019-nCov疫情实时数据可视化--30分钟python快速版 疫情来袭,宅在家不如学习用python如何开发并部署一个疫情实时追踪可视化页面.页面预览 本文将介绍如何使用python开发网站,「 ...

  5. IE调试网页之六:使用 F12 开发人员工具调试 HTML 和 CSS (Windows)

    F12 开发人员工具可帮助你查找和修复 HTML 和级联样式表 (CSS) 代码中的错误.如果不使用这些工具,则可能很难在源代码中发现这些错误. 通过在 Windows Internet Explor ...

  6. IE调试网页之五:使用 F12 开发人员工具调试 JavaScript 错误 (Windows)

    使用 F12 开发人员工具,Web 开发人员能够在无需离开浏览器的情况下快速调试 JavaScript 代码. 通过内置到每个 Windows Internet Explorer 9 安装中,F12 ...

  7. pulsar 容量_[Pulsar系列] 10分钟学会Pulsar消息系统概念

    Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar在Yahoo的生产环境运行了三年多 ...

  8. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  9. clodeblocks debug断点调试_idea debug调试————简单常用,适合初学者

    背景: 在现在的开发中,如果不会debug,那么将会给我们的开发带来很大的困扰,如果仅仅是依靠日志信息去查问题,将会大大增加我们解决问题的难度,下面说一下idea开发工具下的简单debug. 适用人群 ...

最新文章

  1. 安卓复杂的首页布局_到底该如何快速进入安卓编程?
  2. python androidhelper怎么点击屏幕_python:如何模拟helper方法?
  3. Eclipse中java文件编码格式修改
  4. 如何合理的规划一次 JVM 性能调优
  5. RabbitMQ--topic
  6. 西安电子科技大学求职打点
  7. (21)H5之ruby标签
  8. html行分割,如何确定一个html标签是否分割成多行
  9. java rt.jar的源代码的位置
  10. Idea修改项目的包名
  11. mysql联合查询的几种方式
  12. mac应用音量控制软件:Sound Control for Mac
  13. OpenGL学习笔记(七)-深度测试-模板测试-混合
  14. 【07月16日】A股滚动市净率PB历史新低排名
  15. 节拍脉冲发生器的设计
  16. 阿里云服务器CPU Intel Xeon Platinum 8269CY和8163处理器区别
  17. 下一个风电”黑马“诞生,数字孪生 3D 智慧风电
  18. Android源码下载一路走来
  19. 错误0x80080005的解决办法
  20. 怎么绕过论坛回复_可怕,GPT3论坛跟帖灌水一周无人发现!专挑热搜,秒秒钟长文...

热门文章

  1. RCNN系列实验的PASCAL VOC数据集格式设置
  2. Android AIDL使用介绍(2)自定义数据类型的传递
  3. ML之监督学习算法之分类算法一 ——— 决策树算法
  4. [Step By Step]SAP HANA PAL指数回归预测分析Exponential Regression编程实例EXPREGRESSION(模型)...
  5. 又到中元节 应用宝教你如何打败各种鬼
  6. 融合libevent和protobuf
  7. 程序员如何缓解“电脑病”
  8. 博通的“交钥匙”策略
  9. Centos-Server-Nginx服务(编译安装)
  10. Android无线调试出现错误的解决方法