只使用命令行方式调试
PHP 交互模式
用命令php -a进入命令行交互运行模式。进入之后每次只运行一句,立刻输出结果然后返回输入状态。有时候错误未显示出,是因为php.ini里这两行配置:
display_errors = On
error_reporting = E_ALL
需要将php.ini里这两行去掉注释,从而可以显示出错误。
提示符显示时说明正在等待输入语句;然而每条语句可以分多行输入,当不完整时会重新回到提示符状态,直到遇到分号才执行语句。使用分号可以一行输入多条语句。
If语句写完条件后如果不写执行的语句,会等到输入完第一个分号或大括号后才运行。
当有错误时,一般提示的行号都是第一行,只有当语句在大括号内时,才会使用大括号内的相对行数。注意PHP里大括号和C语言不同,不代表变量作用域;只有在函数内才可以把大括号当作作用域。交互模式下大括号只能单独出现一层,否则要和一种语法有关才能出现。
交互模式下处理失败的语句的方法,类似于运行PHP文件时,都会跳过这一句,之前已运行的不受影响。
使用phpdbg命令进行命令行模式调试
输入“phpdbg 文件名”,进入调试工具;进入后不会立刻运行,使用help命令可以查看运行使用的各种命令。之后可以用“exec 文件名”,重置运行的环境,打开新的PHP源码文件。
查看源代码时,用“list 行数”来显示当前执行位置开始的几行源码。如果Windows里运行显示的源码里有乱码,需要在运行phpdbg前使用Windows命令行窗口的chcp命令。在Windows系统中,要支持显示UTF-8格式的源文件,方法是用“chcp 65001”设置新的代码页为UTF-8,然后用“chcp”可以查看当前代码页。
用run开始运行,run后的参数同命令行参数。运行到最后一行之后会自动退出phpdbg。运行到断点位置会停止执行,并输出当前行的源码。设置断点使用“break 行号位置”。使用include时,包含的文件可以是exec文件以外的其它文件,设置断点用break 文件名:行号。注意include时函数必须先于使用处定义;函数定义和使用在同一个文件内时才可以在调用处之后定义。
当断点停止运行时,“ev 表达式”可以查看变量的值。断点时继续运行用continue,不要用run(表示重新从头开始)。continue运行到下一个断点才会停止,如果只运行下一句就停下用step。如果是跳出当前函数之后,执行完调用函数语句就立刻暂停,用leave。
用“info break”显示断点列表,要删除断点,用“break del 断点编号”。
使用IDE和在PHP上配置Xdebug扩展来调试
安装xdebug动态链接库
Windows上,将对应php版本的xdebug,放在php的ext目录内,可以改名为php_xdebug.dll,然后在php.ini末尾加上:
[xdebug]
zend_extension=php_xdebug.dll
[]括号内的分节名称是任意的,一般将这种分节放在php文件最后。
查看xdebug安装成功:
C:\Users\dell>php -v
PHP 7.3.4 (cli) (built: Apr 2 2019 21:56:52) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.4, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v3.1.6, Copyright (c) 2002-2022, by Derick Rethans
安装vscode IDE环境
新建一个vscode项目,在.vscode目录内新建settings.json:
{
"php.validate.executablePath": "D:/PHP/php73/php.exe",
"php.debug.executablePath": "D:/PHP/php73/php.exe",
"phpserver.phpConfigPath": "D:/PHP/php73/php.ini",
"phpserver.phpPath": "D:/PHP/php73/php.exe",
}
- php.validate.executablePath
- 用于指定PHP语言服务器(PHP Language Server)的路径
- 影响:代码语法检查、智能提示等功能依赖此路径
- php.debug.executablePath
- 指定Xdebug调试时使用的PHP解释器路径
- 影响:断点调试、变量监视等调试功能
- phpserver.phpConfigPath
- 配置内置PHP开发服务器(PHP Server插件)的php.ini文件路径
- 影响:本地测试服务器的运行时配置(如扩展加载)
- phpserver.phpPath
- 内置PHP开发服务器的解释器路径
- 影响:通过VSCode直接启动PHP内置服务器时的执行环境
简单本地调试
安装vscode插件:
在Extensions里搜索PHP Debug(由Xdebug开发)并安装。在run菜单里选择add configuration…,并选择PHP,新增的launch.json在.vscode文件夹内。如果出现问题,可以按下面来修改launch.json,其中runtimeArgs相当于在php.ini内增加了以下四行:
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_port=9003
xdebug.client_host=localhost
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-dxdebug.client_port=9003",
"-dxdebug.client_host=localhost"
]
}
]
}
在Run and Debug内使用第二种方式“Launch currently open script”来运行。
远程调试另一台电脑上运行的内容:
有时候PHP在另一个进程内运行,例如当PHP已经部署到Apache服务器上后。这时仍然可以调试,而且Apache可以在不同的电脑上运行。
一、PHP的运行环境配置
在需要运行php的电脑上的php.ini内增加IDE所在位置的信息,PHP运行后会自动连接上IDE:
zend_extension=php_xdebug.dll
xdebug.client_port=9003
xdebug.client_host=IDE所在电脑的IP地址
Apache配置(为了展示PHP源码的目录名):
DocumentRoot "D:/php/website"
<Directory "D:/php/website">
Options All
AllowOverride All
Require all granted
</Directory>
二、配置IDE
pathMappings表示了Ide所在电脑的路径在两台电脑间的映射;如果不配置映射,每次都会从运行的服务器上下载源码。port是IDE监听的端口,选择运行“Listen for Xdebug”后只有服务器主动连接,IDE才会有变化;所以最好在IDE需要查看的源码上设置断点,否则一般来说是看不到服务器连接上了。
"configurations": [
{
"name": "Launch currently open script",
//…这里的内容不变化,按照上一节
},
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"d:/php/website/": "${workspaceFolder}" // 远程路径与本地项目路径映射
}
},
多线程调试时的问题:
①Xdebug不支持暂停正在运行的任务:
for($i=0;$i<4;$i++){
echo " 正在运行,时间: " . date('Y-m-d H:i:s') . "\n";
sleep(2); // 暂停2秒
}
②PHP不支持多线程功能,pthreads最后版本3.1.6只支持php 7.2版。
③PHP从5.4.0版本开始内置了Web服务器功能,让开发者无需安装Apache或Nginx等专门的Web服务器软件就能运行PHP应用程序。如果要在vscode内自动启动服务器,需要添加下面的内容到launch.json:
//放在configurations内,之前的相同
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:8080"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Listening on http://localhost:([0-9]+)",
//匹配了上面字符串后,会打开下面URL
"uriFormat": "http://localhost:%s/${fileBasename}",
"action": "openExternally"
}
}
最后serverReadyAction会匹配debug console窗口输出的信息,需要检查安装的vscode插件(常用的有xdebug的php debug和devsense的php插件,安装其它插件可能会阻止输出内容),以免影响了输出结果。
340

被折叠的 条评论
为什么被折叠?



