• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>