php 获取数据慢的脚本一例

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: php连接redis获取value时间波动的问题,在几百毫秒到几秒钟不等

背景:

  今天遇到一例php连接redis获取value时间波动的问题,在几百毫秒到几秒钟不等,对于使用了redis来说这个时间确实比较久

排查:

1,检查redis各项监控项没有明显的异常(qps,吞吐量,cpu)
2,检查ecs自身的负载,内网带宽是否存在突发的情况(一般类比其他时间段的流量峰值看看能高出多少)
3,长ping测试网络是否有波动

php输出毫秒级时间尝试获取慢在哪里?

<?php

$host = "*****.redis.rds.aliyuncs.com";
$port = 6379;
$user = "*****";
$pwd = "*****";
$redis = new Redis();
list($s1, $s2) = explode(' ', microtime());
echo "Start_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
if ($redis->connect($host, $port) == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Conn_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
if ($redis->auth($pwd) == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Auth_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
if ($redis->set("foo", "bar") == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Set_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
$value = $redis->get("foo");
list($s1, $s2) = explode(' ', microtime());
echo "Get_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
echo "The keys value is:".$value."\n";

?>

脚本大意:
参数设置相关:

$host = "*****.redis.rds.aliyuncs.com";
$port = 6379;
$user = "*****";
$pwd = "*****";
$redis = new Redis();

输出第一个执行时间(Start_time:脚本开始时间,前面的变量设置这里不计了)

list($s1, $s2) = explode(' ', microtime());
echo "Start_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";

输出第二个执行时间(Conn_time:第二个可以理解为连接时间,如果dns解析慢,或者tcp三次握手建联慢,都会体现在这里)

if ($redis->connect($host, $port) == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Conn_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";

输出第三个执行时间(Auth_time:密码验证的时间消耗)

if ($redis->auth($pwd) == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Auth_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";

输出第四个执行时间(Set_time:set一个key value的时间)

if ($redis->set("foo", "bar") == false) {
    die($redis->getLastError());
}
list($s1, $s2) = explode(' ', microtime());
echo "Set_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";

输出第五个执行时间(Get_time:这个时间用来计算get前面设置的key的时间,脚本最后输出对应的key)

$value = $redis->get("foo");
list($s1, $s2) = explode(' ', microtime());
echo "Get_time:" . date("Y-m-d H:i:s", $s2) . "." . (float) sprintf('%.0f', $s1 * 1000) . "\n";
echo "The keys value is:".$value."\n";

循环运行这个脚本

for i in {1..500};do php ali-redis-test.php;sleep 1s;done >>time.txt

这个是linux命令行直接运行的,运行500次这个php脚本,每次间隔1秒钟,>>time.txt代表将记录写入这个文件

脚本运行截图
image
配合抓包工具进行抓包,基本可以定位到慢在哪个环节,然后具体问题再具体分析

tcpdump -i eth0(内网网卡) host  r-******.redis.rds.aliyuncs.com and port 6379 -w 1.cap
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
JSON PHP 数据格式
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
3月前
|
存储 关系型数据库 MySQL
PHP 如何使用 Excel 处理数据
【1月更文挑战第1天】PHP 如何使用 Excel 处理数据
41 1
|
6月前
|
小程序 前端开发 PHP
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
|
1月前
|
监控 前端开发 安全
PHP脚本:实现实时监控电脑屏幕并生成网页截图
在当今数字化时代,实时监控和数据收集变得越来越重要。有时候,我们需要监视某些活动,例如员工的工作情况、儿童的网络活动等等。在这篇文章中,我们将探讨如何使用PHP脚本实现实时监控电脑屏幕,并将监控到的数据自动提交到网站。
109 2
|
2月前
|
网络安全 PHP Python
【网络安全 | MD5截断比较】PHP、Python脚本利用
【网络安全 | MD5截断比较】PHP、Python脚本利用
25 0
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)