guanhui07

guanhui07 查看完整档案

广州编辑重庆社会大学  |  土木工程系 编辑  |  填写所在公司/组织 guanhui07.github.io/blog/ 编辑
编辑

修复这个bug

个人动态

guanhui07 赞了文章 · 1月21日

shell在手分析服务器日志不愁?

自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站的访问量。看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试!

1、查看有多少个IP访问:

awk '{print $1}' log_file|sort|uniq|wc -l

2、查看某一个页面被访问的次数:

grep "/index.php" log_file | wc -l

3、查看每一个IP访问了多少个页面:

awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txt

sort -n -t ' ' -k 2 log.txt配合sort进一步排序

4、将每个IP访问的页面数进行从小到大排序:

awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

5、查看某一个IP访问了哪些页面:

grep ^111.111.111.111 log_file| awk '{print $1,$7}'

6、去掉搜索引擎统计的页面:

awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l

7、查看2015年8月16日14时这一个小时内有多少IP访问:

awk '{print $4,$1}' log_file | grep 16/Aug/2015:14 | awk '{print $2}'| sort | uniq | wc -l

8、查看访问前十个ip地址

awk '{print $1}' |sort|uniq -c|sort -nr |head -10 access_log

uniq -c 相当于分组统计并把统计数放在最前面
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10

cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}

9、访问次数最多的10个文件或页面

cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr | head -10

cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr|head -20

awk '{print $1}' log_file |sort -n -r |uniq -c | sort -n -r | head -20
访问量最大的前20个ip

10、通过子域名访问次数,依据referer来计算,稍有不准

cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn | head -20

11、列出传输大小最大的几个文件

cat www.access.log |awk '($7~/\.php/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -100

12、列出输出大于200000byte(约200kb)的页面以及对应页面发生次数

cat www.access.log |awk '($10 > 200000 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

13、如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面

cat www.access.log |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

14、列出最最耗时的页面(超过60秒的)的以及对应页面发生次数

cat www.access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

15、列出传输时间超过 30 秒的文件

cat www.access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

16、列出当前服务器每一进程运行的数量,倒序排列

ps -ef | awk -F ' ' '{print $8 " " $9}' |sort | uniq -c |sort -nr |head -20

17、查看apache当前并发访问数

对比httpd.conf中MaxClients的数字差距多少
netstat -an | grep ESTABLISHED | wc -l

18、可以使用如下参数查看数据

ps -ef|grep httpd|wc -l

1388
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整

netstat -nat|grep -i "80"|wc -l

4341
netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数

netstat -na|grep ESTABLISHED|wc -l

376
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计
最终返回的数字就是当前所有80端口的已建立连接的总数。

netstat -nat||grep ESTABLISHED|wc

可查看所有建立连接的详细记录

19、输出每个ip的连接数,以及总的各个状态的连接数
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'

20、其他的收集

分析日志文件下 2012-05-04 访问页面最高 的前20个 URL 并排序

cat access.log |grep '04/May/2012'| awk '{print $11}'|sort|uniq -c|sort -nr|head -20

查询受访问页面的URL地址中 含有 www.abc.com 网址的 IP 地址

cat access_log | awk '($11~/\www.abc.com/){print $1}'|sort|uniq -c|sort -nr

获取访问最高的10个IP地址 同时也可以按时间来查询

cat linewow-access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10

时间段查询日志时间段的情况

cat log_file | egrep '15/Aug/2015|16/Aug/2015' |awk '{print $1}'|sort|uniq -c|sort -nr|head -10

分析2015/8/15 到 2015/8/16 访问"/index.php?g=Member&m=Public&a=sendValidCode"的IP倒序排列

cat log_file | egrep '15/Aug/2015|16/Aug/2015' | awk '{if($7 == "/index.php?g=Member&m=Public&a=sendValidCode") print $1,$7}'|sort|uniq -c|sort -nr

($7~/.php/) $7里面包含.php的就输出,本句的意思是最耗时的一百个PHP页面

cat log_file |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

列出最最耗时的页面(超过60秒的)的以及对应页面发生次数

cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

统计网站流量(G)

cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

统计404的连接

awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

统计http status

cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

每秒并发

watch "awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' log_file|sort -k 2 -nr|head -n10"

带宽统计

cat apache.log |awk '{if($7~/GET/) count++}END{print "client_request="count}'
cat apache.log |awk '{BYTE+=$11}END{print "client_kbyte_out="BYTE/1024"KB"}'

找出某天访问次数最多的10个IP

cat /tmp/access.log | grep "20/Mar/2011" |awk '{print $3}'|sort |uniq -c|sort -nr|head

当天ip连接数最高的ip都在干些什么

cat access.log | grep "10.0.21.17" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

小时单位里ip连接数最多的10个时段

awk -vFS="[:]" '{gsub("-.*","",$1);num[$2" "$1]++}END{for(i in num)print i,num[i]}' log_file | sort -n -k 3 -r | head -10

找出访问次数最多的几个分钟

awk '{print $1}' access.log | grep "20/Mar/2011" |cut -c 14-18|sort|uniq -c|sort -nr|head
取5分钟日志
if [ $DATE_MINUTE != $DATE_END_MINUTE ] ;then #则判断开始时间戳与结束时间戳是否相等
START_LINE=sed -n "/$DATE_MINUTE/=" $APACHE_LOG|head -n1 #如果不相等,则取出开始时间戳的行号,与结束时间戳的行号

查看tcp的链接状态

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 
    
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' 

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}' 
    
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}' 
    
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn 
    
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
netstat -ant|awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -n 
    
netstat -ant|awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -rn|head -n 10 
    
awk 'BEGIN{printf ("http_code\tcount_num\n")}{COUNT[$10]++}END{for (a in COUNT) printf a"\t\t"COUNT[a]"\n"}'

查找请求数前20个IP(常用于查找攻来源):
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

查找较多time_wait连接

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

找查较多的SYN连接

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

根据端口列进程
netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

查看了连接数和当前的连接数

netstat -ant | grep $ip:80 | wc -l
netstat -ant | grep $ip:80 | grep EST | wc -l

查看IP访问次数
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n

Linux命令分析当前的链接状况
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

watch "netstat -n | awk '/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}'" # 通过watch可以一直监控

LAST_ACK 5 #关闭一个TCP连接需要从两个方向上分别进行关闭,双方都是通过发送FIN来表示单方向数据的关闭,当通信双方发送了最后一个FIN的时候,发送方此时处于LAST_ACK状态,当发送方收到对方的确认(Fin的Ack确认)后才真正关闭整个TCP连接;

