标签 PHP 下的文章

快年末了,作为一个程序猿人生中在不断的解决旧的BUG和创造新的BUG,那么有什么东西可以在我们检测BUG中让数据更加直观(头发掉的不那么快)呢?

安装方式

[scode type="yellow"]本次安装XDebug插件基于Windows环境,其他平台会在之后更新

或查看XDebug官方安装文档:直达连接[/scode]

Windows环境

手动安装

一般来说在Windows环境下都是使用集成环境,但是我们要针对集成环境的PHP编译版本号来安装。

[scode type="red"]严重警告:每一个PHP编译环境并非相同,请不要下载一个到处使用,会造成无法启动等情况[/scode]

检测编译版本和下载扩展

准备要检测的内容:

在CMD或者PowerShell中输入下方命令

php -i

将响应数据复制到XDebug检测网站(点我跳转)输入框点击分析。

XDebug分析PHPINFO数据

一般来说不出意外都是会有成功的分析结果。

分析的结果会告诉你正确下载扩展包文件和需要修改的配置文件位置。

XDebug分析结果

在php.ini找到XDebug添加或修改扩展配置

[XDebug]
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir ="You Loacl Temp Folder"
xdebug.trace_output_dir ="You Loacl Temp Folder"
xdebug.profiler_output_name = "cache.out.%t-%s"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
zend_extension=php_xdebug.dll #注意:请根据你自己文件路径决定
#添加远端请求端口,用于Postman请求工具使用
xdebug.remote_port = 9000
xdebug.remote_mode = "req"

编辑器设置

PHPStorm

在PHPStorm下需要设置软件中的所使用的PHP版本,并且检查XDebug是否安装成功。

PHPStorm设置PHP环境

开始调试

在开始调试前我们还需要做一些小小的操作。

PHP打断点和开启调试模式

Postman

在请求头中添加Cookie让PHPStorm能够监听到需要调试需求。

Cookie:XDEBUG_SESSION=PHPSTORM;

Postman请求设置

首次响应Debug,IDE会进行确认操作

第一次响应Debug

点击“Accept”同意Debug响应操作,编辑器会在下方开启Debug视图,此时你可以完整观看程序数据情况,也可以使用不同工具来进行调试程序代码走向。

断点操作

最后提示

[scode type="red"]在线上环境中,请不要安装XDebug[/scode]

在很多情况下,测试人员在反馈的示例中,使用var_dump函数只能正对操作后的元素值得情况,在计算的场景下仍需要XDebug这类扩展来帮助我们更加深入的了解程序走向,了解程序背后深度。

如果需要转载文章或商务合作,请关注公众号取得联系!

一些面试题 P1

写这玩意的初衷:

刚好写这段文章的时候正在面试,但是面试的时候发现对一些问题回答的不够规范,在此感谢其中一家公司的HR建议,对此重新写一下个人对于面试题的解析.

1.Redis-什么是缓存穿透?

[适用于高速缓存系统回答(也许)]

我们先来描述一下含有Redis时用户访问场景:

有缓存:用户请求-》查询Redis是否有缓存-》有-》从Redis返回数据-》处理数据-》返回用户

无缓存:用户请求-》查询Redis是否有缓存-》无-》请求MYSQL-》处理MYSQL数据-》写入Redis缓存-》-》返回用户

Redis本身就是对于高并发的数据读取来缓解MYSQL 的I/O查询过慢 ,缓存穿透就是当用户访问网站的时候,查询高速缓冲数据库中是否有数据,当太多用户刚好都访问没有中标Redis数据时,就会都去查询持久性数据库(也就MYSQL类型),这会给持久性数据库的造成过大的压力。

简要的说,就是查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询。这会给持久性数据库的造成过大的压力。

2.Redis-什么是缓存击穿?

而击穿就会有点不同了,这种情况就是有一个很火的Key,例如首页,微博热点什么的,但是刚好Key失效或者太多人Redis直接干崩溃了,那么用户就穿过Redis,全部都去查询持久性数据库,但这个时候本身就是热点Key很容易就会把持久性数据库打到崩溃。这就是击穿

3.针对上述问题如何解决?

缓存穿透

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;(因为非法的访问根本就不用理)
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。

缓存击穿

  1. 热点Key直接设置为永远不过期,有数据直接刷新value不用,理过期时间
  2. 添加排斥锁,假设如果有一个人进行查询时,顺带上锁,其他人检查到锁的时候,等待10s后重新从Redis中获取即可
  3. 部署集群Redis,就算打到一个Redis还有千千万万的Redis服务

4.epoll与select有什么区别?

epoll 和 select 都是 I/O 多路复用的技术,都可以实现同时监听多个 I/O 事件的状态。

epoll 相比 select 效率更高,主要是基于其操作系统支持的I/O事件通知机制,而 select 是基于轮询机制。

来源:张朋

5.单机redis与集群redis?

单机Redis会有可能会很容易导致内存和CPU的能力上限。

集群Redis可以分担单机的缓解压力减少穿透、击穿情况,由于Redis主从复制架构每个数据库都要保存整个集群中的所有数据,容易形成木桶效应,为了最大化利用内存,可以采用集群,就是分布式存储,即每台redis存储不同的内容可

6.为什么memcache只支持kv,而redis支持类型多?

【个人觉得两者是不同方向解决不同环境下的高并发问题,所以我硬原理,我也不清楚】

7.redis数据过期策略是什么?

  1. 定时删除
  2. 惰性删除
  3. 定期删除

8.如何快速定位php程序运行慢的地方?

  1. 装个xdebug,打开profiling, 用cache grind看调度的日志就知道哪是瓶颈了
  2. slow log追踪

9.一个事务里面如果嵌套一个curl操作,会发生什么?

其实这道题,应该是MYSQL事务中进行CURL操作?我觉得应该不会发生太大问题可能主要有这种情况?

try {
    //run startTrans
    //run crul?
    //run commit
} catch (\Throwable $th) {
    //db rollback
}

可能报错什么的?直接回触发cath操作了吧直接回滚了?

同样等待一个大佬回复
  1. curl 如果产生 Fatal error,程序不往下执行,事务交由自动处理程序处理(通常是自动回滚);
  2. curl不产生致命错误,将不影响事务的处理;
  3. 如果在事务中必须使用curl的化,最好设置curl的超时时间,以便主动控制事务回滚。
来源:张朋