echo"Query1:querysuccess/n"
}
//クエリを 9 秒間実行すると、タイムアウト
if(!($res=$mysqli->query( 'selectsleep(9)'))){
echo"query2error:".$mysqli->error."/n";
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]])
あり取得および設定中に明確なタイムアウト設定パラメータはありません。
libmemcached クライアント: PHP インターフェイスには明らかなタイムアウト パラメーターがありません。
注意: したがって、PHP で Memcached にアクセスする場合は、いくつかの操作を自分でハッキングするか、オンライン パッチを参照する必要があるため、多くの問題が発生します。
[C&C++ アクセス Memcached]
クライアント: libmemcached クライアント
注: memcache のタイムアウト設定は、5 ミリ秒または 10 ミリ秒など、より小さく設定できます。この時間を超える場合は、データベースからクエリを実行することをお勧めします。
以下は、セットデータの接続と読み取りのタイムアウトの C++ の例です:
コードをコピーします
コードは次のとおりです:
//接続タイムアウトの作成 (Memcached への接続)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL;
if(_mpool!=NULL){//getfrompool
mmc= memcached_pool_pop( _mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc); (NULL);
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror")
}
//接続/読み取りタイムアウトを設定
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_H) ASH_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) ;
//一貫したハッシュを設定します
//memcached_behavior_set_distribution(handle ,MEMCACHED_DISTRIBUTION_CONSISTENT)
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT); _returnrc;
for(uinti=0;i<_server_count>rc=memcached _server_add(ハンドル,_ips[i],_ports[i]);
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d] が失敗しました。",_ips[i],_ports[i] ]);
}
}
_mpool=memcached_pool_create(handle, _min_connect,_max_connect);
__LOG_WARNING__("MemCacheProxy","create_poolerror"); memcached_pool_pop( _mpool,false,&prc);
if(mmc==NULL ){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
//__LOG_DEBUG__("MemCacheProxy","gethandle) [%p]",handle);
returnmmc;
}
//キーのタイムアウトを設定します (データを 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]); =memcached_set(handle,tmp,strlen(tmp),(char* ;
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_tme mcached_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
[タイムアウトの実装方法]
プログラムにはタイムアウト機能が必要ですたとえば、バックエンド ソケット モジュールに単独でアクセスし、そのソケット モジュールが上記のいずれにも属しておらず、そのプロトコルもプライベートである場合は、いくつかのタイムアウト処理戦略を自分で実装する必要がある場合があります。今回は、いくつかのコードの処理が必要です。
[PHP でのタイムアウト実装]
1. 初級: 最も単純なタイムアウト実装 (第 2 レベルのタイムアウト)
アイデアは非常に単純です。バックエンドを接続し、接続がない場合は非ブロッキング モードに設定します。ループを続けて現在の時刻とタイムアウト期間を決定します。
元のタイムアウトは phpsocket に実装されています: (ループごとに現在時間が差し引かれ、パフォーマンスが低下し、CPU 使用率が高くなります)
コードをコピーします
コードは次のとおりです:
$host= "127.0.0.1";
$timeout=15;//タイムアウト秒
$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( "ブロックをソケットに設定できません");
2. アップグレード: 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{
//$socket に何かあります
}
}
?>非同期多重 IO およびタイムアウト接続処理プログラミング
classselect{
functionselect($sockets){
foreach($socketsas$socket){
$this->add($socket);
}
}
functionadd($add_socket){
array_push($this->socket,$add_socket)
}
functionremove($remove_socket){
$sockets=array ();
foreach($this->socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket;
$this->sockets=$socket;
functioncan_read($timeout){
$read=$this->ソケット;
return$read
}
functioncan_write; ){
$write=$this->ソケット;
return$write;
; [C&C++ のタイムアウト実装]
通常、LinuxC/C++ では、第 2 レベルのタイムアウトを達成するタイマーを設定するためにアラーム() を使用するか、select()、poll()、epoll() などの非同期多重化 IO を使用できます。ミリ秒レベルのタイムアウトを実現します。これを実現するために、セカンダリのカプセル化された非同期 IO ライブラリ (libevent、libev) を使用することもできます。
1. アラームでシグナルを使用してタイムアウトを実現します (第 2 レベルのタイムアウト)
説明: Linux カーネルの接続タイムアウトは通常 75 秒で、接続から早く戻るために 10 秒などの短い時間を設定できます。ここでは信号処理メカニズムを使用し、アラームを呼び出し、タイムアウト後に SIGALRM 信号を生成します (select を使用して実装することもできます)
alarym を使用して数秒で接続を実装し、タイムアウトを設定します コード例:
コードをコピー
コードは次のとおりです。
// 信号処理関数
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler")
return; } // アラーム タイムアウト接続の実装 staticvoidconn_alarm() {
;シグファンク* sigfunc;//既存の信号処理関数
s igfunc =signal(SIGALRM,connect_alarm);//信号処理関数 connect_alarm を作成し、(存在する場合) 既存の信号処理関数を保存します
inttimeout=5
//目覚まし時計を設定します。
if(alarm(timeout)!=0){
//...目覚まし時計が設定され、処理されました
}
//接続操作を実行します
if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr) ))<0){
if(errno==EINTR){/ /エラー番号が EINTR に設定されている場合、タイムアウト割り込みを意味します
debug_printf("Timeout");
http://www.bkjia.com/PHPjc/326022.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/326022.html
技術記事
PHP 開発では、タイムアウト処理が使用される状況が数多くあります。いくつかのシナリオについて説明します。 1. 特定のバックエンド データ ソースが正常に取得されなかった場合、全体に影響を与えることなくスキップされます。 ...