开发php,还是找个专业的Ide较好,vscode毕竟在php上不专业,需要下载各种插件才行,还不支持多线程调试,因此小编下载了phpstorm,打算以后用phpstorm来开发php项目,断点调试代码是必不可少的,还是用xdebug吧,可小编在网上搜索了无数篇文章,照着做了一天,竟然没调试成功。最后功夫不负有心人,终于调试成功,想着成千上万的phper肯定也会遇到此类问题,就索性写一篇博文,教大家彻底解决此问题。
首先说下配置环境,三个情景:分别是:
1. ide(即phpstorm等,也称调试客户端)与web服务端(即php程序)都在同一机器上,此类最好配。此种调试ide与web服务端运行的php代码都在同一位置,即是同一项目,不需要考虑远端连接。
2. ide与web服务端在同一局域网网段上,如本机安装有vmware,php安装在vmware上的虚拟机上,这种也算是在同一局域网网段上。先假设ide在192.168.0.2上,php及apache等在192.168.0.3上,便于以后讲解。此种调试情景中,ide调试的php代码与web服务端运行的php代码不在同一位置,需要进行映射对接,因此稍有麻烦。
3.ide与web服务端不在同一局域网中,其实这种情况最常见,如php代码与php程序均在远端机房内,ide在依靠wifi上网的笔记本中,这种情况配置起来最复杂,需要在远端服务器上下载安装dbgp服务器,经由dbgp桥接才能实现远程调试。但小编感觉没必要这样做,一是直接调试生产端代码不安全,二是有替代方案,可以将生产端代码下载到本机vmware虚拟机上,利用虚拟机模拟实现远端的linux环境。因此本文暂不考虑此种环境。
下面详细讲解下1和2两种情景的配置过程,两种调试虽然一个是本地调试,另一个是远程,但配置情况差不多,因此本文将其放一起讲解,需要时再分别讲解。
一、下载xdebug及配置php.ini
xdebug官网下载地址:https://xdebug.org/download.php,你需要仔细分析和选择要下载的对应版本,否则无法调试。由于非常容易选择错误,建议进入网页 https://xdebug.org/wizard.php,然后将自己phpinfo()输出的信息全复制拷贝到该网页信息框里,让xdebug官方系统为你选择合适的版本。下载好xdebug插件后,安放在某一位置,然后将如下配置添加至php.ini中,注意仔细看下面配置中的注解,都是小编亲手所写,饱含心血和经验。
[Xdebug]
zend_extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so//根据自己xdebug所在位置填写
xdebug.collect_params=1
xdebug.collect_return=1
xdebug.auto_trace=On
xdebug.profiler_enable=On
xdebug.mode=debug
xdebug.remote_enable=On//情景1的本地调试可注掉,也可开启
xdebug.client_host=192.168.0.2//ide所在host,此处是按情景2配置,情景1中,ide所在host本地的配成127.0.0.1。别漏掉此项,很多不成功往往是因为此项疏漏
xdebug.remote_host=192.168.0.3//ide或dbgp服务器所在host,此处是按情景2配置。情景1中,可配成127.0.0.1
xdebug.remote_port=9003//注意,用phpInfo()查看下,看是否一致
;xdebug.remote_handler=dbgp//情景3需要,配了dbgp服务器就填,没配就没必要设置
;xdebug.idekey = PHPSTORM//与phpstorm上的DBGP proxy设置中的idekey保持一致,如果客户机与服务器在同一网段上,甚至在同一台机器上,即情景1和2就没必要配置dbgp服务器,如果不在同一网段上,即情景3,就必须配置.
按照以上配置和说明配置好php.ini以后,赶紧重启php服务,千万别忘了此项,小编就是忘记了重启,结果死亡了很多脑细胞,又掉了几根头发。
二、 phpstorm中的配置
(1)在文件->设置->语言与框架中->PHP 设置你当前的php编译器路径。

(2)在文件->设置->语言与框架中->PHP->debug PHP->debug 设置端口,端口默认为9000,小编配置的是9003,需要与上面php.ini中的xdebug.remote_port保持一致。

(3)在上述窗口中点击validate按钮,如下图所示设置并检验是否成功。

(4)在文件->设置->语言与框架中->PHP->server中,点击+号按钮,添加server,如下图分别是情景1本地服务器和情景2的远程服务器配置说明。

