在看公司的代码框架底层时,发现了一个问题,如下:

代码中调用接口时,使用的是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资源的更多相关文章

  1. tips 前端 阻止 浏览器缓存静态资源

    手机浏览器 uc上一直表现良好 qq浏览器还有微信上网址直接打开的(一样采用qq浏览器的内核) 大量缓存了静态资源 css js 图片 等这些当出现改动了刷新网页根本没有效果 电脑端浏览器没有问题 因 ...

  2. nginx缓存静态资源,只需几个配置提升10倍页面加载速度

    nginx缓存静态资源,只需几个配置提升10倍页面加载速度 首先我们看图说话 这是在没有缓存的情况下,这个页面发送了很多静态资源的请求:   1.png 可以看到,静态资源占用了整个页面加载用时的90 ...

  3. tomcat缓存静态资源深入

    之前看过apach及nginx对于静态资源(含js,图片,css等)部分的缓存,用于加速并减轻后台实际web服务器的压力. 静态资源缓存是WEB服务器优化的一种手段,基本原理如下: 1.客户端浏览器请 ...

  4. ASP.NET Core缓存静态资源

    背景 缓存样式表,JavaScript或图像文件等静态资源可以提高您网站的性能.在客户端,总是从缓存中加载一个静态文件,这样可以减少对服务器的请求数量,从而减少获取页面及其资源的时间.在服务器端,由于 ...

  5. Nginx的静态资源缓存以及压缩

    Nginx是一款轻量级的网页服务器.反向代理器以及电子邮件代理服务器.Nginx采用的是异步非阻塞的通信机制(epoll模型),支持更大的并发连接.所谓的epoll模型:当事件没有准备好时,就放入ep ...

  6. web性能优化之--合理使用http缓存和localStorage做资源缓存

    一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...

  7. 理解WebKit和Chromium:Chromium资源磁盘缓存

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 想象一下,如果没有磁盘缓存的世界.当用户访问网页的时候,每次浏览器都需要从网站下载网页,图片,JS等资源 ...

  8. SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)

    昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载 ...

  9. nginx静态资源缓存与压缩

    一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c> <Files ...

随机推荐

  1. 基于jq图片居中插件 [center]

    最近在做一个项目,大量的图片基于js进行缩放(图片放大镜),考虑用css要写许多hack,而已经基于jq了,干脆写个方法得了. 代码很简单,不用多讲但是很实用. $.fn.extend({ cente ...

  2. jQuery 鼠标滑过及选中一行效果

    /******* 表格效果 ********/ $("#gird_tbl tbody tr").live('mouseover', function () { $(this).ad ...

  3. Android开源项目(转载)

    第一部分 界面 ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView an ...

  4. SQL Server与Oracle中的隔离级别

    在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted.Read Committed.Read Repeatable.Serializable 其中Read Uncommi ...

  5. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)

    MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...

  6. SQLSERVER 中GO的作用详解

    具体不废话了,请看下文详解. ? 1 2 3 4 5 6 7 8 9 10 use db_CSharp go  select *,  备注=case  when Grade>=90 then ' ...

  7. Python3.x和Python2.x的区别-转

    这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和 ...

  8. Oracle 直接路径读

    在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct pa ...

  9. error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

    ]$ sudo yum install libnotify*Loaded plugins: fastestmirror, refresh-packagekit, securitySetting up ...

  10. Candies(差分约束)

    http://poj.org/problem?id=3159 题意: flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发,在班上,flymouse和snoo ...