SYN_RECV 30  # 表示正在等待处理的请求数;

ESTABLISHED 1597 # 表示正常数据传输状态; 

FIN_WAIT1 51 # 表示server端主动要求关闭tcp连接; 

FIN_WAIT2 504 # 表示客户端中断连接; 

TIME_WAIT 1057  # 表示处理完毕,等待超时结束的请求数; 

文章部分命令收集整理来自网络,如有问题请联系我

仓促成文,不当之处,在所难免,尚盼读者,多加指正

-------------------------我是分割线-------------------------

硬广时间(对Nginx感兴趣的童鞋可以看下)

Nginx系列课程索引

  1. 引子: WebServer与PHP通信姿势
    熟悉了解Nginx与PHP是怎么进行通信的

  2. 起手式: PHP程序猿应该知道的Nginx (上)
    如何更好的使用Nginx和Nginx配置

  3. 进阶式: PHP程序猿应该知道的Nginx (中)
    深入理解Nginx内核和Nginx运行原理,剖析Nginx高性能的秘密

  4. 实战篇: PHP程序猿应该知道的Nginx (下)
    百闻不如一run 一起来开发一个Nginx的拓展

查看原文

赞 60 收藏 165 评论 14

guanhui07 赞了文章 · 2020-12-21

XDEBUG 从入门到精通

clipboard.png

前言

Xdebug是PHP的扩展,用于协助调试和开发。

  • 它包含一个用于IDE的调试器
  • 它升级了PHP的var_dump()函数
  • 它为通知,警告,错误和异常添加了堆栈跟踪
  • 它具有记录每个函数调用和磁盘变量赋值的功能
  • 它包含一个分析器
  • 它提供了与PHPUnit一起使用的代码覆盖功能。

猿生必备的工具。
但不推荐在生产环境中使用xdebug,因为他太重了。

安装

PECL 安装

pecl install xdebug
zend_extension="/usr/local/php/modules/xdebug.so"

源码包安装

https://xdebug.org/download.php 寻找对应的包

wget xxx.gz
./configure
make && make install
zend_extension="/usr/local/php/modules/xdebug.so"

Docker安装

以下为php dockerfile内部分内容

RUN pecl install xdebug
RUN echo 'zend_extension=xdebug.so' >> /usr/local/etc/php/conf.d/xdebug.ini

工作原理

IDE(如PHPStorm)已经集成了一个遵循BGDP的XDebug插件,当开启它的时候, 会在本地开一个XDebug调试服务,监听在调试器中所设置的端口上,默认是9000,这个服务就会监听所有到9000端口的链接。

clipboard.png

当浏览器发送一个带 XDEBUG_SESSION_START 的参数的请求到服务器时,服务器接受后将其转到后端的php处理,如果php开启了XDebug模块,则会将debug信息转发到客户端IP的IDE的调试端口上。

clipboard.png

当参数或者cookie信息中不带 XDEBUG_SESSION_START ,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。

基本配置

一般情况下,你都只需了解,无需修改。

名称类型默认值注解
xdebug.default_enableboolean1堆栈跟踪,默认开启,是xdebug基础功能之一
xdebug.force_display_errorsinteger0默认关闭,如果这个设置设置为1,那么无论PHP的display_errors设置为什么,都将始终显示错误。
xdebug.force_error_reportinginteger0默认关闭,允许强制显示某些错误
xdebug.halt_levelinteger0默认关闭,设置接收某些指定错误
xdebug.max_nesting_levelinteger256控制无限递归(死循环)的保护机制,默认是256
xdebug.max_stack_framesinteger-1控制有多少堆栈帧显示在堆栈跟踪中,在PHP错误堆栈跟踪的命令行中,以及在浏览器中显示HTML跟踪。
xdebug.screamboolean0默认关闭,如果该设置为1,那么Xdebug将禁用@(关闭)操作符,以便不再隐藏通知、警告和错误。

具体内容请移步官网 https://xdebug.org/docs/basic

打印配置

Xdebug将替换PHP的var_dump()函数来显示变量。Xdebug版本包含了不同类型的不同颜色,并对数组元素/对象属性的数量、最大深度和字符串长度进行了限制。还有一些其他函数也处理变量显示。

名称类型默认值注解
xdebug.cli_colorinteger0cli模式下输入结果是否设置颜色
xdebug.overload_var_dumpboolean2是否允许xdebug重载var_dump函数
xdebug.var_display_max_childreninteger128var_dump 对数组对象子级的显示层数限制
xdebug.var_display_max_datainteger512var_dump 对结果长度的限制
xdebug.var_display_max_depthinteger3var_dump 对默认显示嵌套的层数的限制

具体内容请移步官网 https://xdebug.org/docs/display

堆栈跟踪配置

当Xdebug被激活时,当PHP决定显示一个通知、警告、错误等时,它将显示一个堆栈跟踪。堆栈跟踪显示的信息以及它们的显示方式可以配置为适合您的需要。

名称类型默认值注解
xdebug.cli_colorinteger0cli模式下输入结果是否设置颜色
xdebug.collect_includesboolean1控制Xdebug是否应该将include()、include_once()、require()或require_once()中的文件名写入跟踪文件
xdebug.collect_paramsinteger0该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug是否应该收集传递给函数的参数
xdebug.collect_varsboolean0这个设置告诉Xdebug在特定范围内使用哪些变量。由于Xdebug必须逆向工程PHP的操作码数组,这种分析可能相当缓慢。对于使用xdebug.collect_params,此设置不会记录不同变量的值。只有当您希望使用xdebug_get_declared_vars()时,才需要启用此设置。
xdebug.dump.*stringempty* 可以是任何COOKIE、文件、GET、POST、REQUEST、SERVER、SESSION。这七个设置控制在发生错误时显示来自超全局变量的哪些数据。
xdebug.dump_globalsboolean1当该设置设置为true时,Xdebug将添加通过Xdebug.dump配置的超级全局变量的值*到屏幕上的堆栈跟踪和错误日志。
xdebug.dump_onceboolean1控制是否应该在所有错误情况(设置为0)上转储超全局变量的值,或只在第一个错误情况下转储超全局变量的值(设置为1)
xdebug.dump_undefinedboolean0如果您想从超全局变量中转储未定义的值,您应该将该设置设置为1,否则将其设置为0。
xdebug.file_link_formatstring文件链接格式

