php扩展调试,5分钟学会PHP扩展开发与断点调试
很多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扩展开发与断点调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php fpm 不写errorlog,P
- 下一篇: 网贷逾期影响办信用卡吗