文档章节

PHP7 的curl中大量的CLOSE_WAIT

zhangzhihai
 zhangzhihai
发布于 2017/05/19 11:00
字数 318
阅读 85
收藏 0
<?php
$url = $argv[1];
$mm = array();
function curl($url) {
	global $mm;
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	#curl_setopt($ch, CURLOPT_HTTPHEADER, array("Connection: close"));
	curl_exec($ch);
	$mm[] = $ch;
	curl_close($ch);
}
for($i = 0; $i < 1000; $i ++) {
	curl($url);
}

对于curl来说:

netstat -an|grep CLOSE_WAIT

  1. 如果请求头中含有 Connection: close 则,执行完请求之后,curl会主动关闭连接,即使不主动curl_close() 也没有关系
  2. 如果请求头中没有Connection: close,则:
    1. 如果curl句柄被销毁了,则连接自动关闭
    2. 如果句柄没有被销毁(如: 被保存到了全局(或其他静态)变量中),则:
      1. PHP5中,curl_close() 可以关闭连接
      2. PHP7中,curl_close() 不会关闭连接(或许他猜测你可能还会用到),如果你不小心把句柄保存起来了,那么会有什么问题呢? 问题:
        服务器端等待足够长时间后要关闭连接,而客户端却不做任何处理,导致连接处于CLOSE_WAIT状态,如果足够多,会导致local port被用完。
        不过,这个问题看似不好解决,也比PHP5中好处理,PHP5中如果调用了curl_close,而且还把curl句柄保存了起来,则可能会出现保存了大量的句柄而自己却不知道(就是所谓的内存泄漏)

本文转载自:https://phpor.net/blog/post/4326?utm_source=tuicool&utm_medium=referral

共有 人打赏支持
zhangzhihai
粉丝 2
博文 18
码字总数 2207
作品 0
浦东
高级程序员
私信 提问
利用PHP原生函数并行多线程处理(请求)网络数据

最近在项目中碰到的一个问题,需要大量请求同一个第三方接口达到发送消息的目的。我们一般会想到的是利用curl循环依次请求接口,没错,当请求量较少的时候,完全能应付。倘若一旦请求量增大,...

wushannn
2018/05/08
0
0
TIME_WAIT和CLOSE_WAIT

对于保持大量TIMEWAIT或 CLOSEWAIT状态解决办法。 服务器命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 显示信息: TIME_WAIT 108 CLOSE_WAIT 1021 ESTABL......

天冰
2016/02/24
190
0
linux服务器大量TIME_WAIT状态问题

上篇:问题与理论 最近遇到一个线上报警:服务器出现大量TIMEWAIT导致其无法与下游模块建立新HTTP连接,在解决过程中,通过查阅经典教材和技术文章,加深了对TCP网络问题的理解。作为笔记,记...

zhangyujsj
2016/10/12
231
0
TIME_WAIT和CLOSE_WAIT状态区别

在服务器的日常维护过程中,会经常用到下面的命令: 它会显示例如下面的信息: TIMEWAIT 814 CLOSEWAIT 1 FINWAIT1 1 ESTABLISHED 634 SYNRECV 2 LAST_ACK 1 常用的三个状态是:ESTABLISHED...

InnocenceYWQ
2018/10/11
0
0
linux的apache2.4限定某个目录禁止解析PHP及user_agent与PHP相关配置

限定某个目录禁止解析PHP > 对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如服务器可以上传图片,并且没有做防盗链,所以就会被人家当成了一个图片存储服务器,并且盗用带宽...

Gary_加油涛
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx 找不到pid文件原因及解决办法

2.var/run/nginx.pid文件 首先 var/run这个目录是干嘛用的? 此文件夹包含描述系统启动以来系统信息的数据。此文件夹下的文件必须在启动过程初期清除(删除或归零)。程序可以在/var/run下有...

李佳顺
34分钟前
2
0
【scala】2.控制结构和函数

简介 在Java或者C++中,我们把表达式和语句看做两种不同的东西。表达式有值,而语句执行动作。 在Scala中,几乎所有构造出来的语法结构都是有值的。这个特性使得程序更加的精简,也更易读。 ...

Areya
38分钟前
0
0
Java中的并发工具类(CountDownLatch、CyclicBarrie、Exchanger)

在JDK的并发包里提供了很多有意思的并发工具类。CountDownLatch、CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线程间交换数据的一种手段。 1....

孟飞阳
42分钟前
0
0
Docker之推送镜像到Harbor

安装Harbor之类的在这里就不讲了,请看我的这篇博客 1、在Harbor上创建用户 如下图1.1所示,"Users"->"NEW USER",之后会弹出一个输入框,输入用户名、密码之类的,这个后面会用到 图1.1 2...

克虏伯
今天
0
0
JVM-----java内存区域与java内存模型

一.java内存区域 jvm在执行java程序的过程中会把所管理的内存分为若干不同的区域,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁的。 以下是java运...

Carol998
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部