PhpStorm下调试功能配置详解
PhpStorm下调试功能配置详解
要在PhpStorm下实现PHP项目的调试,需要创建一个Web服务和一个PHP Web Page服务。这一步很关键,很多PHP项目调试教程都没有讲清楚这一点,只讲解了debug的相关配置。对于从Java转到PHP的开发者来说,习惯性地只开启Web服务方式(如Java IDEA只需要开启自带Web服务即可调试),会导致debug无法成功。
创建Web服务
创建Web服务器有两种方式:使用PhpStorm自带的Web服务或外部的Apache或Nginx服务。
PhpStorm自带的Web服务
创建步骤如下:
- 打开PhpStorm菜单,选择"运行" -> "编辑配置"
- 在"Run/Debug Configurations"弹窗中,点击"+"按钮,选择"PHP Built-in Web Server"
- 在右侧设置主机为localhost,指定一个端口,文档根路径设置为项目的public目录
Apache或Nginx服务
最简单的方式是通过PhpStudy创建。
创建PHP Web Page服务
- 打开PhpStorm菜单,选择"运行" -> "编辑配置"
- 在"Run/Debug Configurations"弹窗中,点击"+"按钮,选择"PHP Web Page"
- 在"Configuration"中选择一个Web服务器,如果没有则点击旁边的"..."按钮创建一个新的
- 确保服务器的主机和端口与上面的Web服务器保持一致
- 选择一个调试器,如Xdebug
配置
要实现调试,需要给PHP解析器加入Xdebug插件,并在项目中配置PHP解析器及调试侦听端口。
php.ini文件配置
- 下载一个与PHP版本匹配的Xdebug动态库,放到PHP程序目录下的ext目录
- 指定动态库路径:
zend_extension
- 指定Web服务器地址:
xdebug.remote_host
- 指定调试监听端口:
xdebug.remote_port
- 开启调试:
xdebug.remote_enable=1
注意:PHPStorm解析器和外部的Web服务可以使用不同版本的PHP解析器程序,但Xdebug配置只需要在Web服务用的php.ini中配置即可。
以下是Xdebug 2.7.2版本的配置示例:
[Xdebug]
zend_extension=E:/Programs/phpstudy_pro/Extensions/php/php7.3.4nts/ext/php_xdebug.dll
xdebug.collect_params=1
xdebug.collect_return=1
xdebug.auto_trace=On
xdebug.trace_output_dir=E:/Programs/phpstudy_pro/Extensions/php_log/php7.3.4nts.xdebug.trace
xdebug.profiler_enable=On
xdebug.profiler_output_dir=E:/Programs/phpstudy_pro/Extensions/php_log/php7.3.4nts.xdebug.profiler
xdebug.remote_handler=dbgp
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9001
PhpStorm配置
- 打开PhpStorm菜单,选择"文件" -> "配置"
- 在配置弹窗中选择"PHP"项,配置PHP CLI解析器,指定php.exe和php.ini路径
- 如果Xdebug配置成功,会在php.ini路径下方显示配置的Xdebug动态库版本号
配置项目的PHP解析器:
- 打开PhpStorm菜单,选择"文件" -> "配置"
- 在配置弹窗中选择"调试"项,配置Xdebug的调试端口,确保与php.ini中的
xdebug.client_port
保持一致
调试操作
- 开启Web服务
- 在debug模式下开启PHP Web Page服务
- 在代码位置设置断点,就可以开始调试
Postman调试接口方式
常见问题
浏览器端是否需要下载Xdebug Helper插件?
经实践验证,Xdebug Helper插件在浏览器端安装后不起作用,因此不需要安装。这个插件的原理是在Cookie中加入一个标识PHPSTORM标识。但在PhpStorm 2024.1版本中,这个标识已改为XDEBUG_SESSION。这个标识的产生是通过启动PHP Web Page服务,首次访问页面URL时自动设置到Cookie中,如首次访问地址是http://localhost/?XDEBUG_SESSION_START=12071。Cookie中XDEBUG_SESSION值即为12071。
如果发现断点无法命中,可能是XDEBUG_SESSION_START值与本次PHP Web Page服务的XDEBUG_SESSION值不匹配,重新启动PHP Web Page服务即可解决。
PhpStorm是否需要点击启动服务边上的"侦听 debug 连接"按钮?
实测可以不启用。
伪静态配置和redirect转发问题
在实际访问时,如果需要在URL中隐藏index.php,需要进行伪静态配置。如果代码中有redirect转发请求,生成的URL会自动加上.html后缀,访问时会报错。例如:
<?php
namespace app\admin\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return redirect('account/login');
}
}
这会导致错误:The requested URL /public/admin/login.html was not found on this server。
Apache配置
在public目录下创建文件.htaccess,加入以下配置:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# mod_fcgid & php-cgi
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
# php5apache2_2.dll
#RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
Nginx配置
修改nginx.conf,加入以下配置:
server {
listen 80;
server_name localhost;
root "E:/workspace_demo/shop/likeshop/likeshop-app/server/public";
index index.php index.html index.htm;
location / {
root "E:/workspace_demo/shop/likeshop/likeshop-app/server/public";
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
location ~ /.*\.php/ {
rewrite ^(.*?/?)(.*\.php)(.*)$ /$2?s=$3 last;
break;
}
location ~ \.php$ {
root "E:/workspace_demo/shop/likeshop/likeshop-app/server/public";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注意:PhpStorm自带的Web服务默认开启隐藏index.php,但目前还不知道如何配置htaccess,因此redirect转发请求报错的问题尚未解决。