ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルにおけるいくつかの一般的なタイムアウト処理の包括的な概要

PHP_PHP チュートリアルにおけるいくつかの一般的なタイムアウト処理の包括的な概要

WBOY
WBOYオリジナル
2016-07-21 15:15:49901ブラウズ

PHP 開発では、タイムアウト処理が使用される状況が数多くあります。いくつかのシナリオについて説明します。

1. 特定のバックエンド データ ソースが正常に取得されなかった場合、そのデータは影響を受けずにスキップされます。ページ全体の表示
2. 1 つのページの処理パフォーマンスの低下により Web サーバーが他のページにアクセスできなくなることを防ぐために、いくつかのページ動作設定が設定されます
3. 一部のアップロードまたは状況では、処理時間は不確実であり、プロセス全体が無限に設定されている必要があります。そうしないと、リンクの設定が不適切であると、原因不明の実行中断が発生します
4。これを防ぐために、複数のバックエンド モジュール (MySQL、Memcached、HTTP インターフェイス)。単一インターフェースのパフォーマンスが低すぎるため、フロント全体のデータ取得が遅すぎる 遅くなり、ページを開く速度に影響し、雪崩を引き起こす
5. 。 。タイムアウトが必要になる場面は多々あります

こういったところでタイムアウトの設定を考える必要がありますが、PHPにおけるタイムアウトはいくつかのカテゴリーに分かれており、それぞれの処理方法や戦略が異なりますので、仕組みを説明する目的でまとめてみました。 PHP でよく使用されるタイムアウト処理。

[Webサーバーのタイムアウト処理]

[Apache]
通常、パフォーマンスが非常に高い場合、デフォルトのタイムアウト設定はすべて30秒ですが、ファイルのアップロードやネットワーク速度が非常に遅い場合は、タイムアウトが発生する可能性があります。手術。
現在、apachefastcgiphp-fpm モードには 3 つのタイムアウト設定があります:
fastcgi タイムアウト設定:
httpd.conf の fastcgi 接続構成を次のように変更します:

コードをコピーします コードは次のとおりです。

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-httpd-php.php


デフォルトの設定は 30 秒です。独自の設定をカスタマイズする必要がある場合は、設定を変更する必要があります。たとえば、100 秒に変更します: (変更後に Apache を再起動します):


コードをコピーします コードは次のとおりです:

FastCgiExternalServer/home /forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock -idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php /cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-httpd -php.php


タイムアウトになると、500 エラーが返されます。バックエンド php サービスから切断し、Apache エラー ログを記録します:
[ThuJan2718:30:152011][error][ client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110 ]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin /php-cgi"
その他の fastcgi 設定パラメータの説明:

コードをコピー コードは次のとおりです:
IdleTimeout 時間制限
ProcessLifeTime プロセスの最も長いライフサイクル、期限切れ後に無条件で強制終了
MaxProcessCount プロセスの最大数
DefaultMinClassProcessCount 各プログラムによって開始されるプロセスの最小数
DefaultMaxClassProcessCount 各プログラムによって開始されるプロセスの最大数
IPCConnectTimeout プログラム応答タイムアウト
IPCCommTimeout 上記のエラーは、この値の設定が小さすぎることが原因である可能性があります
MaxRequestsPerProcess は、各プロセスの完了したプロセスの最大数です

[Lighttpd]
設定: lighttpd.conf
Lighttpd 設定では、タイムアウトに関するパラメータは次のとおりです (スペースを考慮して、書き込みタイムアウトのみ、書き込みタイムアウト パラメータは同じです):
主に関係するオプション:
server.max- keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360

コードをコピー コードは次のとおりです。

#各キープアライブのリクエストの最大数、デフォルト値は 16
server.max-keep-alive-requests=100
#キープアライブの最大待機時間、単位は秒、デフォルト値は5です
server .max-keep-alive-idle=1200
#lighttpdの作業サブプロセスの数、デフォルト値は0、単一プロセス操作です
server.max-worker=2
#最大中間プロセスを制限しますユーザーがリクエストを送信するときに一時停止する 時間 (単位は秒)、
#リクエストの送信プロセス中にユーザーが長時間一時停止しすぎる場合 (リクエストが完了していない場合)、lighttpd は積極的に切断します
#デフォルト値は 60 (秒)
server.max -read-idle=1200
#ユーザーが応答を受信して​​いるときの最大一時停止時間 (秒単位) を制限します。
#ユーザーが応答を受信中である (完了していない) 場合の一時停止時間。が長すぎる場合、lighttpd は積極的に切断します
#デフォルト値は 360 (秒) です
server.max-write-idle=12000
#クライアント要求の読み取りのタイムアウト制限、単位は秒で、いいえを意味する 0 に設定しますlimit
#max-read-idle が使用される場合、read-timeout が有効になります
server.read-timeout=0
#クライアントに応答ページを書き込むためのタイムアウト制限 (秒単位) を示すために 0 に設定します制限なし
#設定が max-write-idle 未満の場合、write-timeout が有効になります
server.write-timeout=0
#リクエスト処理時間の上限、mod_proxy_core を使用する場合はインタラクション時間制限になりますバックエンドの場合、単位は秒です
server.max-connection-idle=1200