具体内容请移步官网 https://xdebug.org/docs/stack...

函数调试配置

Xdebug允许记录所有函数调用,包括参数和以不同格式返回的值。

名称类型默认值注解
xdebug.auto_traceboolean0当将此设置设置为ture时,将在脚本运行之前启用函数调用的跟踪
xdebug.collect_assignmentsboolean0该设置默认为0,控制Xdebug是否应该向函数跟踪添加变量赋值。
xdebug.collect_includesboolean1该设置默认为1,控制Xdebug是否应该将include()、include_once()、require()或require_once()中的文件名写入跟踪文件。
xdebug.collect_paramsinteger0该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug是否应该收集传递给函数的参数。
xdebug.collect_returnboolean0该设置默认为0,控制Xdebug是否应该将函数调用的返回值写入跟踪文件。
xdebug.show_mem_deltainteger0Xdebug生成的跟踪文件将显示函数调用之间内存使用的差异
xdebug.trace_formatinteger0跟踪文件的格式
xdebug.trace_optionsinteger0当设置为“1”时,跟踪文件将被附加到后面的请求中,而不是被覆盖。
xdebug.trace_output_dirstring/tmp写入跟踪文件的目录,确保PHP运行的用户具有该目录的写权限。

具体内容请移步官网 https://xdebug.org/docs/execu...

垃圾收集统计信息

Xdebug的内置垃圾收集统计信息分析器允许您查明PHP内部垃圾收集器何时触发、它能够清理多少变量、它花费了多长时间以及实际释放了多少内存。

名称类型默认值注解
xdebug.gc_stats_enableboolfalse如果启用此设置,则垃圾收集运行的统计信息将自动收集到使用xdebug.gc_stats_output_dir设置的给定目录中, 并使用由xdebug.gc_stats_output_name配置的自动生成的名称。
xdebug.gc_stats_output_dirstring/tmp将写入垃圾收集统计信息输出的目录,确保将运行PHP的用户具有对该目录的写入权限。无法使用ini_set() 在脚本中设置此设置。
xdebug.gc_stats_output_namestringgcstats.%p此设置确定用于将垃圾回收统计信息转储到的文件的名称。该设置使用格式说明符指定格式,与sprintf() 和strftime() 非常相似。有几种格式说明符可用于格式化文件名。

具体内容请移步官网 https://xdebug.org/docs/garba...

远程调试配置

Xdebug为与运行PHP脚本交互的调试器客户机提供了一个接口。

名称类型默认值注解
xdebug.extended_infointeger1控制Xdebug是否应该为PHP解析器强制执行'extended_info'模式; 这允许Xdebug使用远程调试器执行文件/行断点。在跟踪或分析脚本时,您通常希望关闭此选项,因为PHP生成的oparray将增加大约三分之一的大小,从而减慢脚本速度。无法使用ini_set()在脚本中设置此设置,但只能在php.ini中设置。
xdebug.idekeystringcomplex控制哪些IDE Key Xdebug应传递给DBGp调试器处理程序。则与客户端通信的key
xdebug.remote_addr_headerstring""该值将用作$SERVER超全局数组中的键,以确定用于查找用于“连接回”的IP地址或主机名的标头
xdebug.remote_autostartboolean0您需要使用特定的HTTP GET / POST变量来启动远程调试
xdebug.remote_connect_backboolean0如果你不设置ip地址,就只能靠xdebug自己找了,Xdebug将尝试连接到发出HTTP请求的客户端。它检查$_SERVER['HTTP_X_FORWARDED_FOR']和$_SERVER['REMOTE_ADDR']变量以找出要使用的IP地址
xdebug.remote_cookie_expire_timeinteger3600设置cookie的生命周期
xdebug.remote_enableboolean0是否开启远程调试
xdebug.remote_handlerstringdbgp调试的通信协议
xdebug.remote_hoststringlocalhost调试的网络地址,开启了remote_connect_back后,当前配置就无效了
xdebug.remote_logstring调试的日志
xdebug.remote_portinteger9000调试的端口
xdebug.remote_timeoutinteger200调试的通信链接的等待时间

具体内容请移步官网 https://xdebug.org/docs/remote

官方链接

全部配置请移步官网 https://xdebug.org/docs/all_s...
全部函数请移步官网 https://xdebug.org/docs/all_f...

PHPSTORM DEBUG

网络上的配置DEBUG文章太杂太乱,在PHPSTROM跳来跳去的,实在让人心烦意乱,本章重新整理描述。

配置

其实在PHPSTROM中已经出了很详细的教程,是吧?只不过大部分人都会直接百度/Google,查询是个好习惯,但要视情况而定。

Languages & Frameworks > PHP > Debug

clipboard.png

第一步

下载XDEBUG扩展,本章开头已经讲过了,这里不再阐述。
在安装完成后,PHPSTROM提供了验证脚本。脚本地址为 https://gist.github.com/litzi...
正常情况下检测成功的样子是

clipboard.png

看到这个你就可以放心的去debug了。

第二步

装个浏览器插件,用户请求监听。这个东西唯一的作用就是方便了debug,正常如果不安装的话你需要通过GET传参 XDEBUG_SESSION_START=ID_KEY 才可以,安装插件后就不需要了。

clipboard.png

你可以自行选择是否开启debug,以下为浏览器插件列表

浏览器下载
ChromeXdebug Helper
FirefoxThe easiest Xdebug or Xdebug Helper
SafariXdebug Toggler
OperaXdebug launcher
Internet ExplorerPhpStorm bookmarklets generator

第三步

开启监听即可。

clipboard.png

你可以直接点击图片上的监听按钮。

到现在为止,就配置好了IDE。

第四步

创建DEBUG配置文件,根据每个项目都要配置。这步你跑不了。

clipboard.png

你看,PHPSTORM非常人性化,在每一步都会给你出个简单的教程来描述如何配置DEBUG。

添加一个Server和IDE key(xdebug.idekey) 就可以进行调试了。

总结

总结以下IDE配置DEBUG的步骤,实际很简单。

  1. 下载安装debug
  2. 验证是否通信正常
  3. 添加浏览器插件 (可省略)
  4. 配置运行文件
  5. 愉快的debug
这里还要说明下,如果你是不需要访问本机调试一些类或者代码块,你只需要在本机上安装好XDEBUG,上述配置全部省略,直接点小虫子图标即可调试。DEBUG端口默认是9000,如果配置文件内修改了,当然在IDE内也需要修改下。

