排查PHP脚本执行卡住的问题

排查PHP脚本执行卡住与数据库连接问题
本文介绍了如何诊断PHP脚本执行卡住的情况,通过使用strace、netstat、tcpdump等工具,分析了进程与数据库的连接状态,揭示了可能是由于未正确处理数据库连接导致的问题。经过一系列步骤,最终成功定位并解决了问题。

sudo strace -p 13793

 

sudo netstat -tunpa | grep 13793

 

解决问题

登录机器后执行top命令,果然发现存在一个CPU占用较高的PHP进程,然后执行下列命令,发现存在一个由crontab启动的执行了很长时间的PHP脚本:

?
1
ps aux | grep 'php' | grep - v 'php-fpm'

由于之前也遇到过PHP脚本执行卡住的类似情况,当时的怀疑是跨机房的Mysql查询在网络抖动时导致Mysql连接卡住了,于是理所当然的将所有卡住的进程都kill掉了,再从负载上看机器马上就恢复正常了,于是心满意足的跑去干别的了。

过了一段时间,刷了下监控,发现问题又出现了,注释掉crontab并kill掉进程后,手动执行问题脚本,竟然能稳定复现问题!看来是把问题想得太简单了,尝试用strace命令看下卡住的进程当前究竟在干什么:

?
1
2
[tabalt@localhost ~] sudo strace -p 13793
Process 13793 attached - interrupt to quit

什么输出都没有!再用netstat看下这个进程是否打开了什么端口:

?
1
2
3
[tabalt@localhost ~] sudo netstat -tunpa | grep 13793
tcp  0  0 192.168.1.100:38019  192.168.1.101:3306  ESTABLISHED 13793/php
tcp  0  0 192.168.1.100:47107  192.168.1.102:6379  CLOSE_WAIT 13793/php

可以看到进程打开了两个端口,分别与Mysql和Redis建立了连接,并且处于连接建立(ESTABLISHED)和对方主动关闭连接(CLOSE_WAIT)的状态;初看确实像是和数据库的连接卡住了,但是因为吃过亏上过当,咱们使用tcpdump抓包看进程和数据库之间的交互:

?
1
tcpdump -i eth0 host 192.168.1.101 and port 3306 -w ~/mysql.cap

抓了好一会,~/mysql.cap 文件中却也没有任何输出,难道进程和Mysql之间已经没有任何交互了?那为什么连接建立没有关闭呢?看来只能从头追踪一下脚本的执行情况了:

首先为了能来得及strace到进程,在PHP脚本最开始的时候输出进程的pid并sleep 10s:

?
1
echo getmypid (); sleep(10);

然后启动tcpdump准备抓包本机和Mysql的交互过程。

最后执行PHP脚本,并复制输出的pid后在新窗口中执行strace命令。

这下strace和tcpdump都有内容了!从strace结果看recvfrom之后不再有poll,但并没有看出来有什么不对:

?
1
2
3
4
5
// ...
poll([{fd=4, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "://xxx.com/\0\0\23jiadia" ..., 271, MSG_DONTWAIT, NULL, NULL) = 271
poll([{fd=4, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "_b?ie=UTF8&node=658390051\0\0008www." ..., 271, MSG_DONTWAIT, NULL, NULL) = 206

再从抓包结果看,执行了两条SQL查询语句之后,进程没有再次发送查询请求的包,从程序记录SQL语句日志中,也发现确实只执行了两条:

### CTF自动加载程序卡住的解决方案 当遇到CTF自动加载程序卡住的情况时,可以采取多种方法来排查并解决问题。考虑到可能存在的模棱两可的解决方案[^1],建议遵循系统化的方法逐步排除潜在原因。 #### 1. 检查日志文件 查看应用程序的日志文件对于诊断问题是至关重要的。通过分析错误消息和警告信息,能够定位到具体发生问题的位置。如果发现诸如`argument type mismatch`这样的报错,则可能是函数调用参数不匹配所引起的异常情况[^3]。 #### 2. 验证依赖库版本兼容性 确保所有使用的第三方库都是最新稳定版,并且相互之间不存在冲突。特别是针对近期曝出的安全漏洞如Log4Shell,应及时更新受影响组件至安全版本以防止未知风险影响正常运行环境[^2]。 #### 3. 调试模式启动应用 启用调试选项可以让开发者更清晰地看到内部执行流程中的每一步操作及其返回状态码等细节数据。这有助于快速锁定性能瓶颈所在之处以及是否存在死循环等问题导致进程停滞现象。 ```bash php -d display_errors=On ctf_autoload.php ``` 上述命令将以显示PHP脚本运行期间产生的任何致命错误的方式启动目标文件,在此基础上进一步收集线索用于后续修复工作。 #### 4. 性能监控工具辅助检测 利用专业的性能监测软件可以帮助识别资源消耗过高或响应时间过长的服务端口/线程;同时也可以捕获内存泄漏迹象以便及时处理优化代码逻辑结构提高效率减少不必要的等待延迟状况的发生概率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值