创建WEB服务 和 PHP Web Page服务
要在phpstorm下实现调试,必须要创建一个WEB服务和一个PHP Web Page服务。这步很关键,网上很多PHP项目调试教程这点没讲清楚,只讲了debug的相关配置。导致像我这样JAVA程序员初学调试PHP项目时,习惯性在ide中只开启web服务方式(java Idea只需要开自带web服务即可调试),导致debug一直没有成功。
WEB服务
创建web服务器有2种方式,一种是使用 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,Server选择一个Web server,如果没有,则点中边上的…按钮,在弹窗中创建一个。 这个server的主机和端口,需要和上面的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解析器程序,如WEB服务用php7.2版本 和 PHP Web Page服务用7.3版,但这个debug配置只需要配置在WEB服务用的php.ini即可,PHP Web Page服务的php.ini不需要配置)。
以上配置适合Xdebug.dll 2.7.2版本。新版的Xdebug动态库remote_enable、remote_host、remote_port都已改名。
[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配置
PHP CLI解析器配置
phpstorm菜单:文件 ->配置;在配置弹窗,选择"PHP"项,配置PHP CLI解析器,指定php.exe 和php.ini路径。如果上面的xdebug配置成功,则会在php.ini路径下方debugger显示配置的xedebug动态库版本号,未正确配置,则显示为Not installed.
调试配置
配置项目的php解析器:
phpstorm菜单: 文件 ->配置;在配置弹窗,选择"调试"项,配置Xdebug的调试端口。这个端口必须和上面的php.ini中xdebug.client_port保持一致。
调试操作
- 开启web服务
- 在debug模式下开启PHP Web Page 服务。
- 在代码位置打断点,就可以调试。
Postman调试接口方式
碰到的问题
浏览器端需不需要下载Xdebug Helper插件?
经实践Xdebug Helper在浏览器端安装后,不起作用。不需要安装。这个插件的原理应该在Cookie中加入一个标识PHPSTORM标识。但phpstorm2024.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后缀, 访问时会报错。
如以下代码会报:The requested URL /public/admin/login.html was not found on this server.
<?php
namespace app\admin\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return redirect('account/login');
}
}
Apache或nginx配置htacess,可以解决以上2个问题.
(注意:phpstorm自带web服务默认开启隐藏index.php,htacess配置目前还不知道如何配,所以未解决redirect转发请求报错问题!!!)
Apache配置
配置public目录下创建文件.htacess,加入以下配置
<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;
}
}