⑴ 服务暂时不可用.请稍后再试.
可能是服务器忙或者是连接超时,重新试一下
⑵ 请教一下 php 如何测试SMTP端口是否能正常连通
<?php
/**需要扩展模块extension=php_sockets.dll
*Filenameserver.php
*服务器端代码
*
*@authorguisu.huang
*@since2012-04-11
*
*/
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address="127.0.0.1";
$port=2046;//调试的时候,可以多换端口来测试程序!
/**
*创建一个SOCKET
*AF_INET=是ipv4如果用ipv6,则参数为AF_INET6
*SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("socket_create()失败的原因是:".socket_strerror(socket_last_error())."/n");
//阻塞模式
socket_set_block($sock)ordie("socket_set_block()失败的原因是:".socket_strerror(socket_last_error())."/n");
//绑定到socket端口
$result=socket_bind($sock,$address,$port)ordie("socket_bind()失败的原因是:".socket_strerror(socket_last_error())."/n");
//开始监听
$result=socket_listen($sock,4)ordie("socket_listen()失败的原因是:".socket_strerror(socket_last_error())."/n");
echo"OK Bindingthesocketon$address:$port...";
echo"OK Nowreadytoacceptconnections. Listeningonthesocket... ";
do{//neverstopthedaemon
//它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
$msgsock=socket_accept($sock)ordie("socket_accept()failed:reason:".socket_strerror(socket_last_error())."/n");
//读取客户端数据
echo"Readclientdata ";
//socket_read函数会一直读取客户端数据,直到遇见 , 或者 字符.PHP脚本把这写字符看做是输入的结束符.
$buf=socket_read($msgsock,8192);
echo"Receivedmsg:$buf ";
//数据传送向客户端写入返回结果
$msg="welcome ";
socket_write($msgsock,$msg,strlen($msg))ordie("socket_write()failed:reason:".socket_strerror(socket_last_error())."/n");
//一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止
socket_close($msgsock);
}while(true);
socket_close($sock);
⑶ tcp的连接数量受synqueue限制吗
tcp的连接数量受synqueue限制吗:
在实际工作中经常碰到一种情况,流量上涨的时候,服务端会出现大量的超时。此时的处理办法一般是扩容。
实际上就算没有流量上涨,当某个接口速度变慢时,调用该接口的服务也会出现超时。
不管是流量上涨(qps增加)还是接口变慢,导致超时的直接原因都是系统吞吐量不足(系统吞吐量 = qps / 响应时间)。
当系统吞吐量不足时,大量请求就会在接口上堆积得不到及时的处理,表现出来就是连接超时或接口超时。
TCP半连接队列和全连接队列
创建tcp连接时需要三次握手。
首先客户端向服务端发送一个连接请求,包含一个SYN包,客户端进入SYN_SEND状态。
服务端收到客户端的请求后将返回一个SYN+ACK,此时服务端进入SYN_RECV状态。服务端内核会将该连接存储到半连接队列(SYN队列)。
客户端收到服务端的确认后,发送一个ACK包,此时客户端进入ESTABLISHED状态。
服务端收到客户端发来的ACK包之后,进入ESTABLISHED状态,并将半连接队列中的连接取出来放到全连接队列里(ACCEPT队列)。等待进程调用accept函数时将连接取出来。
整体流程如下图所示:
不管是半连接队列(syn queue)还是全连接队列(accept queue),都是有长度限制的,超过长度限制时,内核会直接丢弃或者返回RST包。
查看全连接队列
可以使用ss(比netstat更快)命令查看tcp全连接队列的情况。
# -l 显示处于listen状态的socket
# -n 不解析服务名称
# -t 只显示tcp socket
ss -lnt
1
2
3
4
1
2
3
4
结果如下:
其中,Recv-Q表示全连接队列的大小,也就是已完成三次握手并等待服务端accept()的tcp连接个数。Send-Q表示全连接最大队列长度,默认是128。
注意在非Listen状态下(不使用-l参数),Recv-Q/Send-Q表示的含义是不同的。
其中Recv-Q表示已收到但未被应用进程读取的字节数。Send-Q表示已发送到未收到确认的字节数。
打开CSDN APP,看更多技术内容
TCP 全连接队列满了会发生什么?又该如何应对?_YY小记的博客_t...
如果服务器上的进程只是短暂的繁忙造成 accept 队列满,那么当 TCP 全连接队列有空位时,再次接收到的请求报文由于含有 ACK,仍然会触发服务器端成功建立连接。 所以,tcp_abort_on_overflow 设为 0 可以提高连接建立的成功率,只有你非常肯...
继续访问
最大TCP连接数量问题总结_星期二的风的博客_tcp连接数
TCP连接数过大可能会出现: ERROR: out of memory ,即内存溢出。 原因:每个TCP连接本身,以及这个连接所用到的缓冲区,都是需要占用一定内存的,现在内存已经被占满了,不够用了就会报这个错。 5、CPU的限制 每个TCP连接都是需要占用CPU...
继续访问
服务器远程超出最大连接数的原因及解决
服务器远程超出最大连接数的原因是没有注销退出有可能导致远程连接的进程死掉,重启服务器即可
热门推荐 解决TCP连接数过多的问题
1、建立连接协议(三次握手) (1)客户 端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。 (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标 志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯。 (3) 客户必须再次回应服务段一个ACK报文,这是报文段3。 2、连接终止
继续访问
记一次线上环境tcp链接爆满导致服务响应慢的问题_徐波_bobch的博客...
记一次线上环境tcp链接爆满导致服务响应慢的问题 事件还原: 20200407凌晨接到运维人员电话,说app启动充电响应很慢,无法正常的开启充电; 20200407凌晨,跟踪日志排查服务负载情况,但是过了一段时间自动恢复; ...
继续访问
服务器tcp连接占满_服务器出现大量TIME_WAIT解决方案
一 、故障原因: 服务器突然出现大量time_wait(因为大量连接资源被占用后不释放的话,会导致网站正常访问不能响应)。如何应对?我这边先检查了监控和服务器当前的状态(time_wait连接确实异常):1、监控2、登录服务器检查二、排查思路:1、猜测是否因为程序打开大量文件句柄,没有关闭导致。(问了研发同事,排查过后没有这种情况)2、调大当前文件句柄 3、调优sysctl.conf文件4、检查n...
继续访问
性能分析之压测中 TCP 全连接队列占满问题分析及优化案例
文章目录一、前言二、知识预备三、压测及分析过程1、第一次压测2、调大 backlog 值为 5000 后,再次压测3、调整日志级别为 ERROR,再次压测四、小结 一、前言 在对一个挡板系统进行测试时,遇到一个由于 TCP 全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 二、知识预备 理解下 TCP 建立连接过程与队列: 从图中明显可以看出建立 TCP 连接的时候,有两个队列:syns queue(半连接队列)和accept queue(全连接队列),分别在第一次握手和第三次握手。
继续访问
TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析
在进行client不断的对server端进行connect的过程中发现下面这个状态,而且循环6w次的链接只进行了2W多次就出错了。 于是去查找了下原因: linux内核协议栈为一个tcp连接管理使用两个队列,一个是半链接队列(用来保存处于SYN_SENT和SYN_RECV状态的请求),一个是全连接队列(accpetd队列)(用来保存处
继续访问
最大TCP连接数量问题总结
TCP连接限制问题总结最大TCP连接数量问题总结1、可用端口号限制2、文件描述符限制3、线程的限制4、内存的限制5、CPU的限制总结参考文献: 最大TCP连接数量问题总结 直接上答案 最大TCP连接数量限制有:可用端口号数量、文件描述符数量、线程、内存、CPU 1、可用端口号限制 Q:一台主机可以有多少端口号?端口号与TCP连接?是否能修改?端口号限制因素? 第一:端口号是16位的,所以总共有65535个,即可创建65535个TCP连接 第二:端口分为知名端口(0~1023)、注册端口(1024~4951
继续访问
关于TCP连接的一些细节问题
Q: 半连接队列与全连接队列 A: 半连接队列:由tcp_max_syn_backlog决定,开户syncookies时,没有上限 全连接队列:由somaxconn(系统级)与backlog(listen函数参数)共同决定,取两者中的较小值 Q: 半连接队列满了如何处理? A: 丢弃请求 Q: 全连接队列满了如何处理? tcp_abort_on_overflow==1 发送reset包 tcp_abort_on_overflow==0 过一段时间重发syn ack包(次数由tcp_synack_ret
继续访问
linux下tcp服务器并发连接数限制
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的
继续访问
linux syn 队列,TCP SYN队列与Accept队列详解
李乐尽信书,不如无书。纸上得来终觉浅,绝知此事要躬行。实验现象依赖于系统(如下)以及内核参数(附录);一切以实验结果为准。cat /proc/versionLinux version 3.10.0-693.el7.x86_64引子线上服务(Golang)调用内网API服务(经由内网网关/Nginx转发)时,偶尔会出现"connection reset by peer"报警;为此梳理TCP RST包...
继续访问
最新发布 计算机网络之TCP最大连接限制
计算机网络之TCP最大连接限制
继续访问
TCP半连接队列要是满了会怎么样?
一般是丢弃,但这个行为可以通过tcp_syncookies参数去控制。但比起这个,更重要的是先了解下半连接队列为什么会被打满。 首先我们需要明白,一般情况下,半连接的"生存"时间其实很短,只有在第一次和第三次握手间,如果半连接都满了,说明服务端疯狂收到第一次握手请求,如果是线上游戏应用,能有这么多请求进来,那说明你可能要富了。但现实往往比较骨感,你可能遇到了SYN Flood攻击。 所谓SYN Flood攻击,可以简单理解为,攻击方模拟客户端疯狂发第一次握手请求过来,在服务端憨憨地回复第二次握手过去..
继续访问
TCP 全连接队列满了会发生什么?又该如何应对?
什么是 TCP 半连接队列和全连接队列? .半连接队列,也称 SYN 队列; .全连接队列,也称 accepet 队列; 服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调用 accept 函数时把连接取出来。 不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回
继续访问
tcp连接大量time_wait
time_wait过多的后果 http://blog.51cto.com/benpaozhe/1767612 tcp基础:http://blog.sciencenet.cn/blog-1225851-830338.html 连接不上的问题:http://www.cnxct.com/something-about-phpfpm-s-backlog/ http://maoyi.iteye.
继续访问
TCP accept返回的socket,服务端TCP连接数限制
http://www.cppblog.com/aa19870406/archive/2012/07/15/183595.html socket accept()返回的socket描述符的端口和listen描述符端口是一样的吗? as you know,一个socket是由一个五元组来唯一标示的,即(协议,server_ip, server_port, client_ip, client
继续访问
syn重发_TCP 网络传输协议中的全队列和半队列说明和半连接队列的SYN洪水攻击 | IT工程师的生活足迹...
一、TCP 维护队列TCP协议在数据传输过程中会维护两个队列:半连接队列(SYN queue)和全连接队列(accept queue)。1.1、半连接队列(SYN Queue)服务器端监听TCP端口后,会创建一个request_sock结构,用于存储半连接队列。在TCP三次握手中,当服务器接受到客户端的SYN包后,就将此连接保存到SYN Queue中,并向客户端发送SYN-ACK包;等待客户端发送...
继续访问
linux tcp连接满了,[TimLinux] TCP全连接队列满
0. TCP三次握手syns queue: 半连接队列accept queue: 全连接队列控制参数存放在文件:/proc/sys/net/ipv4/tcp_abort_on_overflow中,0:表示如果三次握手第三步的时候全连接队列满了,那么server扔掉client发过来的ack(在server端因为全连接队列满了,认为连接还没有建立起来),1:表示第三步的时候如果全连接队列满了,ser...
继续访问
TCP全链接队列满的问题分析之net.core.somaxconn详解
背景参考:TCP全链接队列满的问题分析之net.core.somaxconn详解_运维_PHP面试网 最近控制台查看腾讯云服务器状态时,发现一个异常情况提示如下: 该实例最近12小时内在2022-01-18 14:48出现过TCP全链接队列满的情况,为避免成为业务瓶颈,建议您检查业务健康情况。可参考文档:点击查看 TCP 全连接队列满 TCP 全连接队列的长度取net.core.somaxconn及业务进程调用 listen 时传入的 backlog 参数,两者中的较小值。若您的实..
继续访
⑷ 几种常见的PHP超时处理方法
【Web服务器超时处理】
[ Apache ]
一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时操作。
目前apachefastcgiphp-fpm模式下有三个超时设置:
fastcgi超时设置:
修改的fastcgi连接配置,类似如下:
复制代码 代码如下:
<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>
缺省配置是30s,如果需要定制自己的配置,需要修改配置,比如修改为100秒:(修改后重启apache):
复制代码 代码如下:
<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>
如果超时会返回500错误,断开跟后端php服务的连接,同时记录一条apache错误日志:
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
其他fastcgi配置参数说明:
复制代码 代码如下:
IdleTimeout发呆时限
ProcessLifeTime一个进程的最长生命周期,过期之后无条件kill
MaxProcessCount最大进程个数
DefaultMinClassProcessCount每个程序启动的最小进程个数
DefaultMaxClassProcessCount每个程序启动的最大进程个数
IPCConnectTimeout程序响应超时时间
IPCCommTimeout与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
MaxRequestsPerProcess每个进程最多完成处理个数,达成后自杀
[ Lighttpd ]
配置:lig
Lighttpd配置中,关于超时的参数有如下几个(篇幅考虑,只写读超时,写超时参数同理):
主要涉及选项:
server.max-keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360
复制代码 代码如下:
#每次keep-alive的最大请求数,默认值是16
server.max-keep-alive-requests=100
#keep-alive的最长等待时间,单位是秒,默认值是5
server.max-keep-alive-idle=1200
#lighttpd的work子进程数,默认值是0,单进程运行
server.max-worker=2
#限制用户在发送请求的过程中,最大的中间停顿时间(单位是秒),
#如果用户在发送请求的过程中(没发完请求),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是60(秒)
server.max-read-idle=1200
#限制用户在接收应答的过程中,最大的中间停顿时间(单位是秒),
#如果用户在接收应答的过程中(没接完),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是360(秒)
server.max-write-idle=12000
#读客户端请求的超时限制,单位是秒,配为0表示不作限制
#设置小于max-read-idle时,read-timeout生效
server.read-timeout=0
#写应答页面给客户端的超时限制,单位是秒,配为0表示不作限制
#设置小于max-write-idle时,write-timeout生效
server.write-timeout=0
#请求的处理时间上限,如果用了mod_proxy_core,那就是和后端的交互时间限制,单位是秒
server.max-connection-idle=1200
说明:
对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数max-keep-alive-idle决定。请求间的间隔超时也由max-keep-alive-idle决定。发送请求内容的总时间超时由参数read-timeout决定。Lighttpd与后端交互数据的超时由max-connection-idle决定。
延伸阅读:
[ Nginx ]
配置:nf
复制代码 代码如下:
http{
#Fastcgi:(针对后端的fastcgi生效,fastcgi不属于proxy模式)
fastcgi_connect_timeout5;#连接超时
fastcgi_send_timeout10; #写超时
fastcgi_read_timeout10;#读取超时
#Proxy:(针对proxy/upstreams的生效)
proxy_connect_timeout15s;#连接超时
proxy_read_timeout24s;#读超时
proxy_send_timeout10s; #写超时
}
说明:
Nginx 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。
延伸阅读:
ml
ml
ml
【PHP本身超时处理】
[ PHP-fpm ]
配置:nf
复制代码 代码如下:
<?xmlversion="1.0"?>
<configuration>
//...
.
.
EquivalenttoPHP_FCGI_.fcgi
Usedwithanypm_style.
#php-cgi的进程数量
<valuename="max_children">128</value>
Thetimeout(inseconds)
Shouldbeusedwhen'max_execution_time'
'0s'means'off'
#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数
<valuename="request_terminate_timeout">0s</value>
Thetimeout(inseconds).logfile
'0s'means'off'
<valuename="request_slowlog_timeout">0s</value>
</configuration>
说明:
在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:
<valuename="request_terminate_timeout">0s</value>
就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是php-fpm模式中运行时不生效的。
延伸阅读:
[ PHP ]
配置:php.ini
选项:
max_execution_time=30
或者在代码里设置:
ini_set("max_execution_time",30);
set_time_limit(30);
说明:
对当前会话生效,比如设置0一直不超时,但是如果php的safe_mode打开了,这些设置都会不生效。
效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。
【后端&接口访问超时】
【HTTP访问】
一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。
[ CURL 访问HTTP]
CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。
CURL:
curl_setopt($ch,opt)可以设置一些超时的设置,主要包括:
*(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。
*(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。)
CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。
curl普通秒级超时:
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要设置一个秒的数量就可以
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
curl普通秒级超时使用:
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);
或者是:
curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒级别超时设置的
curl一个毫秒级超时的例子:
复制代码 代码如下:
<?php
if(!isset($_GET['foo'])){
//Client
$ch=curl_init('');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超时一定要设置这个
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超时毫秒,cURL7.16.2中被加入。从PHP5.2.3起可使用
$data=curl_exec($ch);
$curl_errno=curl_errno($ch);
$curl_error=curl_error($ch);
curl_close($ch);
if($curl_errno>0){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}
}else{
//Server
sleep(10);
echo"Done.";
}
?>
其他一些技巧:
1. 按照经验总结是:cURL版本>=libcurl/7.21.0版本,毫秒级超时是一定生效的,切记。
2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准
[流处理方式访问HTTP]
除了curl,我们还经常自己使用fsockopen、或者是file操作函数来进行HTTP协议的处理,所以,我们对这块的超时处理也是必须的。
一般连接超时可以直接设置,但是流读取超时需要单独处理。
自己写代码处理:
复制代码 代码如下:
$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec']);
if($intUSGone>$this->_intReadTimeoutUS){
returnfalse;
}
或者使用内置流处理函数stream_set_timeout()和stream_get_meta_data()处理:
复制代码 代码如下:
<?php
//Timeoutinseconds
$timeout=5;
$fp=fsockopen("",80,$errno,$errstr,$timeout);
if($fp){
fwrite($fp,"GET/HTTP/1.0rn");
fwrite($fp,"Host:rn");
fwrite($fp,"Connection:Closernrn");
stream_set_blocking($fp,true);//重要,设置为非阻塞模式
stream_set_timeout($fp,$timeout);//设置超时
$info=stream_get_meta_data($fp);
while((!feof($fp))&&(!$info['timed_out'])){
$data.=fgets($fp,4096);
$info=stream_get_meta_data($fp);
ob_flush;
flush();
}
if($info['timed_out']){
echo"ConnectionTimedOut!";
}else{
echo$data;
}
}
file_get_contents超时:
复制代码 代码如下:
<?php
$timeout=array(
'http'=>array(
'timeout'=>5//设置一个超时时间,单位为秒
)
);
$ctx=stream_context_create($timeout);
$text=file_get_contents("",0,$ctx);
?>
fopen超时:
复制代码 代码如下:
<?php
$timeout=array(
'http'=>array(
'timeout'=>5//设置一个超时时间,单位为秒
)
);
$ctx=stream_context_create($timeout);
if($fp=fopen("","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c;
}
fclose($fp);
}
?>
【MySQL】
php中的mysql客户端都没有设置超时的选项,mysqli和mysql都没有,但是libmysql是提供超时选项的,只是我们在php中隐藏了而已。
那么如何在PHP中使用这个操作捏,就需要我们自己定义一些MySQL操作常量,主要涉及的常量有:
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12;
这两个,定义以后,可以使用options设置相应的值。
不过有个注意点,mysql内部实现:
1.超时设置单位为秒,最少配置1秒
2.但mysql底层的read会重试两次,所以实际会是3秒
重试两次+自身一次=3倍超时时间,那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。
查看一个设置访问mysql超时的php实例:
复制代码 代码如下:
<?php
//自己定义读写超时常量
if(!defined('MYSQL_OPT_READ_TIMEOUT')){
define('MYSQL_OPT_READ_TIMEOUT',11);
}
if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
define('MYSQL_OPT_WRITE_TIMEOUT',12);
}
//设置超时
$mysqli=mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT,3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT,1);
//连接数据库
$mysqli->real_connect("localhost","root","root","test");
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
//执行查询sleep1秒不超时
printf("Hostinformation:%s/n",$mysqli->host_info);
if(!($res=$mysqli->query('selectsleep(1)'))){
echo"query1error:".$mysqli->error."/n";
}else{
echo"Query1:querysuccess/n";
}
//执行查询sleep9秒会超时
if(!($res=$mysqli->query('selectsleep(9)'))){
echo"query2error:".$mysqli->error."/n";
}else{
echo"Query2:querysuccess/n";
}
$mysqli->close();
echo"closemysqlconnection/n";
?>
延伸阅读:
【Memcached】
[PHP扩展]
php_memcache客户端:
连接超时:boolMemcache::connect(string$host[,int$port[,int$timeout]])
在get和set的时候,都没有明确的超时设置参数。
libmemcached客户端:在php接口没有明显的超时参数。
说明:所以说,在PHP中访问Memcached是存在很多问题的,需要自己hack部分操作,或者是参考网上补丁。
[C&C++访问Memcached]
客户端:libmemcached客户端
说明:memcache超时配置可以配置小点,比如5,10个毫秒已经够用了,超过这个时间还不如从数据库查询。
下面是一个连接和读取set数据的超时的C++示例:
复制代码 代码如下:
//创建连接超时(连接到Memcached)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL;
memcached_return_tprc;
if(_mpool!=NULL){//getfrompool
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
returnmmc;
}
memcached_st*handle=memcached_create(NULL);
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror");
returnNULL;
}
//设置连接/读取超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//参数MEMCACHED_BEHAVIOR_NO_BLOCK为1使超时配置生效,不设置超时会不生效,关键时候会悲剧的,容易引起雪崩
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//连接超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//读超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//写超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);
//设置一致hash
//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_returnrc;
for(uinti=0;i<_server_count;i++){
rc=memcached_server_add(handle,_ips[i],_ports[i]);
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);
}
}
_mpool=memcached_pool_create(handle,_min_connect,_max_connect);
if(_mpool==NULL){
__LOG_WARNING__("MemCacheProxy","create_poolerror");
returnNULL;
}
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);
returnmmc;
}
//设置一个key超时(set一个数据到memcached)
boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
{
memcached_returnrc;
chartmp[1024];
snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);
//有个timeout值
rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);
if(MEMCACHED_SUCCESS!=rc){
returnfalse;
}
returntrue;
}
//Memcache读取数据超时(没有设置)
libmemcahed源码中接口定义:
LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);
LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);
从接口中可以看出在读取数据的时候,是没有超时设置的。
延伸阅读:
【如何实现超时】
程序中需要有超时这种功能,比如你单独访问一个后端Socket模块,Socket模块不属于我们上面描述的任何一种的时候,它的协议也是私有的,那么这个时候可能需要自己去实现一些超时处理策略,这个时候就需要一些处理代码了。
[PHP中超时实现]
一、初级:最简单的超时实现 (秒级超时)
思路很简单:链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。
phpsocket中实现原始的超时:(每次循环都当前时间去减,性能会很差,cpu占用会较高)
复制代码 代码如下:
<?
$host="127.0.0.1";
$port="80";
$timeout=15;//timeoutinseconds
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
ordie("Unabletocreatesocketn");
socket_set_nonblock($socket) //务必设置为阻塞模式
ordie("Unabletosetnonblockonsocketn");
$time=time();
//循环的时候每次都减去相应值
while(!@socket_connect($socket,$host,$port))//如果没有连接上就一直死循环
{
$err=socket_last_error($socket);
if($err==115||$err==114)
{
if((time()-$time)>=$timeout)//每次都需要去判断一下是否超时了
{
socket_close($socket);
die("Connectiontimedout.n");
}
sleep(1);
continue;
}
die(socket_strerror($err)."n");
}
socket_set_block($this->socket)//还原阻塞模式
ordie("Unabletosetblockonsocketn");
?>
二、升级:使用PHP自带异步IO去实现(毫秒级超时)
说明:
异步IO:异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步IO将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
多路复用:复用模型是对多个IO操作进行检测,返回可操作集合,这样就可以对其进行操作了。这样就避免了阻塞IO不能随时处理各个IO和非阻塞占用系统资源的确定。
使用socket_select()实现超时
socket_select(...,floor($timeout),ceil($timeout*1000000));
select的特点:能够设置到微秒级别的超时!
使用socket_select()的超时代码(需要了解一些异步IO编程的知识去理解)
复制代码 代码如下:
编程 调用类 编程#
<?php
$server=newServer;
$client=newClient;
for(;;){
foreach($select->can_read(0)as$socket){
if($socket==$client->socket){
//NewClientSocket
$select->add(socket_accept($client->socket));
}
else{
//there'ssomethingtoreadon$socket
}
}
}
?>
编程 异步多路复用IO & 超时连接处理类 编程
<?php
classselect{
var$sockets;
functionselect($sockets){
$this->sockets=array();
foreach($socketsas$socket){
$this->add($socket);
}
}
functionadd($add_socket){
array_push($this->sockets,$add_socket);
}
functionremove($remove_socket){
$sockets=array();
foreach($this->socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket;
}
$this->sockets=$sockets;
}
functioncan_read($timeout){
$read=$this->sockets;
socket_select($read,$write=NULL,$except=NULL,$timeout);
return$read;
}
functioncan_write($timeout){
$write=$this->sockets;
socket_select($read=NULL,$write,$except=NULL,$timeout);
return$write;
}
}
?>
[C&C++中超时实现]
一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库(libevent,libev)也能实现。
一、使用alarm中用信号实现超时 (秒级超时)
说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号(也可使用select实现)
用alarym秒级实现connect设置超时代码示例:
复制代码 代码如下:
//信号处理函数
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler");
return;
}
//alarm超时连接实现
staticvoidconn_alarm()
{
Sigfunc*sigfunc;//现有信号处理函数
sigfunc=signal(SIGALRM,connect_alarm);//建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数
inttimeout=5;
//设置闹钟
if(alarm(timeout)!=0){
//...闹钟已经设置处理
}
//进行连接操作
if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr))<0){
if(errno==EINTR){//如果错误号设置为EINTR,说明超时中断了
debug_printf("Timeout");
⑸ win2008 + wamp正常使用几个小时后就无法打开PHP网页
如果你是指电脑无法打开或浏览网页,你可根据以下情况进行排障:
1、宽带未连接。重新连接宽带。
2、路由器故障。拆除路由器后,进行宽带连接试用。
3、偶发性故障,如ADSL断流,电脑内存数据溢出等。重启电脑、modem试用。
4、浏览器陪搏故障,应用不恰当的代理服务器。卸载一切浏览器插件,恢复IE浏览器默认设置试用。去掉代理服务器设置。重装浏览器程序。
5、IP地址、DNS设置设置不当。一般家庭用户IP地址设置成自动获取,重设DNS服务器地址。
6、杀毒软件防火墙设置错误。临时关闭杀毒软件防火墙试用,如果恢复正常,检查被禁用项目,放行即可。
7、电脑芦核祥中毒或者被攻击。升级杀毒软件至最新版本,打好系统补丁,在安全模式下查杀病毒,如果病毒杀不掉需要重做系统。
8、TCP/IP 出错。点击开始--运行--输入CMD,在Dos提示符下输入命令“ping 127.0.0.1”(本机循环地址),如果显示Reply from 127.0.0.1: bytes=?? time=?ms TTL=???,则表示TCP/IP协议运行正常,若显示Request timed out(超时),重装该协议。ping本机IP地址。使用ipconfig查看本机IP地址,若通则表明网络适配器工作正常,否则可能是网卡故障。WIN98、2000可用重装协议。XP、vista、win7需要重做系统。
9、系统文件丢失、操作系统故障。可分析何种故障,可用系统安装盘恢复,或者重做系统。
10、新装软件之间有冲突。最近安装的程序分析可能引起冲突的软件,卸载试用。
11、不同的拨号软件相互干扰。win98 、2000系统只用一个拨号软件。XP、vista、win7尽量使用自带拨号程序。
12、多网卡冲突,或者网卡工作不正常。ping本机氏物IP地址。使用ipconfig查看本机IP地址,若通则表明网络适配器工作正常,否则可能是网卡坏。禁用不用的网卡,检查网卡驱动是否与新装软件、新装驱动有冲突,咨询客户是否添加新硬件如果用请拆除临时新硬件使用。重启电脑网卡,更改网卡工作速率试用。
13、宽带信号,楼宇交换机出现故障。拨打宽带所属运营商客服热线进行故障申告。
⑹ TCP协议总结
Transmission Control Protocol,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP协议的目的是: 在不可靠传输的IP层之上建立一套可靠传输的机制。 TCP的可靠只是对于它自身来说的, 甚至是对于socket接口层, 两个系统就不是可靠的了, 因为发送出去的数据, 没有确保对方真正的读到(所以要在业务层做重传和确认机制)。
可靠传输的第一要素是 确认 , 第二要素是 重传 , 第三要素是 顺序 。 任何一个可靠传输的系统, 都必须包含这三个要素。 数据校验 也是必要的。
传输是一个广义的概念, 不局限于狭义的网络传输, 应该理解为通信和交互. 任何涉及到通信和交互的东西, 都可以借鉴TCP的思想。无论是在UDP上实现可靠传输或者创建自己的通信系统,无论这个系统是以API方式还是服务方式,只要是一个通信系统,就要考虑这三个要素。
SeqNum的增加是和传输的字节数相关的。 上图中,三次握手后,来了两个Len:1440的包,而第二个包的SeqNum就成了1441。然后第一个ACK回的是1441(下一个待接收的字节号),表示第一个1440收到了。
网络上的传输是没有连接的,包括TCP也是一样的 。而TCP所谓的“连接”,其实只不过是在通讯的双方维护一个“连接状态”,让它看上去好像有连接一样。所以,TCP的状态变换是非常重要的。
查看各种状态的数量
ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}'
通过三次握手完成连接的建立
三次握手的目的是交换通信双方的初始化序号,以保证应用层接收到的数据不会乱序,所以叫SYN(Synchronize Sequence Numbers)。
ISN是不能hard code的,不然会出问题的。比如:如果连接建好后始终用1来做ISN,如果client发了30个segment过去,但是网络断了,于是client重连,又用了1做ISN,但是之前连接的那些包到了,于是就被当成了新连接的包,此时,client的Sequence Number可能是3,而Server端认为client端的这个号是30了。全乱了。RFC793中说,ISN会和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN做加一操作,直到超过232,又从0开始。这样,一个ISN的周期大约是4.55个小时。因为,我们假设我们的TCP Segment在网络上的存活时间不会超过Maximum Segment Lifetime(MSL),所以,只要MSL的值小于4.55小时,那么,我们就不会重用到ISN。
如果Server端接到了Clien发的SYN后回了SYN-ACK,之后Client掉线了,Server端没有收到Client返回的ACK,那么,这个连接就处于一个中间状态,即没成功,也没失败。于是,Server端如果在一定时间内没有收到的ACK会重发SYN-ACK。在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻番,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 26 -1 = 63s,TCP才会断开这个连接。
客户端给服务器发了一个SYN后,就下线了,于是服务器需要默认等63s才会断开连接,这样,攻击者就可以把服务器的SYN连接的队列耗尽,让正常的连接请求不能处理。
于是,Linux下给了一个叫tcp_syncookies的参数来应对这个事:当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie),此时服务器并没有保留客户端的SYN包。如果是攻击者则不会有响应,如果是正常连接,则会把这个SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)。
千万别用tcp_syncookies来处理正常的大负载的连接的情况。因为sync cookies是妥协版的TCP协议,并不严谨。应该调整三个TCP参数:tcp_synack_retries减少重试次数,tcp_max_syn_backlog增大SYN连接数,tcp_abort_on_overflow处理不过来干脆就直接拒绝连接
因为TCP是全双工的,因此断开连接需要4次挥手,发送方和接收方都需要发送Fin和Ack。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。
指的是报文段的最大生存时间,如果报文段在网络中活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置,以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒
主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的MSL时长。由于TIME_WAIT的存在,大量短连接会占有大量的端口,造成无法新建连接。
主动关闭的一方发出 FIN包,被动关闭的一方响应ACK包,此时,被动关闭的一方就进入了CLOSE_WAIT状态。如果一切正常,稍后被动关闭的一方也会发出FIN包,然后迁移到LAST_ACK状态。
CLOSE_WAIT状态在服务器停留时间很短,如果你发现大量的 CLOSE_WAIT状态,那么就意味着被动关闭的一方没有及时发出FIN包。
TCP要保证所有的数据包都可以到达,所以,必需要有重传机制。
接收端给发送端的Ack确认只会确认最后一个连续的包 ,比如,发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到),此时的TCP会怎么办?我们要知道,因为正如前面所说的,SeqNum和Ack是以字节数为单位,所以ack的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了
但总体来说都不好。因为都在等timeout,timeout可能会很长
不以时间驱动,而以数据驱动重传
如果包没有连续到达,就ack最后那个可能被丢了的包,如果发送方连续收到3次相同的ack,就重传
Selective Acknowledgment, 需要在TCP头里加一个SACK的东西,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据碎版,在发送端就可以根据回传的SACK来知道哪些数据到了,哪些没有收到
重复收到数据的问题,使用了SACK来告诉发送方有哪些数据被重复接收了
经典算法:Karn/Partridge算法,Jacobson/Karels算法
TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包
Advertised-Window :接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来
接收端LastByteRead指向了TCP缓冲区中读到的位置,NextByteExpected指向的地方是收到的连续包的最后一个位置,LastByteRcved指向的是收到的包的最后一个位置,我们可以看到中间有些数据还没有到达,所以有数据空白区。
发送端的LastByteAcked指向了被接收端Ack过的位置(表示成功发送确认),LastByteSent表示发出去了,但还没有收到成功确认的Ack,LastByteWritten指向的是上层应用正在写的地方。
接收端在给发送端回ACK中会汇报自己的AdvertisedWindow = MaxRcvBuffer – LastByteRcvd – 1;
收到36的ack,并发出了46-51的字节
如果Window变成0了,发送端就不发数据了
如果发送端不发数据了,接收方一会儿Window size 可用了,怎么通知发送端呢:TCP使用了Zero Window Probe技术,缩写为ZWP,也就是说,发送端在窗口变成0后,会发ZWP的包给接收方,让接收方来ack他的Window尺寸,一般这个值会设置成3次,每次大约30-60秒。如果3次过后还是0的话,有的TCP实现就会发RST把链接断了。
如果你的网络包可以塞满MTU,那么你可以用满整个带宽,如果不能,那么你就会浪费带宽。避免对小的window size做出响应,直到有足够大的window size再响应。
如果这个问题是由Receiver端引起的,那么就会使用David D Clark’s 方案。在receiver端,如果收到的数据导致window size小于某个值,可以直接ack(0)回sender,这样就把window给关闭了,也阻止了sender再发数据过来,等到receiver端处理了一些数据后windows size大于等于了MSS,或者receiver buffer有一半为空,就可以把window打开让send 发送数据过来。
如果这个问题是由Sender端引起的,那么就会使用着名的 Nagle’s algorithm。这个算法的思路也是延时处理,他有两个主要的条件:1)要等到 Window Size >= MSS 或是 Data Size >= MSS,2)等待时间或是超时200ms,这两个条件有一个满足,他才会发数据,否则就是在攒数据。
TCP_CORK是禁止小包发送,而Nagle算法没有禁止小包发送,只是禁止了大量的小包发送
TCP不是一个自私的协议,当拥塞发生的时候,要做自我牺牲
拥塞控制的论文请参看 《Congestion Avoidance and Control》
主要算法有:慢启动,拥塞避免,拥塞发生,快速恢复,TCP New Reno,FACK算法,TCP Vegas拥塞控制算法
TCP网络协议及其思想的应用
TCP 的那些事儿(上)
TCP 的那些事儿(下)
tcp为什么是三次握手,为什么不是两次或四次?
记一次TIME_WAIT网络故障
再叙TIME_WAIT
tcp_tw_recycle和tcp_timestamps导致connect失败问题
tcp短连接TIME_WAIT问题解决方法大全(1)- 高屋建瓴
tcp短连接TIME_WAIT问题解决方法大全(2)- SO_LINGER
tcp短连接TIME_WAIT问题解决方法大全(3)- tcp_tw_recycle
tcp短连接TIME_WAIT问题解决方法大全(4)- tcp_tw_reuse
tcp短连接TIME_WAIT问题解决方法大全(5)- tcp_max_tw_buckets
TCP的TIME_WAIT快速回收与重用
浅谈CLOSE_WAIT
又见CLOSE_WAIT
PHP升级导致系统负载过高问题分析
Coping with the TCP TIME-WAIT state on busy Linux servers
⑺ 关于php中socket的问题:
这是socket的服务端的代码,监听的ip地址是192.168.168.121,端口号为8528
请检查以下几点
这个ip是不是代码所在服务器的ip,一般监测内网ip,如127.0.0.1
端口号是否被使用,可以使用cmd命令 netstat -ano|findstr 8528 查找端口号为8528的端口使用情况
如果要给在公网上使用,请使用公网ip,这样可以外网使用
如果代码不报错可以试下telnet下你的端口号,看是否可以使用
如 telnet 127.0.0.1 8528
解决方案
查看你电脑的ip地址,把上面代码里“$address = '192.168.168.121';”这个ip地址换成“$address = '127.0.0.1';”或者你电脑的ip地址,再试试。
(ip地址改成127.0.0.1后,这段代码在我电脑上可以使用)
⑻ php(5.2.3)无法连接mysql(5.5.22),错误:Can't create TCP/IP socket (10106) 平台为win7和iis
php的内部原因的,php的版本不一样相应的一些裤态裤文件的配置和路径什么胡简的都不行同的,要修改的话,闭孝去php.ini中改改吧!