调试

介绍下实际DEBUG过程中PHPSTORM面板的按钮都是做什么用的。当你启动监听后,你将会看到如下图

clipboard.png

根据上图图标位置,以x,y坐标的方式描述每个图标的功能。

图标位置 (x,y)功能
clipboard.png0,0重新执行DEBUG (Rerun test.php)
clipboard.png0,1跳转到原调试文件 (Show execution point)
clipboard.png0,2跳到下一行 (Step over)
clipboard.png0,3执行下一步 (Step info)
clipboard.png0,4跳入库、构造函数等方法或类中 (Force Step Info)
clipboard.png0,5执行函数体或类方法,如果在最外层则结束本次调试 (Step out)
clipboard.png0,6跳到当前节点的下个断点 (Run to Cursor)
clipboard.png0,7执行修改变量或返回的结果用于二次调试(Evaluate arbitrary expression)
clipboard.png0,8显示值的地址 (Show Values Addresses)
clipboard.png0,9是否显示空的值 , 默认是不显示
clipboard.png0,10跳到下个断点 (Add method to skip list)
clipboard.png1,0重新执行DEBUG (Resume Program)
clipboard.png2,0停止DEBUG(Step process)
clipboard.png3,0查看和管理所有的断点 ( View and manage all breakpoints)
clipboard.png4,0忽略所有断点 (Mute breakpoints)

其他

Docker PHP XDEBUG

部分人在本机装了Docker,容器中运行这PHP,这个时候该如何进行DEBUG呢?如果认真看本篇文章,你会发现十分的简单。本身XDEBUG就是远程调试。首先你要保证

  • 容器做了端口映射到本机80
  • 容器内项目目录做了磁盘挂载

将容器PHP XDEBUG 中

xdebug.remote_host=local_ip

即可,也不用担心hosts文件的问题

本机IP = 127.0.0.1 = localhost

这样配置完成后,就可以当容器不存在,与本机调试一样。

致谢

感谢你看到这里,希望本章内容可以帮到你,谢谢。

查看原文

赞 109 收藏 88 评论 6

guanhui07 赞了文章 · 2020-12-21

yasd 调试器 v0.2.5 版本发布,支持 PHP8 以及在 IDE 中使用调试

yasd 距离上次发布已经过去了十几天,现在发布到了 v0.2.5 版本,相信有许多的小伙伴已经用上了

那么还有人记得上次发布时说过支持了哪些功能吗?

  1. 调试协程
  2. 断点调试
  3. 断点缓存
  4. 查看调用栈
  5. 单步调试

上次发布之后就有小伙伴提交 issue,询问是否支持 PhpStorm 以及 VScode,那么它来了

@codinghuang 不负众望,已经支持了 PHP8 和 IDE 调试

image

前往公众号观看如何在 IDE 中使用 yasd 调试器

这个版本支持的功能有:

  1. 支持 PHP8
  2. 支持 IDE 调试(支持两种模式,IDE 和 cmd 调试)
  3. 变量监视
  4. 打印变量(支持打印对象等)

不是吧不是吧?你还没有用过?快来试试

安装 yasd

在编译安装之前你需要安装boost库。

macOS:

brew install boost

Ubuntu:

apt-get install libboost-all-dev

CentOS:

yum install boost boost-devel

拉取 master 分支的源码,或者从 GitHub 下载对应的release 版本

git clone https://github.com/swoole/yasd.git

常规编译流程

phpize --clean && \
phpize && \
./configure && \
make clean && \
make && \
make install

修改 php.ini 文件:

zend_extension=yasd
特别注意这里是zend_extension,有些小伙伴用不起来就是因为写成了extension

查看扩展是否安装成功

php --ri yasd

如果你要使用 IDE 模式调试,还需要额外添加一些配置

zend_extension=yasd
yasd.debug_mode=remote
yasd.remote_host=127.0.0.1
yasd.remote_port=9000

不设置yasd.debug_mode选项的话,默认就是 cmd 模式调试

zend_extension=yasd
yasd.debug_mode=cmd

你可以自由的切换两种调试模式,快去试试吧

不要忘记给 yasd 一个 Star 哦

Swoole官方公众号

查看原文

赞 4 收藏 1 评论 1

guanhui07 关注了用户 · 2020-12-17

民工哥 @jishuroad

民工哥,10多年职场老司机的经验分享,坚持自学一路从技术小白成长为互联网企业信息技术部门的负责人。

我的新书:《Linux系统运维指南》

微信公众号:民工哥技术之路

民工哥:知乎专栏

欢迎关注,我们一同交流,相互学习,共同成长!!

关注 3018

guanhui07 赞了文章 · 2020-12-16

simps/mqtt:适用于 PHP 的 MQTT 协议解析和协程客户端

MQTT 是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,作为一种低开销、低带宽占用的即时通讯协议,已经成为物联网的重要组成部分

Swoole 也给 PHP 提供了开发物联网项目的能力,只需要设置一个 open_mqtt_protocol 选项,启用后就会解析 MQTT 包头,在 Worker 进程的 onReceive 事件每次都会返回一个完整的 MQTT 数据包

当然其他的也有,例如 Workerman 之前提供的 异步 mqtt 客户端库 ,还有其他的开源库,这里就不一一介绍了

Simps 的第一个版本 MQTT 库 就是参考了 Workerman 的实现,使其能够使用 Swoole 的协程能力,同时也修复了一些问题

在此也要感谢 @walkor 对 PHP 生态作出的贡献

第一个版本的实现是放在了框架当中,限制了一些用户的使用。于是又开始了重构,将 MQTT 独立为一个 library ,方便用户使用的同时也丰富了 PHP 生态,让 PHP 程序员不再局限于 Web 开发

在第一个版本发布之后,Simps 的交流群中也有不少用户询问 MQTT 的问题,Swoole 也修复了一些相关的 Bug,现在使用 PHP + Swoole 去开发物联网相关的项目应该是如虎添翼

同时第一个版本的 MQTT 库,只支持 MQTT 3.x,不支持 MQTT 5.0,在 GitHub 上也没有找到相关支持的类库,所以在重构了 3.x 版本之后,也支持了一下 MQTT 5.0

也许这是第一个支持 MQTT v5.0 协议的 PHP library...

支持 MQTT 协议 3.1、3.1.1 和 5.0 版本,支持 QoS 0、QoS 1、QoS 2,那么它来了,使用 composer 来安装

