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

發表于:2013-10-28來源:酷勤網作者:不詳點擊數: 標簽:php
那么如何在PHP中使用這個操作捏,就需要我們自己定義一些MySQL操作常量,主要涉及的常量有: MYSQL_OPT_READ_TIMEOUT=11; MYSQL_OPT_WRITE_TIMEOUT=12; 這兩個,定義以

  那么如何在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";

?>

  延伸閱讀:

  http://blog.csdn.net/heiyeshuwu/article/details/5869813

  【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;

}

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

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