注:
キープアライブ接続での連続したリクエストの場合、最初のリクエストコンテンツを送信する最大間隔はパラメータ max- によって決まります。 2 番目のリクエスト以降、リクエストの内容を送信する最大間隔は、パラメータ max-keep-alive-idle によって決まります。リクエスト間のタイムアウトも max-keep-alive-idle によって決まります。リクエストコンテンツの送信の合計タイムアウトは、パラメータ read-timeout によって決まります。 Lighttpd がバックエンドと対話するためのタイムアウトは、max-connection-idle によって決まります。
詳細な読み方:
http://www.snooda.com/read/244
[ Nginx ]
設定: nginx.conf
コードをコピー コードは次のとおりです:

http{
#Fastcgi :(バックエンドの Fastcgi が有効になる場合、fastcgi はプロキシ モードに属しません)
fastcgi_connect_timeout5;#接続タイムアウト
fastcgi_send_timeout10; read_timeout24s ;#読み取りタイムアウト
proxy_send_timeout10s; #書き込みタイムアウト
}


説明:
N ginx のタイムアウト設定は上記のタイムアウトはさまざまな動作モードに対応していますが、タイムアウトによって引き起こされる多くの問題があります。
詳細情報:
http://hi.baidu.com/pibuchou/blog/item/a1e330dd71fb8a5995ee3753.html
http://hi.baidu.com/pibuchou/blog/item/7cbccff0a3b77dc60b46e024.html
http://hi .baidu.com/pibuchou/blog/item/10a549818f7e4c9df703a626.html
http://www.apoyl.com/?p=466

[PHP自体のタイムアウト処理]

[PHP-fpm]
設定: php-fpm .conf

コードをコピーします
コードは次のとおりです:
維持される同時リクエストの数を設定します。 pacheMaxClients ディレクティブと同等です。オリジナルのphp.fcgiのPHP_FCGI_CHILDREN環境と同等
任意のpm_styleで使用
#php-cgiのプロセス数
128
ワーカープロセスが終了するまでのタイムアウト(秒)
'max_のときに使用する必要があります。実行時間'初期オプションは何らかの理由でスクリプトの実行を停止しません
'0s' は'オフ'を意味します
#php-fpm request 実行タイムアウト。0s はタイムアウトしないことを意味します。それ以外の場合は、タイムアウトの秒数として Ns を設定します
0s
Thetimeout(inseconds)forservingofsinglerequestafterthataphpbacktracewillbedumpedtoslow.logfile
'0s 'オフを意味します'
0

注意:
php.ini には、PHP スクリプトの最大実行時間を設定できるパラメータ max_execution_time がありますが、php-cgi (php-fpm) では、このパラメータは有効になりません。 PHP スクリプトの最大実行を実際に制御できる場合:
0s
つまり、max_execution_time を mod_php5.so モードで実行すると有効になりますが、 php-fpm モードで実行すると、実行時には有効になりません。
詳細情報:
http://blog.s135.com/file_get_contents/
[PHP]
設定: php.ini
オプション:
max_execution_time=30
またはコードで設定:
ini_set("max_execution_time",30) ;
set_time_limit(30);
説明:
たとえば、0 を設定するとタイムアウトになることはありませんが、PHP のセーフモードがオンになっている場合、これらの設定は有効になりません。
効果は同じですが、特定のコンテンツは php-fpm 部分を参照する必要があります。 request_terminate_timeout が php-fpm に設定されている場合、max_execution_time は有効になりません。
【バックエンドとインターフェースのアクセスタイムアウト】
【HTTPアクセス】
一般に、私たちは多くの方法でHTTPにアクセスします。主に、curl、socket、file_get_contents()およびその他のメソッドです。
相手のサーバーが応答しなければ、悲劇が起こります。サーバー全体を殺すのは簡単なので、http にアクセスするときのタイムアウトの問題も考慮する必要があります。
[CURL アクセス HTTP]
CURL は、HTTP プロトコル インターフェイスにアクセスするために一般的に使用される信頼性の高いライブラリです。高いパフォーマンスといくつかの同時実行サポート機能を備えています。
CURL:
curl_setopt($ch,opt) は、主に次のようないくつかのタイムアウト設定を設定できます:
*(重要) CURLOPT_TIMEOUT は、cURL が実行できる最大秒数を設定します。
*(重要) CURLOPT_TIMEOUT_MS は、cURL の実行が許可される最大ミリ秒数を設定します。 (cURL7.16.2 で追加。PHP5.2.3 から利用可能。)
CURLOPT_CONNECTTIMEOUT 接続を開始するまでの待機時間。0 に設定すると、無期限に待機します。
CURLOPT_CONNECTTIMEOUT_MS 接続試行中に待機する時間 (ミリ秒単位)。 0 に設定すると、無限に待機します。 cURL7.16.2で追加されました。 PHP5.2.3から利用可能です。
CURLOPT_DNS_CACHE_TIMEOUT は、DNS 情報をメモリに保存する時間を設定します。デフォルトは 120 秒です。
curl 通常の第 2 レベルのタイムアウト:
$ch=curl_init();
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); / / 秒数を設定するだけです
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl の通常の第 2 レベルのタイムアウトを使用します:
curl_setopt( $ ch,CURLOPT_TIMEOUT,60);
curl がミリ秒のタイムアウトを必要とする場合、次を追加する必要があります:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L); または:
curl_setopt($ch,CURLOPT_NOSIGNAL,true);
curl のミリ秒タイムアウトの設定:



コードをコピー
コードは次のとおりです: if(!isset($_GET['foo'])){
//Client
$ch=curl_init('http://example.com/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//これはミリ秒のタイムアウトに設定する必要があることに注意してください
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200); //ミリ秒単位のタイムアウト、cURL7.16.2 で追加。 PHP5.2.3 以降で利用可能
$data=curl_exec($ch);
$curl_error=curl_error($ch);
if($curl_errno> ){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}else{
//サーバー
sleep(10); ;
}
?>



その他のヒント:

1. 経験によると、要約は次のとおりです: cURL バージョン>=libcurl/7.21.0 の場合、ミリ秒のタイムアウトが確実に有効になります。
2.curl_multi のミリ秒タイムアウトにも問題があります。 。単一アクセスはミリ秒レベルのタイムアウトをサポートします。複数の呼び出しが並行して行われる場合、Curl_multi は不正確になる可能性があります
[ストリーム処理を介した HTTP へのアクセス]
HTTP プロトコルの処理には、curl に加えて、fsockopen またはファイル操作関数がよく使用されます。この部分のタイムアウト処理も必要です。
通常、接続タイムアウトは直接設定できますが、ストリーム読み取りタイムアウトは個別に処理する必要があります。

自分でコードを書きます:


コードをコピーします

コードは次のとおりです:

$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart[' sec']) *1000000
+($tmCurrent['usec']-$tmStart['usec']); if($intUSGone>$this->_intReadTimeoutUS){ }
または次を使用します。組み込みのストリーム処理関数 stream_set_timeout() および stream_get_meta_data() の処理:



コードをコピー

コードは次のとおりです:

//タイムアウト秒
$timeout=5;
$fp=fsockopen("example.com",$errno,$errstr,$timeout);
if($fp){
fwrite( $fp,"GET/HTTP/1.0rn");
fwrite($fp,"ホスト:example.comrn");
stream_set_blocking($fp,true); //重要、ノンブロッキングモードに設定します
stream_set_timeout($fp,$timeout); //タイムアウトを設定します
$info=stream_get_meta_data($fp)
while((!feof($fp))&&(!$info [ 'timed_out'])){
$data.=fgets($fp,4096);
ob_flush()
}
if($info['timed_out' ] ){
echo "ConnectionTimedOut!";
}else{
}
}


file_get_contents タイムアウト:


コードは次のとおりです:
$timeout= array( 'http'=>array( 'timeout'=>5//タイムアウトを秒単位で設定します
)
);
$ctx=stream_context_create($timeout); ( "http://example.com/",0,$ctx);


fopen タイムアウト:



コードは次のとおりです:

$timeout=array (
'http'=>array(
'timeout'=>5//タイムアウトを秒単位で設定します ) ); fopen ("http://example.com/","r",false,$ctx)){ while($c=fread($fp,8192)){ echo$c;
}
fclose($ fp;以上です。
PHP でこの操作を使用するには、いくつかの MySQL 操作定数を自分で定義する必要があります:
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12; これら 2 つを定義した後、オプションを使用して値を設定できます。 。
ただし、mysql の内部実装には注意すべき点があります。
1. タイムアウト設定の単位は秒で、最小構成は 1 秒です。
2. ただし、mysql の基礎となる読み取りは 2 回再試行されるため、実際の時間は3 秒になります
2 回の再試行 + 1 回の再試行 = タイムアウトの 3 倍。つまり、最小タイムアウトは 3 秒であり、この値を下回ることはありません。ほとんどのアプリケーションでは許容されますが、アプリケーションに合わせて最適化する必要があります。応募数が少ない。
mysql へのアクセスのタイムアウトを設定する php インスタンスを表示します:



コードをコピーします

コードは次のとおりです:

//読み取りおよび書き込みのタイムアウト定数を自分で定義します
if( !define('MYSQL_OPT_READ_TIMEOUT')){ define('MYSQL_OPT_READ_TIMEOUT',11)
}
if(!define('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();
} / /タイムアウトなしでクエリスリープを 1 秒間実行します printf(" Hostinformation:%s/n",$mysqli->host_info) if(!($res=$mysqli->query('selectsleep(1)') ))){ echo"query1error:".$mysqli ->error."/n";
}else{
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 プログラミングの知識が必要です)
コードをコピーします コードは次のとおりです:

プログラミング呼び出しクラス プログラミング#
$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

tru​​e

http://www.bkjia.com/PHPjc/326022.html

技術記事
PHP 開発では、タイムアウト処理が使用される状況が数多くあります。いくつかのシナリオについて説明します。 1. 特定のバックエンド データ ソースが正常に取得されなかった場合、全体に影響を与えることなくスキップされます。 ...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。