composer require simps/mqtt

安装成功之后我们来看一下订阅和发布的使用,以 MQTT5.0 为例

订阅

首先应该是订阅,订阅成功之后才能收到对应主题的发布消息,创建一个subscribe.php写入以下内容

include __DIR__ . '/vendor/autoload.php';

use Simps\MQTT\Hex\ReasonCode;
use Swoole\Coroutine;
use Simps\MQTT\Client;
use Simps\MQTT\Types;

$config = [
    'host' => 'broker.emqx.io',
    'port' => 1883,
    'time_out' => 5,
    'user_name' => 'user001',
    'password' => 'hLXQ9ubnZGzkzf',
    'client_id' => Client::genClientID(),
    'keep_alive' => 10,
    'properties' => [
        'session_expiry_interval' => 60,
        'receive_maximum' => 200,
        'topic_alias_maximum' => 200,
    ],
    'protocol_level' => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]);
    while (!$data = $client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    $topics['simps-mqtt/user001/get'] = [
        'qos' => 1,
        'no_local' => true,
        'retain_as_published' => true,
        'retain_handling' => 2,
    ];
    $timeSincePing = time();
    $res = $client->subscribe($topics);
    // 订阅的结果
    var_dump($res);
    while (true) {
        $buffer = $client->recv();
        if ($buffer && $buffer !== true) {
            $timeSincePing = time();
            // 收到的数据包
            var_dump($buffer);
        }
        if (isset($config['keep_alive']) && $timeSincePing < (time() - $config['keep_alive'])) {
            $buffer = $client->ping();
            if ($buffer) {
                echo 'send ping success' . PHP_EOL;
                $timeSincePing = time();
            } else {
                $client->close();
                break;
            }
        }
        // QoS1 发布回复
        if ($buffer['type'] === Types::PUBLISH && $buffer['qos'] === 1) {
            $client->send(
                [
                    'type' => Types::PUBACK,
                    'message_id' => $buffer['message_id'],
                    'code' => ReasonCode::SUCCESS
                ]
            );
        }
    }
});

执行php subscribe.php,就会得到这样的输出

array(3) {
  ["type"]=>
  int(9)
  ["message_id"]=>
  int(1)
  ["codes"]=>
  array(1) {
    [0]=>
    int(1)
  }
}

表示订阅成功,codes 对应的是对应订阅主题的 QoS 等级

发布

订阅成功之后,创建一个publish.php来测试发布

include __DIR__ . '/vendor/autoload.php';

use Swoole\Coroutine;
use Simps\MQTT\Client;

$config = [
    'host' => 'broker.emqx.io',
    'port' => 1883,
    'time_out' => 5,
    'user_name' => 'user002',
    'password' => 'adIJS1D482sd',
    'client_id' => Client::genClientID(),
    'keep_alive' => 20,
    'properties' => [
        'session_expiry_interval' => 60,
        'receive_maximum' => 200,
        'topic_alias_maximum' => 200,
    ],
    'protocol_level' => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]);
    while (!$client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    while (true) {
        $response = $client->publish(
            'simps-mqtt/user001/get',
            '{"time":' . time() . '}',
            1,
            0,
            0,
            ['topic_alias' => 1]
        );
        var_dump($response);
        Coroutine::sleep(3);
    }
});

代码的意思是每隔 3 秒给订阅的主题simps-mqtt/user001/get发布一次消息

打开一个新的终端窗口,执行php publish.php就会得到输出:

array(4) {
  ["type"]=>
  int(4)
  ["message_id"]=>
  int(1)
  ["code"]=>
  int(0)
  ["message"]=>
  string(7) "Success"
}

这里增加了 message,为了用户可读,不需要去查找对应的 code 含义是什么

返回到订阅的窗口,就会看到所打印的发布信息

array(8) {
  ["type"]=>
  int(3)
  ["topic"]=>
  string(0) ""
  ["message"]=>
  string(19) "{"time":1608017156}"
  ["dup"]=>
  int(1)
  ["qos"]=>
  int(1)
  ["retain"]=>
  int(0)
  ["message_id"]=>
  int(4)
  ["properties"]=>
  array(1) {
    ["topic_alias"]=>
    int(1)
  }
}

这样一个简单的发布订阅功能就实现了

在这个库中还有一些值得优化和还未完成的部分,如还没有支持 MQTT5 的Auth type,以及部分的properties还未支持

想参与的同学可以提交 PR,如果有问题也可以提交 Issue,让我们共同去建设 PHP 的生态

仓库地址:simps/mqtt ,支持记得点个 Star 哦

沈唁志公众号

查看原文

赞 3 收藏 2 评论 0

guanhui07 关注了专栏 · 2020-12-16

沈唁志

同名公众号:沈唁志。沈唁志是关注PHP开发等技术的个人博客

关注 293

guanhui07 赞了文章 · 2020-11-27

Swoole v4.5.9 版本发布,兼容 PHP8!

PHP8 现在已经正式发布了,它引入了一些重大变更,以及许多新特性和性能优化,包括命名参数、联合类型、注解、Constructor Property Promotion、match 表达式、nullsafe 运算符、JIT,以及对类型系统、错误处理和一致性的改进。

Swoole 也在第一时间进行来兼容,可以和 PHP8 一起使用,需要在 PHP8 使用 Swoole 的小伙伴可以直接使用此版本,其他低版本可能编译失败哦。

更新日志

