php 获取数据慢的脚本一例

背景:
今天遇到一例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代表将记录写入这个文件

脚本运行截图

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

tcpdump -i eth0(内网网卡) host  r-******.redis.rds.aliyuncs.com and port 6379 -w 1.cap
时间: 2024-10-01 11:45:02

php 获取数据慢的脚本一例的相关文章

通过编程方式在InfoPath 2010表单的下拉框修改事件中获取数据

一个简单的例子,包括一段简短的代码,在InfoPath 2010表单中下拉框的修 改事件里从一个数据源获取数据. 表单 样例表单本身很简单,只有两个控件,如下图所示: 在mydropdown下拉框属性中,添加几个值,为将要获取的SharePoint列表中 已有的几个列表项的ID.

以用户名注册为例分析三种Action获取数据的方式_java

1.注入属性 直接注入属性: public String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String execute() throws Exception { // TODO Auto-generated method stub Use

java 结合jQuery实现跨域名获取数据的方法_java

一.什么是跨域? 由于浏览器出于安全的考虑,采取了同源策略的限制,使得jQuery无法直接跨域名互相操作对象或数据.例如:a.com 域名下的 a.html页面利用jQuery无法操作b.com 域名下b.html页面的对象或是数据, 并且默认情况下也不能操作test.a.com域名下的 test.html的 对象或是数据 .只要满足下面条件的jQuery都会视为跨域名: 1.主域相同,子域不同,如xxx.aaa.com和yyy.aaa.com 2.域名相同,端口不同,如xxx.aaa.com:

Ajax 通过城市名获取数据(全国天气预报API)

预览图(比较简单粗糙) 聚合数据全国天气预报接口:https://www.juhe.cn/docs/api/id/39 接口地址:http://v.juhe.cn/weather/index 支持格式:json/xml 请求方式:get 请求示例:http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY 调用样例及调试工具:API测试工具 请求参数说明: 名称 类型 必填 说明 cityn

用Excel获取数据——不仅仅只是打开表格

引言:看到标题,你是否有些困惑?在Excel上具备数据获取的能力是指什么?难道不是把csv格式的表格和Excel格式的表格打开就好了吗?然而并非这样. 本文选自<数据化运营速成手册>. 其实标题中有两层意思:第一层意思是在一些数据库管理不那么严格的中小型企业,可以通过Excel中的ODBC数据接口,与数据库或者数据仓库建立连接,直接快速取数,提高工作效率:第二层意思是Excel 2016中有相当强大的数据获取工具,即便不能从数据库直接获取,也能从多个本地的数据表中将数据抽取.整理和转化,并做到

巧用COLUMNS_UPDATED获取数据变更

title: 巧用COLUMNS_UPDATED获取数据变更 author: 风移 业务场景 在平时与数据库打交道的过程中,我们经常会有这样的疑惑:如何快速的获取数据变更记录呢?举个例子,搜索引擎要为外部客人提供快速准确的商品信息搜索功能,那么当有新的商品数据变更后,搜索引擎如何快速的发现这些新的变更数据呢?我们常见的两种做法: 全量更新 这种方法最为简单直接,反正不管三七二十一,搜索引擎每次全量拉取商品信息表所有数据,然后创建搜索索引,提供给外部客人查询.这种方法实现起来的确最为简单,当然同时

MSSQL · 最佳实战 · 巧用COLUMNS_UPDATED获取数据变更

业务场景 在平时与数据库打交道的过程中,我们经常会有这样的疑惑:如何快速的获取数据变更记录呢?举个例子,搜索引擎要为外部客人提供快速准确的商品信息搜索功能,那么当有新的商品数据变更后,搜索引擎如何快速的发现这些新的变更数据呢?我们常见的两种做法: 全量更新 这种方法最为简单直接,反正不管三七二十一,搜索引擎每次全量拉取商品信息表所有数据,然后创建搜索索引,提供给外部客人查询.这种方法实现起来的确最为简单,当然同时也具有非常明显的缺点: 浪费资源: 假如商品的变更频率为20%,那么剩下的80%商品

《R语言数据分析》——第2章 从Web获取数据 2.1 从Internet导入数据集

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.1节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 第2章 从Web获取数据 实际项目中,经常会碰见所需数据不能从本地数据库或硬盘中获取而需要通过Internet获得的情况.此时,可以要求公司的IT部门或数据工程师按照下图所示的流程将原有的数据仓库扩展,从网络获取处理所需要的数据再倒入公司自己的数据库: 如果公司还没有建立ETL系统(抽取.转换装

《R语言数据分析》——2.4 从其他在线来源获取数据

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.4节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 2.4 从其他在线来源获取数据 尽管readHTMLTable非常实用,但某些时候数据不是以结构化格式存放在表格中,更可能就是以HTML表形式存储.我们首先访问http://cran.r-project.org/web/views/WebTechnologies.html 来了解一下R包在相应的