您所在的位置:首页 >> 技术资料
php网站建设中要遇到的超时情况的处理技术
 作者:

程序中需要有超时这种功能,比如你单独访问一个后端Socket模块,Socket模块不属于我们上面描述的任何一种的时候,它的协议也是私有的,那么这个时候可能需要自己去实现一些超时处理策略,这个时候就需要一些处理代码了。
不用愁, 看我教你。
思路很简单:链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。
phpsocket中实现原始的超时:(每次循环都当前时间去减,性能会很差,cpu占用会较高)
. 代码如下:
=$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编程的知识去理解)
. 代码如下:
编程 调用类 编程#
can_read(0)as$socket){
if($socket==$client->socket){
//NewClientSocket
$select->add(socket_accept($client->socket));
}
else{
//there\'ssomethingtoreadon$socket
}
}
}
?>
编程 异步多路复用IO & 超时连接处理类 编程
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;
}
}
?>
[2012-09-14 02:08:53]php网站建设中要遇到的超时情况的处理技术

 

在线客服

点击这里给我发消息
点击这里给我发消息
深圳模板网站,深圳模板建站,广州模板网站建设,广州做网站,东莞模板网站,深圳网站模板,深圳做网站,深圳模板网站建设,东莞做网站 Copyright 2009-2012   粤ICP备099999530号
公司承接网站建设、网页设计、平面设计、域名注册、租用服务器空间、网站推广等一条龙服务,我公司具有丰富的网页设计思维及创新风格,能独立开发网站设计,及网站后台的功能,中小企业及个人建站特惠1500元起!
服务地区包括:惠城、深圳、龙华、广州、宝安、南山、福田、罗湖、天河、越秀、番禺、黄埔、东莞市各区镇.....>