增强

  • 为 CoroutineHttpClient 添加 SWOOLE_HTTP_CLIENT_ESTATUS_SEND_FAILED 常量 (#3873) (@sy-records)

修复

  • 兼容 PHP8 (#3868) (#3869) (#3872) (@twose) (@huanghantao) (@doubaokun)
  • 修复未定义的常量 CURLOPT_HEADEROPT 和 CURLOPT_PROXYHEADER (swoole/library#77) (@sy-records)
  • 修复 CURLOPT_USERPWD (swoole/library@7952a7b) (@twose)

Swoole官方公众号

查看原文

赞 11 收藏 1 评论 3

guanhui07 收藏了文章 · 2020-09-29

【Mysql原理和源码学习记录】学而思网校早读会--持续更新中

重要说明

学而思网校服务端早读会在思否开辟免费公开课,将早读会系列分享视频上传至https://ke.sifou.com/course/1650000023669742,大家可以一起学习交流~

完全公开、完全公开、完全公开,欢迎大家一起交流学习,站在巨人的肩膀上高速成长(感谢各位前辈大神~)~

  • 第二阶段主题是【当前】

第二阶段-mysql源码探索

  • 第一阶段主题是

【Mysql原理与实践】以极客时间mysql 45讲为索引探索底层原理与实现

课程资料

备注:课件ppt资料需要做一些处理后上传,视频可直接访问https://ke.sifou.com/course/1... 观看~

第二阶段课程资料[源码解读]

课程名称讲师课件地址备注
【Mysql原理与实践】08-21-赵禹-Mysql词法分析赵禹链接: https://pan.baidu.com/s/1F5kT... 提取码: 5rm4
【Mysql原理与实践】08-25-陈朝飞-Mysql语法分析陈朝飞链接: https://pan.baidu.com/s/1yRcS... 提取码: 2jqy
【Mysql原理与实践】08-26-赵禹-Mysql通信协议与查询赵禹链接: https://pan.baidu.com/s/1R1xh... 提取码: 3dyv
【Mysql原理与实践】08-28-陈磊-Mysql执行器陈磊链接: https://pan.baidu.com/s/11WiC... 提取码: 78k9
【Mysql原理与实践】08-31-胡屹-Update语句的实现原理探索胡屹链接: https://pan.baidu.com/s/1wteI... 提取码: wuxa
【Mysql原理与实践】09-01-景罗-delete语句的实现原理探索(上)景罗链接: https://pan.baidu.com/s/1vtWm... 提取码: ju59
【Mysql原理与实践】09-02-景罗-delete语句的实现原理探索(下)景罗链接: https://pan.baidu.com/s/1vtWm... 提取码: ju59
【Mysql原理与实践】09-04-李乐-select语句实现原理探索李乐暂无资料
【Mysql原理与实践】09-07-田志泽-给单独的一行记录加锁过程田志泽链接: https://pan.baidu.com/s/1rU_U... 提取码: bfkw
【Mysql原理与实践】09-08-景罗-源码探索之众里寻他一行记录景罗链接: https://pan.baidu.com/s/1_fF2... 提取码: g6rr
【Mysql原理与实践】09-10-施洪宝-Next-key Lock加锁分析施洪宝暂无资料
【Mysql原理与实践】09-14-刘志强-mysql insert加锁过程分析刘志强链接: https://pan.baidu.com/s/1ak02... 提取码: fx3w
【Mysql原理与实践】09-15-崔光伟-MySQL中一条简单SQL的加锁分析崔光伟链接: https://pan.baidu.com/s/10UKm... 提取码: 72tm
【Mysql原理与实践】09-17-韩冬辉-mvcc当前读的可见性实现韩冬辉链接: https://pan.baidu.com/s/1Kr-f... 提取码: igrd
【Mysql原理与实践】09-18-李乐-事务的两阶段提交实现李乐链接: https://pan.baidu.com/s/1SHaz... 提取码: i1ze
【Mysql原理与实践】09-22-文本云-事务不同隔离级别下的实现对比文本云http://note.youdao.com/s/bFZorCsr
【Mysql原理与实践】09-24-韩文杰-mvcc内存中的实现韩文杰http://note.youdao.com/s/UXND0XUdhttp://note.youdao.com/s/UqfB6sqPhttp://note.youdao.com/s/2Ch02vNs
【Mysql原理与实践】09-25-李宗源-mvcc一致性读的可见性实现李宗源https://www.zybuluo.com/lixiang9194/note/1744672
【Mysql原理与实践】09-28-郭兆冉-mysql源码之数据记录的实现郭兆冉整理后更新
【Mysql原理与实践】09-29-景罗-行记录链与groupby的实现景罗链接: https://pan.baidu.com/s/1lNel... 提取码: 9yg3
【Mysql原理与实践】10-21-赵禹- 基于行的复制实现之“主从关系建立”赵禹https://mp.weixin.qq.com/s/Bl...
【Mysql原理与实践】10-22-秦日强-Mysql的数据目录及存储实现秦日强链接: https://pan.baidu.com/s/13gzT... 提取码: 4q5e
【Mysql原理与实践】10-26-赵禹-基于行的复制实现之“主从复制”赵禹https://mp.weixin.qq.com/s/0z...
【Mysql原理与实践】10-29-陈磊-mysql优化器之几种优化项陈磊链接: https://pan.baidu.com/s/19F1y... 提取码: j9ix
【Mysql原理与实践】11-02-景罗-聚合函数的底层实现初探景罗链接: https://pan.baidu.com/s/1X5zo... 提取码: mcna
【Mysql原理与实践】11-03-胡屹-mysql源码探索explain的实现胡屹链接: https://pan.baidu.com/s/1bfJm... 提取码: vjk8
【Mysql原理与实践】11-04-景罗-mysql源码groupby实现探索景罗链接: https://pan.baidu.com/s/1hGrZ... 提取码: 8qhd

第一阶段课程资料[原理及源码探索]

课程名称讲师课件地址备注
【Mysql原理与实践】06-11-景罗-一条SQL查询语句是如何执行的景罗链接: https://pan.baidu.com/s/1Zofy... 提取码: 84w6
【Mysql原理与实践】06-15-宁亮&景罗-事务隔离:为什么你改了我还看不见宁亮、景罗链接: https://pan.baidu.com/s/1G9Au... 提取码: rhqp
【Mysql原理与实践】06-16-潘森-深入浅出索引潘森链接: https://pan.baidu.com/s/13t7r... 提取码: 4xsp
【Mysql原理与实践】06-19-刘志强-行锁功过:怎么减少行锁对性能的影响刘志强链接: https://pan.baidu.com/s/1QxIH... 提取码: 9fvh
【Mysql原理与实践】06-23-陈磊-普通索引和唯一索引应该怎么选择陈磊链接: https://pan.baidu.com/s/1mDfG... 提取码: d1h2
【Mysql原理与实践】06-24-赵禹-MySQL为什么有时候会选错索引赵禹链接: https://pan.baidu.com/s/1jr4U... 提取码: 4gsy
【Mysql原理与实践】07-01-黄桃-count(×)这么慢我该怎么办黄桃链接: https://pan.baidu.com/s/1HwDn... 提取码: anw6
【Mysql原理与实践】07-06-李乐-如何正确地显示随机消息李乐链接: https://pan.baidu.com/s/11dsu... 提取码: sd3h
【Mysql原理与实践】07-09-胡屹-幻读是什么及幻读有什么问题胡屹链接: https://pan.baidu.com/s/1kqQM... 提取码: ttzm
【Mysql原理与实践】07-10-景罗-只改一行语句为什么锁这么多景罗链接: https://pan.baidu.com/s/1iCfs... 提取码: e4i9
【Mysql原理与实践】07-15-景罗-Mysql锁漫谈--gdb调试加锁过程景罗链接: https://pan.baidu.com/s/1iCfs... 提取码: e4i9
【Mysql原理与实践】07-16-秦日强-MySQL是怎么保证高可用的秦日强链接: https://pan.baidu.com/s/1k8um... 提取码: v8ic
【Mysql原理与实践】07-22-施洪宝-读写分离有哪些坑施洪宝链接: https://pan.baidu.com/s/1a_JZ... 提取码: n4jj
【Mysql原理与实践】07-24-赵禹-答疑文章之用动态的观点看加锁赵禹链接: https://pan.baidu.com/s/1qwK4... 提取码: 5i9v
【Mysql原理与实践】07-30-景罗-到底可不可以使用join景罗链接: https://pan.baidu.com/s/1xswA... 提取码: n7in
【Mysql原理与实践】08-03-景罗-MySQL中count底层实现探索景罗链接: https://pan.baidu.com/s/1UFD5... 提取码: uwwc
【Mysql原理与实践】08-04-崔光伟-join语句怎么优化崔光伟链接: https://pan.baidu.com/s/13Krs... 提取码: mv98
【Mysql原理与实践】08-05-郭兆冉-为什么临时表可以重名郭兆冉链接: https://pan.baidu.com/s/1U9Q7... 提取码: h6sa
【Mysql原理与实践】08-06-李乐-什么时候会使用内部临时表李乐链接: https://pan.baidu.com/s/1cctA... 提取码: 7imj
【Mysql原理与实践】08-10-胡屹-insert语句的锁为什么这么多胡屹链接: https://pan.baidu.com/s/1_t-V... 提取码: xn8g
【Mysql原理与实践】08-18-景罗-答疑文章之说一说这些好问题景罗链接: https://pan.baidu.com/s/107hV... 提取码: gz9s
【Mysql原理与实践】08-19-文本云-自增id用完怎么办文本云链接: https://pan.baidu.com/s/1lmf8... 提取码: ww9b

联系我们

LNMPR源码交流微信群,欢迎一起交流成长~

image

精彩视频抢先看

学而思网校早读会-技术
08-06-李乐-什么时候会使用内部临时表

[\[点击观看\]](https://v.youku.com/v_show/id...
image.png
[\[点击观看\]](https://v.youku.com/v_show/id...

更多视频持续更新中……

【Mysql原理与实践】2020-07-06-李乐-如何正确地显示随机消息

【Mysql原理与实践】2020-08-03-景罗-MySQL中select count(col) 底层实现探索

查看原文

guanhui07 赞了文章 · 2020-09-29

【Mysql原理和源码学习记录】学而思网校早读会--持续更新中

重要说明

学而思网校服务端早读会在思否开辟免费公开课,将早读会系列分享视频上传至https://ke.sifou.com/course/1650000023669742,大家可以一起学习交流~

完全公开、完全公开、完全公开,欢迎大家一起交流学习,站在巨人的肩膀上高速成长(感谢各位前辈大神~)~

  • 第二阶段主题是【当前】

第二阶段-mysql源码探索

  • 第一阶段主题是

【Mysql原理与实践】以极客时间mysql 45讲为索引探索底层原理与实现

课程资料

备注:课件ppt资料需要做一些处理后上传,视频可直接访问https://ke.sifou.com/course/1... 观看~

第二阶段课程资料[源码解读]

课程名称讲师课件地址备注
【Mysql原理与实践】08-21-赵禹-Mysql词法分析赵禹链接: https://pan.baidu.com/s/1F5kT... 提取码: 5rm4
【Mysql原理与实践】08-25-陈朝飞-Mysql语法分析陈朝飞链接: https://pan.baidu.com/s/1yRcS... 提取码: 2jqy
【Mysql原理与实践】08-26-赵禹-Mysql通信协议与查询赵禹链接: https://pan.baidu.com/s/1R1xh... 提取码: 3dyv
【Mysql原理与实践】08-28-陈磊-Mysql执行器陈磊链接: https://pan.baidu.com/s/11WiC... 提取码: 78k9
【Mysql原理与实践】08-31-胡屹-Update语句的实现原理探索胡屹链接: https://pan.baidu.com/s/1wteI... 提取码: wuxa
【Mysql原理与实践】09-01-景罗-delete语句的实现原理探索(上)景罗链接: https://pan.baidu.com/s/1vtWm... 提取码: ju59
【Mysql原理与实践】09-02-景罗-delete语句的实现原理探索(下)景罗链接: https://pan.baidu.com/s/1vtWm... 提取码: ju59
【Mysql原理与实践】09-04-李乐-select语句实现原理探索李乐暂无资料
【Mysql原理与实践】09-07-田志泽-给单独的一行记录加锁过程田志泽链接: https://pan.baidu.com/s/1rU_U... 提取码: bfkw
【Mysql原理与实践】09-08-景罗-源码探索之众里寻他一行记录景罗链接: https://pan.baidu.com/s/1_fF2... 提取码: g6rr
【Mysql原理与实践】09-10-施洪宝-Next-key Lock加锁分析施洪宝暂无资料
【Mysql原理与实践】09-14-刘志强-mysql insert加锁过程分析刘志强链接: https://pan.baidu.com/s/1ak02... 提取码: fx3w
【Mysql原理与实践】09-15-崔光伟-MySQL中一条简单SQL的加锁分析崔光伟链接: https://pan.baidu.com/s/10UKm... 提取码: 72tm
【Mysql原理与实践】09-17-韩冬辉-mvcc当前读的可见性实现韩冬辉链接: https://pan.baidu.com/s/1Kr-f... 提取码: igrd
【Mysql原理与实践】09-18-李乐-事务的两阶段提交实现李乐链接: https://pan.baidu.com/s/1SHaz... 提取码: i1ze
【Mysql原理与实践】09-22-文本云-事务不同隔离级别下的实现对比文本云http://note.youdao.com/s/bFZorCsr
【Mysql原理与实践】09-24-韩文杰-mvcc内存中的实现韩文杰http://note.youdao.com/s/UXND0XUdhttp://note.youdao.com/s/UqfB6sqPhttp://note.youdao.com/s/2Ch02vNs
【Mysql原理与实践】09-25-李宗源-mvcc一致性读的可见性实现李宗源https://www.zybuluo.com/lixiang9194/note/1744672
【Mysql原理与实践】09-28-郭兆冉-mysql源码之数据记录的实现郭兆冉整理后更新
【Mysql原理与实践】09-29-景罗-行记录链与groupby的实现景罗链接: https://pan.baidu.com/s/1lNel... 提取码: 9yg3
【Mysql原理与实践】10-21-赵禹- 基于行的复制实现之“主从关系建立”赵禹https://mp.weixin.qq.com/s/Bl...
【Mysql原理与实践】10-22-秦日强-Mysql的数据目录及存储实现秦日强链接: https://pan.baidu.com/s/13gzT... 提取码: 4q5e
【Mysql原理与实践】10-26-赵禹-基于行的复制实现之“主从复制”赵禹https://mp.weixin.qq.com/s/0z...
【Mysql原理与实践】10-29-陈磊-mysql优化器之几种优化项陈磊链接: https://pan.baidu.com/s/19F1y... 提取码: j9ix
【Mysql原理与实践】11-02-景罗-聚合函数的底层实现初探景罗链接: https://pan.baidu.com/s/1X5zo... 提取码: mcna
【Mysql原理与实践】11-03-胡屹-mysql源码探索explain的实现胡屹链接: https://pan.baidu.com/s/1bfJm... 提取码: vjk8
【Mysql原理与实践】11-04-景罗-mysql源码groupby实现探索景罗链接: https://pan.baidu.com/s/1hGrZ... 提取码: 8qhd

第一阶段课程资料[原理及源码探索]

课程名称讲师课件地址备注
【Mysql原理与实践】06-11-景罗-一条SQL查询语句是如何执行的景罗链接: https://pan.baidu.com/s/1Zofy... 提取码: 84w6
【Mysql原理与实践】06-15-宁亮&景罗-事务隔离:为什么你改了我还看不见宁亮、景罗链接: https://pan.baidu.com/s/1G9Au... 提取码: rhqp
【Mysql原理与实践】06-16-潘森-深入浅出索引潘森链接: https://pan.baidu.com/s/13t7r... 提取码: 4xsp
【Mysql原理与实践】06-19-刘志强-行锁功过:怎么减少行锁对性能的影响刘志强链接: https://pan.baidu.com/s/1QxIH... 提取码: 9fvh
【Mysql原理与实践】06-23-陈磊-普通索引和唯一索引应该怎么选择陈磊链接: https://pan.baidu.com/s/1mDfG... 提取码: d1h2
【Mysql原理与实践】06-24-赵禹-MySQL为什么有时候会选错索引赵禹链接: https://pan.baidu.com/s/1jr4U... 提取码: 4gsy
【Mysql原理与实践】07-01-黄桃-count(×)这么慢我该怎么办黄桃链接: https://pan.baidu.com/s/1HwDn... 提取码: anw6
【Mysql原理与实践】07-06-李乐-如何正确地显示随机消息李乐链接: https://pan.baidu.com/s/11dsu... 提取码: sd3h
【Mysql原理与实践】07-09-胡屹-幻读是什么及幻读有什么问题胡屹链接: https://pan.baidu.com/s/1kqQM... 提取码: ttzm
【Mysql原理与实践】07-10-景罗-只改一行语句为什么锁这么多景罗链接: https://pan.baidu.com/s/1iCfs... 提取码: e4i9
【Mysql原理与实践】07-15-景罗-Mysql锁漫谈--gdb调试加锁过程景罗链接: https://pan.baidu.com/s/1iCfs... 提取码: e4i9
【Mysql原理与实践】07-16-秦日强-MySQL是怎么保证高可用的秦日强链接: https://pan.baidu.com/s/1k8um... 提取码: v8ic
【Mysql原理与实践】07-22-施洪宝-读写分离有哪些坑施洪宝链接: https://pan.baidu.com/s/1a_JZ... 提取码: n4jj
【Mysql原理与实践】07-24-赵禹-答疑文章之用动态的观点看加锁赵禹链接: https://pan.baidu.com/s/1qwK4... 提取码: 5i9v
【Mysql原理与实践】07-30-景罗-到底可不可以使用join景罗链接: https://pan.baidu.com/s/1xswA... 提取码: n7in
【Mysql原理与实践】08-03-景罗-MySQL中count底层实现探索景罗链接: https://pan.baidu.com/s/1UFD5... 提取码: uwwc
【Mysql原理与实践】08-04-崔光伟-join语句怎么优化崔光伟链接: https://pan.baidu.com/s/13Krs... 提取码: mv98
【Mysql原理与实践】08-05-郭兆冉-为什么临时表可以重名郭兆冉链接: https://pan.baidu.com/s/1U9Q7... 提取码: h6sa
【Mysql原理与实践】08-06-李乐-什么时候会使用内部临时表李乐链接: https://pan.baidu.com/s/1cctA... 提取码: 7imj
【Mysql原理与实践】08-10-胡屹-insert语句的锁为什么这么多胡屹链接: https://pan.baidu.com/s/1_t-V... 提取码: xn8g
【Mysql原理与实践】08-18-景罗-答疑文章之说一说这些好问题景罗链接: https://pan.baidu.com/s/107hV... 提取码: gz9s
【Mysql原理与实践】08-19-文本云-自增id用完怎么办文本云链接: https://pan.baidu.com/s/1lmf8... 提取码: ww9b

联系我们

LNMPR源码交流微信群,欢迎一起交流成长~

image

精彩视频抢先看

学而思网校早读会-技术
08-06-李乐-什么时候会使用内部临时表

[\[点击观看\]](https://v.youku.com/v_show/id...
image.png
[\[点击观看\]](https://v.youku.com/v_show/id...

更多视频持续更新中……

【Mysql原理与实践】2020-07-06-李乐-如何正确地显示随机消息

【Mysql原理与实践】2020-08-03-景罗-MySQL中select count(col) 底层实现探索

查看原文

赞 29 收藏 26 评论 3

guanhui07 关注了用户 · 2020-09-08

汤青松 @songboy

《PHP Web安全开发实战》 作者

关注 5936

认证与成就

  • 获得 43 次点赞
  • 获得 10 枚徽章 获得 1 枚金徽章, 获得 2 枚银徽章, 获得 7 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2016-04-05
个人主页被 1.5k 人浏览