情景1本地服务器配置示例

情景2远程服务器配置示例
三、设置断点,打开浏览器开始调试
好了,经过以上配置就基本上配置成功了,剩下的就是用phpstorm打开本地项目,然后打开需要断点调试的代码文件,在左边行号旁双击插入断点,开始调试。开启调试有两种方法,一个是利用phpstorm的内置php执行环境调试,另一个是用浏览器直接访问文件所在网址来调试,小编不推荐第一种,这种不但配置麻烦,而且与实际生产环境脱节,不如直接使用浏览器来调试,如果你要用浏览器调试,建议用chrome类浏览器,并安装上xdebug helpe插件,其实如果不想安装插件,就需要设置cookie了,为本域添加一条“XDEBUG_SESSION=PHPSTORM”,也一样能达到效果,这种方法特别适合用postman之类工具来开启调试,非常方便。如果用xdebug,需要简单设置下,如下图所示:
四、常见错误
坑1:注意修改过php.ini后,重启php;
坑2:客户机与服务器不在同一网段上,例如家中虽然只有一个路由器,但有两个网段,一个是4G,一个是5G,这就不是同一网段。
坑3:网上很多教程的php.ini的配置都少了client_host的配置,结果复制过来后不管用
五、其它配置建议
1. 远程服务器中修改以下3处配置,防止调试过程中过早断开与phpstorm的连接:
# php*.ini (/usr/local/php/etc/php*.ini):
max_execution_time=7200
# php-fpm.conf (/usr/local/php/etc/php-fpm.conf):
request_terminate_timeout = 0 # fpm不加执行时间限制,少管闲事。
# nginx (/usr/local/nginx/conf/nginx.conf)在http端添加或修改这两个:
fastcgi_connect_timeout 7200s; # 因为php-fpm可能会被调试阻塞
fastcgi_read_timeout 7200s;
2. Linux/Mac下 在phpstorm安装目录下的 bin/phpstorm.sh 顶部加一行 ulimit -s 256 可以节省大约600M物理内存(如果在“phpstorm内部”运行php解释器遇到问题,可以尝试 ulimit -s 512,没实测)。
建议开8个或更多 php-fpm worker进程,如果有N层curl则至少开N+1个,否则会请求会死锁。
3. 如果遇到 断点被忽略、不能step-in、无法对变量set-value 等奇怪的问题,可以禁用 eaccelerator 试试。
4. 遇到页面长时间加载不下来的情况,极可能是因为 你的笔记本禁止了远程连接(360安全卫士==网络防火墙软件都会禁止外来tcp连接),可以从虚拟机检查连接是否畅通:
六、结语
好了,小伙伴们,终于写完了,本篇文章是博主在为网风笔记移动端编写后台api,配置php调试环境时根据亲身经历所写,码文字真不容易,还请读完此篇文章感觉有收获得亲们多多支持本博主下,并给本文推荐下,以让更多朋友受益,也支持下本博。顺便介绍下本人近来开发的一个chrome及edge浏览器插件“网风笔记”,网风笔记可以让你在浏览器上一键以最养眼的方式观看并编辑网页文章,并具有背景涂色、划线、文字编辑、分类保存等等功能。对于喜欢用网页查找文章学习的同学,网风笔记定是你最好的助手。 除了自身的笔记功能外,附带功能也非常丰富强大,一个扩展就让浏览器轻松拥有音视频下载、截图涂鸦、解除网页复制限制、一键提取文章、自由点选段落、快捷打印成A4格式文档、网页笔记编辑整理、定向发布等等功能。这插件简直能让浏览器飞起来,定会让你使用起来爱不释手,欢迎大家免费薅羊毛下载使用,网风官网(netwind.cc)上有安装导引,帮您在edge或chrome上安装。近期本人正在开发配套移动端网风笔记,还请大家多多关注并支持。
七、后记
本文发出后,收到不少小伙伴的反馈,不少人反映说,网上别的类似配置文章中一般要求配置如下图所示的DBGP代理,你文章中怎么没提及啊?

在此,小编作下解释,上面是为本文所提及的情景3的dbgp服务器配套所制,如你远程服务器没安装dbgp服务器,你就没必要填写该项。小编的phpstorm此项什么也没填写,照样运行得很好,如果你要配置dbgp服务器,就按上图所示来填写。
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback