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

代码中调用接口时,使用的是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. js Dom树结构分析

    对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的) <!DOC ...

  2. ACM hdu 1019 Least Common Multiple

    Problem Description The least common multiple (LCM) of a set of positive integers is the smallest po ...

  3. php中如何实现网上商城用户历史浏览记录的代码

    /如是COOKIE 里面不为空,则往里面增加一个商品ID if (!empty($_COOKIE['SHOP']['history'])){ //取得COOKIE里面的值,并用逗号把它切割成一个数组 ...

  4. 使用jQuery验证用户名是否存在,达到局部刷新的效果

    <%@ page pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  5. 浅谈ListBox控件,将对象封装在listBox中,在ListBox中显示对象中某个属性,在ListBox中移除和移动信息

    大家好,俗称万事开头难,不经历风雨,怎能见彩虹.在此小编给大家带来一个自己练习的小实例,希望与大家一起分享与交流.下面进入应用场景,从SQL2008数据库取出数据,给ListBox赋值在界面并显示出来 ...

  6. div section article aside的理解

    div 是一个大的容器 内部可以包含header main nav aside footer等标签 没有语义,多用于为脚本添加样式 section的语义比div语义强些,用于主题性比较强的内容,比如一 ...

  7. 基于python做的抓图程序1.0.00版本

    #coding=gbkimport urllibimport urllib2import reimport osimport time# import readline def getHtml(url ...

  8. mongoengine教程1

    mongoengine安装过程,建议先安装好pip,pip是不Python不错的安装包管理器,安装命令:pip install mongoengine. mongoengine是mongodb的pyt ...

  9. android 代码混淆及问题大集锦

    最近在需要对所开发的项目进行了代码混淆,在android studio中开启代码混淆其实还是挺方便的,不过因为代码混淆产生的问题非常多,特别是对于一些涉及到反射的第三方库经常因为名称的变化导致无法使用 ...

  10. 简单易懂, JUnit 框架问答

    本文算是一个关于Junit4相关的知识分享,但是不同于网上大段的源码分析,模式学习文章,我想通过问答的形式,引出代码来简明阐述JUnit4是如何实现需要的功能的. 考虑到任何一个框架,都是为了解决问题 ...