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