什么要缓存curl资源
在看公司的代码框架底层时,发现了一个问题,如下:
代码中调用接口时,使用的是curl,框架将curl资源以IP :端口的形式缓存了下来,例如:
10.10.10.10:80 curl1
10.10.10.10:8080 curl2
有点不太理解原因,所以作了两个实验,过程如下:
实验一:两个curl请求相同域名下的不同接口
实验二:一个curl请求相同域名下的不同接口
//两个curl请求相同域名的不同接口
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
$r = curl_exec($ch); $ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/img/bdlogo.gif");
curl_setopt($ch1, CURLOPT_HEADER, 0);
$r1 = curl_exec($ch1);
用strace跟踪系统调用,然后过滤里面有用的信息,命令如下:
strace php cron_test.php 1 >b 2>a
egrep "(fcntl|socket|sendto|connect|recvfrom)" a
结果如下:
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("61.135.169.125")}, 16) = -1 EINPROGRESS (Operation now in progress)
sendto(3, "GET / HTTP/1.1\r\nHost: www.baidu."..., 52, MSG_NOSIGNAL, NULL, 0) = 52
recvfrom(3, "HTTP/1.1 200 OK\r\nDate: Fri, 15 N"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 1990
recvfrom(3, "round-image:url(http://s1.bdstat"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 2896
recvfrom(3, "www.baidu.com%2F\" target=\"_blank"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 1448
recvfrom(3, "http://baike.baidu.com\">\347\231\276\347\247\221</"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 1448
recvfrom(3, "sp;<a onmousedown=\"return ns_c({"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 2896
recvfrom(3, "1&ie=utf-8&s=s'],'tj_baike': ['w"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 1792
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4
fcntl(4, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("61.135.169.125")}, 16) = -1 EINPROGRESS (Operation now in progress)
sendto(4, "GET /img/bdlogo.gif HTTP/1.1\r\nHo"..., 66, MSG_NOSIGNAL, NULL, 0) = 66
recvfrom(4, "HTTP/1.1 200 OK\r\nDate: Fri, 15 N"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 2080
//一个curl请求相同域名下的两个接口
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
$r1 = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/img/bdlogo.gif");
$r2 = curl_exec($ch);
用strace跟踪系统调用,然后过滤里面有用的信息,命令如下:
strace php cron_test.php 1 >b 2>a
egrep "(fcntl|socket|sendto|connect|recvfrom)" a
结果如下:
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("61.135.169.105")}, 16) = -1 EINPROGRESS (Operation now in progress)
sendto(3, "GET / HTTP/1.1\r\nHost: www.baidu."..., 52, MSG_NOSIGNAL, NULL, 0) = 52
recvfrom(3, "HTTP/1.1 200 OK\r\nDate: Fri, 15 N"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 618
sendto(3, "GET /img/bdlogo.gif HTTP/1.1\r\nHo"..., 66, MSG_NOSIGNAL, NULL, 0) = 66
recvfrom(3, "HTTP/1.1 200 OK\r\nDate: Fri, 15 N"..., 16384, MSG_NOSIGNAL, NULL, NULL) = 2080
以上代码中,红色部分为两个实验的区别
可以看出,请求两个相同域名的接口时,用两个curl时,建立了两次连接,而用一个curl时,共用了一次连接
缓存curl可以节省一次网络连接
这就是为什么要缓存curl资源的原因。
什么要缓存curl资源的更多相关文章
- tips 前端 阻止 浏览器缓存静态资源
手机浏览器 uc上一直表现良好 qq浏览器还有微信上网址直接打开的(一样采用qq浏览器的内核) 大量缓存了静态资源 css js 图片 等这些当出现改动了刷新网页根本没有效果 电脑端浏览器没有问题 因 ...
- nginx缓存静态资源,只需几个配置提升10倍页面加载速度
nginx缓存静态资源,只需几个配置提升10倍页面加载速度 首先我们看图说话 这是在没有缓存的情况下,这个页面发送了很多静态资源的请求: 1.png 可以看到,静态资源占用了整个页面加载用时的90 ...
- tomcat缓存静态资源深入
之前看过apach及nginx对于静态资源(含js,图片,css等)部分的缓存,用于加速并减轻后台实际web服务器的压力. 静态资源缓存是WEB服务器优化的一种手段,基本原理如下: 1.客户端浏览器请 ...
- ASP.NET Core缓存静态资源
背景 缓存样式表,JavaScript或图像文件等静态资源可以提高您网站的性能.在客户端,总是从缓存中加载一个静态文件,这样可以减少对服务器的请求数量,从而减少获取页面及其资源的时间.在服务器端,由于 ...
- Nginx的静态资源缓存以及压缩
Nginx是一款轻量级的网页服务器.反向代理器以及电子邮件代理服务器.Nginx采用的是异步非阻塞的通信机制(epoll模型),支持更大的并发连接.所谓的epoll模型:当事件没有准备好时,就放入ep ...
- web性能优化之--合理使用http缓存和localStorage做资源缓存
一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...
- 理解WebKit和Chromium:Chromium资源磁盘缓存
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 想象一下,如果没有磁盘缓存的世界.当用户访问网页的时候,每次浏览器都需要从网站下载网页,图片,JS等资源 ...
- SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)
昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载 ...
- nginx静态资源缓存与压缩
一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c> <Files ...
随机推荐
- JS控制文字一个一个出现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 将数字n转换为字符串并保存到s中
将数字n转换为字符串并保存到s中 参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各 ...
- 校省选赛第一场D题TwoDecks题解
今天晚上第二场比赛,现在还是赛后刷上次的题目,越刷越伤心,发现我赛后一次AC的功力很强大啊!!!(希望今晚变成是赛中一次AC啊!!) 好啦,回归正题. 看题目 D. Merging Two Decks ...
- wordpress4.0.1源码学习和摘录--项目设置
1.静态变量日期 define( 'MINUTE_IN_SECONDS', 60 ); define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); def ...
- Jquery 和 Js
jQuery [一] jQuery 1: javaScript和 javaScript库: (1) javaScript自身存在的3个弊端:复杂的文档对象模型(DOM),不 ...
- MyEclipse使用经验总结
0.快捷键 ================================================================================ 编辑: Ctrl+Shif ...
- yarn源代码
Modules-------YARN consists of multiple modules. The modules are listed below as per the directory s ...
- python中跟字符串相关的一些操作
公司让用python自动生成代码,以前没看过python.所以匆匆的看了两天python就连猜带蒙就上马开干了..因此好多操作可能看的时候看懂了,用的时候知道有这么个东西,具体用法就忘记了..用到了就 ...
- APCS
arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途.所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中 ...
- iOS 开发常用的一些工具
http://www.itjhwd.com/ios-tool/ 通用工具 HomeBrew:OS X上非常出色的包管理工具. 源码控制 Git:分布式版本控制系统和源码管理系统,其优点是:快和简单易用 ...