PHP调试功能介绍

只使用命令行方式调试

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",

}

  1. php.validate.executablePath
    • 用于指定PHP语言服务器(PHP Language Server)的路径
    • 影响:代码语法检查、智能提示等功能依赖此路径
  2. php.debug.executablePath
    • 指定Xdebug调试时使用的PHP解释器路径
    • 影响:断点调试、变量监视等调试功能
  3. phpserver.phpConfigPath
    • 配置内置PHP开发服务器(PHP Server插件)的php.ini文件路径
    • 影响:本地测试服务器的运行时配置(如扩展加载)
  4. 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版。

PHP5.4.0版本开始内置了Web服务器功能,让开发者无需安装ApacheNginx等专门的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插件(常用的有xdebugphp debugdevsensephp插件,安装其它插件可能会阻止输出内容),以免影响了输出结果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值