PHP超時處理全面總結(5)

發表于:2013-10-28來源:酷勤網作者:不詳點擊數: 標簽:php
//Memcache讀取數據超時(沒有設置) libmemcahed源碼中接口定義: LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,mem

  //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);

  從接口中可以看出在讀取數據的時候,是沒有超時設置的。

  延伸閱讀:

  http://hi.baidu.com/chinauser/item/b30af90b23335dde73e67608

  http://libmemcached.org/libMemcached.html

  【如何實現超時】

  程序中需要有超時這種功能,比如你單獨訪問一個后端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;

}

}

?>

原文轉自:http://www.kuqin.com/web/20120808/324135.html

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97