¸üÐÂʱ¼ä:2018Äê01ÔÂ11ÈÕ14ʱ03·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
ÔÚPHP¿ª·¢Öй¤×÷Àï·Ç³£¶àʹÓõ½³¬Ê±´¦Àíµ½³¬Ê±µÄ³¡ºÏ£¬ÎÒ˵¼¸¸ö³¡¾°£º
1. Òì²½»ñÈ¡Êý¾ÝÈç¹ûij¸öºó¶ËÊý¾ÝÔ´»ñÈ¡²»³É¹¦ÔòÌø¹ý£¬²»Ó°ÏìÕû¸öÒ³ÃæÕ¹ÏÖ
2. ΪÁ˱£Ö¤Web·þÎñÆ÷²»»áÒòΪµ±¸öÒ³Ãæ´¦ÀíÐÔÄÜ²î¶øµ¼ÖÂÎÞ·¨·ÃÎÊÆäËûÒ³Ãæ£¬Ôò»á¶ÔÄ³Ð©Ò³Ãæ²Ù×÷ÉèÖÃ
3. ¶ÔÓÚijЩÉÏ´«»òÕß²»È·¶¨´¦Àíʱ¼äµÄ³¡ºÏ£¬ÔòÐèÒª¶ÔÕû¸öÁ÷³ÌÖÐËùÓг¬Ê±ÉèÖÃΪÎÞÏÞ£¬·ñÔòÈκÎÒ»¸ö»·½ÚÉèÖò»µ±£¬¶¼»áµ¼ÖÂĪÃûÖ´ÐÐÖжÏ
4. ¶à¸öºó¶ËÄ£¿é(MySQL¡¢Memcached¡¢HTTP½Ó¿Ú)£¬ÎªÁË·ÀÖ¹µ¥¸ö½Ó¿ÚÐÔÄÜÌ«²î£¬µ¼ÖÂÕû¸öÇ°Ãæ»ñÈ¡Êý¾ÝÌ«»ºÂý£¬Ó°ÏìÒ³Ãæ´ò¿ªËÙ¶È£¬ÒýÆðÑ©±À
5. ¡£¡£¡£ºÜ¶àÐèÒª³¬Ê±µÄ³¡ºÏ
ÕâЩµØ·½¶¼ÐèÒª¿¼Âdz¬Ê±µÄÉ趨£¬µ«ÊÇPHPÖеij¬Ê±¶¼ÊÇ·ÖÃűðÀ࣬¸÷¸ö´¦Àí·½Ê½ºÍ²ßÂÔ¶¼²»Í¬£¬ÎªÁËϵͳµÄÃèÊö£¬ÎÒ×ܽáÁËPHPÖг£Óõij¬Ê±´¦ÀíµÄ×ܽᡣ
¡¾Web·þÎñÆ÷³¬Ê±´¦Àí¡¿
[ Apache ]
Ò»°ãÔÚÐÔÄܸܺߵÄÇé¿öÏ£¬È±Ê¡ËùÓг¬Ê±ÅäÖö¼ÊÇ30Ã룬µ«ÊÇÔÚÉÏ´«Îļþ£¬»òÕßÍøÂçËٶȺÜÂýµÄÇé¿öÏ£¬ÄÇô¿ÉÄÜ´¥·¢³¬Ê±²Ù×÷¡£
Ŀǰapachefastcgiphp-fpmģʽÏÂÓÐÈý¸ö³¬Ê±ÉèÖãº
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
ȱʡÅäÖÃÊÇ30s£¬Èç¹ûÐèÒª¶¨ÖÆ×Ô¼ºµÄÅäÖã¬ÐèÒªÐÞ¸ÄÅäÖ㬱ÈÈçÐÞ¸ÄΪ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Ò»¸ö½ø³ÌµÄ×ÉúÃüÖÜÆÚ£¬¹ýÆÚÖ®ºóÎÞÌõ¼þkill
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
´úÂëÈçÏÂ:
#ÿ´Îkeep-aliveµÄ×î´óÇëÇóÊý,ĬÈÏÖµÊÇ16
server.max-keep-alive-requests=100
#keep-aliveµÄ×µÈ´ýʱ¼ä,µ¥Î»ÊÇÃ룬ĬÈÏÖµÊÇ5
server.max-keep-alive-idle=1200
#lighttpdµÄwork×Ó½ø³ÌÊý£¬Ä¬ÈÏÖµÊÇ0£¬µ¥½ø³ÌÔËÐÐ
server.max-worker=2
#ÏÞÖÆÓû§ÔÚ·¢ËÍÇëÇóµÄ¹ý³ÌÖУ¬×î´óµÄÖмäÍ£¶Ùʱ¼ä(µ¥Î»ÊÇÃë)£¬
#Èç¹ûÓû§ÔÚ·¢ËÍÇëÇóµÄ¹ý³ÌÖÐ(û·¢ÍêÇëÇó)£¬ÖмäÍ£¶ÙµÄʱ¼äÌ«³¤£¬lighttpd»áÖ÷¶¯¶Ï¿ªÁ¬½Ó
#ĬÈÏÖµÊÇ60(Ãë)
server.max-read-idle=1200
#ÏÞÖÆÓû§ÔÚ½ÓÊÕÓ¦´ðµÄ¹ý³ÌÖУ¬×î´óµÄÖмäÍ£¶Ùʱ¼ä(µ¥Î»ÊÇÃë)£¬
#Èç¹ûÓû§ÔÚ½ÓÊÕÓ¦´ðµÄ¹ý³ÌÖÐ(û½ÓÍê)£¬ÖмäÍ£¶ÙµÄʱ¼äÌ«³¤£¬lighttpd»áÖ÷¶¯¶Ï¿ªÁ¬½Ó
#ĬÈÏÖµÊÇ360(Ãë)
server.max-write-idle=12000
#¶Á¿Í»§¶ËÇëÇóµÄ³¬Ê±ÏÞÖÆ£¬µ¥Î»ÊÇÃë,ÅäΪ0±íʾ²»×÷ÏÞÖÆ
#ÉèÖÃСÓÚ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
˵Ã÷£º
¶ÔÓÚÒ»¸ökeep-aliveÁ¬½ÓÉϵÄÁ¬ÐøÇëÇ󣬷¢Ë͵ÚÒ»¸öÇëÇóÄÚÈݵÄ×î´ó¼ä¸ôÓɲÎÊýmax-read-idle¾ö¶¨£¬´ÓµÚ¶þ¸öÇëÇóÆð£¬·¢ËÍÇëÇóÄÚÈݵÄ×î´ó¼ä¸ôÓɲÎÊýmax-keep-alive-idle¾ö¶¨¡£ÇëÇó¼äµÄ¼ä¸ô³¬Ê±Ò²ÓÉmax-keep-alive-idle¾ö¶¨¡£·¢ËÍÇëÇóÄÚÈݵÄ×Üʱ¼ä³¬Ê±ÓɲÎÊýread-timeout¾ö¶¨¡£LighttpdÓëºó¶Ë½»»¥Êý¾ÝµÄ³¬Ê±ÓÉmax-connection-idle¾ö¶¨¡£
[ Nginx ]
ÅäÖãºnginx.conf
´úÂëÈçÏÂ:
http{
#Fastcgi:(Õë¶Ôºó¶ËµÄfastcgiÉúЧ,fastcgi²»ÊôÓÚproxyģʽ)
fastcgi_connect_timeout5;#Á¬½Ó³¬Ê±
fastcgi_send_timeout10; #д³¬Ê±
fastcgi_read_timeout10;#¶ÁÈ¡³¬Ê±
#Proxy:(Õë¶Ôproxy/upstreamsµÄÉúЧ)
proxy_connect_timeout15s;#Á¬½Ó³¬Ê±
proxy_read_timeout24s;#¶Á³¬Ê±
proxy_send_timeout10s; #д³¬Ê±
}
˵Ã÷£º
Nginx µÄ³¬Ê±ÉèÖõ¹ÊǷdz£ÇåÎúÈÝÒ×Àí½â£¬ÉÏÃæ³¬Ê±Õë¶Ô²»Í¬¹¤×÷ģʽ£¬µ«ÊÇÒòΪ³¬Ê±´øÀ´µÄÎÊÌâÊǷdz£¶àµÄ¡£
¡¾PHP±¾Éí³¬Ê±´¦Àí¡¿
[ PHP-fpm ]
ÅäÖãºphp-fpm.conf
´úÂëÈçÏÂ:
//...
Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.
EquivalenttoApacheMaxClientsdirective.
EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgi
Usedwithanypm_style.
#php-cgiµÄ½ø³ÌÊýÁ¿
128
Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminated
Shouldbeusedwhen'max_execution_time'inioptiondoesnotstopscriptexecutionforsomereason
'0s'means'off'
#php-fpm ÇëÇóÖ´Ðг¬Ê±Ê±¼ä£¬0sΪÓÀ²»³¬Ê±£¬·ñÔòÉèÖÃÒ»¸ö Ns Ϊ³¬Ê±µÄÃëÊý
0s
Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile
'0s'means'off'
0s
˵Ã÷£º
ÔÚphp.iniÖУ¬ÓÐÒ»¸ö²ÎÊýmax_execution_time¿ÉÒÔÉèÖÃPHP½Å±¾µÄ×î´óÖ´ÐÐʱ¼ä£¬µ«ÊÇ£¬ÔÚphp-cgi(php-fpm)ÖУ¬¸Ã²ÎÊý²»»áÆðЧ¡£ÕæÕýÄܹ»¿ØÖÆPHP½Å±¾×î´óÖ´ÐÐʱ£º
0s
¾ÍÊÇ˵Èç¹ûÊÇʹÓÃmod_php5.soµÄģʽÔËÐÐmax_execution_timeÊÇ»áÉúЧµÄ£¬µ«ÊÇÈç¹ûÊÇphp-fpmģʽÖÐÔËÐÐʱ²»ÉúЧµÄ¡£
[ PHP ]
ÅäÖãºphp.ini
Ñ¡Ï
max_execution_time=30
»òÕßÔÚ´úÂëÀïÉèÖãº
ini_set("max_execution_time",30);
set_time_limit(30);
˵Ã÷£º
¶Ôµ±Ç°»á»°ÉúЧ£¬±ÈÈçÉèÖÃ0Ò»Ö±²»³¬Ê±£¬µ«ÊÇÈç¹ûphpµÄsafe_mode´ò¿ªÁË£¬ÕâЩÉèÖö¼»á²»ÉúЧ¡£
Ч¹ûÒ»Ñù£¬µ«ÊǾßÌåÄÚÈÝÐèÒª²Î¿¼php-fpm²¿·ÖÄÚÈÝ£¬Èç¹ûphp-fpmÖÐÉèÖÃÁËrequest_terminate_timeoutµÄ»°£¬ÄÇômax_execution_time¾Í²»ÉúЧ¡£
¡¾ºó¶Ë&½Ó¿Ú·ÃÎʳ¬Ê±¡¿
¡¾HTTP·ÃÎÊ¡¿
Ò»°ãÎÒÃÇ·ÃÎÊHTTP·½Ê½ºÜ¶à£¬Ö÷ÒªÊÇ£ºcurl,socket,file_get_contents()µÈ·½·¨¡£
Èç¹ûÅöµ½¶Ô·½·þÎñÆ÷һֱûÓÐÏìÓ¦µÄʱºò£¬ÎÒÃǾͱ¯¾çÁË£¬ºÜÈÝÒ×°ÑÕû¸ö·þÎñÆ÷¸ãËÀ£¬ËùÒÔÔÚ·ÃÎÊhttpµÄʱºòÒ²ÐèÒª¿¼Âdz¬Ê±µÄÎÊÌâ¡£
[ CURL ·ÃÎÊHTTP]
CURL ÊÇÎÒÃdz£ÓõÄÒ»ÖֱȽϿ¿Æ×µÄ·ÃÎÊHTTPÐÒé½Ó¿ÚµÄlib¿â£¬ÐÔÄܸߣ¬»¹ÓÐһЩ²¢·¢Ö§³ÖµÄ¹¦Äܵȡ£
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ÆÕͨÃë¼¶³¬Ê±£º
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,60);//Ö»ÐèÒªÉèÖÃÒ»¸öÃëµÄÊýÁ¿¾Í¿ÉÒÔ
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
curlÆÕͨÃë¼¶³¬Ê±Ê¹Óãº
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_NOSIGNAL,1);//×¢Ò⣬ºÁÃ볬ʱһ¶¨ÒªÉèÖÃÕâ¸ö
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//³¬Ê±ºÁÃ룬cURL7.16.2Öб»¼ÓÈë¡£´ÓPHP5.2.3Æð¿ÉʹÓÃ
$data=curl_exec($ch);
$curl_errno=curl_errno($ch);
$curl_error=curl_error($ch);
curl_close($ch);
if($curl_errno>0){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}
}else{
//Server
sleep(10);
echo"Done.";
}
?>
ÆäËûһЩ¼¼ÇÉ£º
1. °´ÕÕ¾Ñé×ܽáÊÇ£ºcURL°æ±¾>=libcurl/7.21.0°æ±¾£¬ºÁÃë¼¶³¬Ê±ÊÇÒ»¶¨ÉúЧµÄ£¬Çмǡ£
2. curl_multiµÄºÁÃë¼¶³¬Ê±Ò²ÓÐÎÊÌâ¡£¡£µ¥´Î·ÃÎÊÊÇÖ§³Öms¼¶³¬Ê±µÄ£¬curl_multi²¢Ðе÷¶à¸ö»á²»×¼
[Á÷´¦Àí·½Ê½·ÃÎÊHTTP]
³ýÁËcurl£¬ÎÒÃÇ»¹¾³£×Ô¼ºÊ¹ÓÃfsockopen¡¢»òÕßÊÇfile²Ù×÷º¯ÊýÀ´½øÐÐHTTPÐÒéµÄ´¦Àí£¬ËùÒÔ£¬ÎÒÃǶÔÕâ¿éµÄ³¬Ê±´¦ÀíÒ²ÊDZØÐëµÄ¡£
Ò»°ãÁ¬½Ó³¬Ê±¿ÉÒÔÖ±½ÓÉèÖ㬵«ÊÇÁ÷¶ÁÈ¡³¬Ê±ÐèÒªµ¥¶À´¦Àí¡£
×Ô¼ºÐ´´úÂë´¦Àí:
´úÂëÈçÏÂ:
$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec']);
if($intUSGone>$this->_intReadTimeoutUS){
returnfalse;
}
»òÕßʹÓÃÄÚÖÃÁ÷´¦Àíº¯Êýstream_set_timeout()ºÍstream_get_meta_data()´¦Àí£º
´úÂëÈçÏÂ:
//Timeoutinseconds
$timeout=5;
$fp=fsockopen("example.com",80,$errno,$errstr,$timeout);
if($fp){
fwrite($fp,"GET/HTTP/1.0rn");
fwrite($fp,"Host:example.comrn");
fwrite($fp,"Connection:Closernrn");
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);
$info=stream_get_meta_data($fp);
ob_flush;
flush();
}
if($info['timed_out']){
echo"ConnectionTimedOut!";
}else{
echo$data;
}
}
file_get_contents³¬Ê±£º
´úÂëÈçÏÂ:
$timeout=array(
'http'=>array(
'timeout'=>5//ÉèÖÃÒ»¸ö³¬Ê±Ê±¼ä£¬µ¥Î»ÎªÃë
)
);
$ctx=stream_context_create($timeout);
$text=file_get_contents("http://example.com/",0,$ctx);
?>
fopen³¬Ê±£º
´úÂëÈçÏÂ:
$timeout=array(
'http'=>array(
'timeout'=>5//ÉèÖÃÒ»¸ö³¬Ê±Ê±¼ä£¬µ¥Î»ÎªÃë
)
);
$ctx=stream_context_create($timeout);
if($fp=fopen("http://example.com/","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c;
}
fclose($fp);
}
?>
¡¾MySQL¡¿
phpÖеÄmysql¿Í»§¶Ë¶¼Ã»ÓÐÉèÖó¬Ê±µÄÑ¡ÏmysqliºÍmysql¶¼Ã»ÓУ¬µ«ÊÇlibmysqlÊÇÌṩ³¬Ê±Ñ¡ÏîµÄ£¬Ö»ÊÇÎÒÃÇÔÚphpÖÐÒþ²ØÁ˶øÒÑ¡£
ÄÇôÈçºÎÔÚPHPÖÐʹÓÃÕâ¸ö²Ù×÷Ä󣬾ÍÐèÒªÎÒÃÇ×Ô¼º¶¨ÒåһЩMySQL²Ù×÷³£Á¿£¬Ö÷񻃾¼°µÄ³£Á¿ÓУº
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12;
ÕâÁ½¸ö£¬¶¨ÒåÒԺ󣬿ÉÒÔʹÓÃoptionsÉèÖÃÏàÓ¦µÄÖµ¡£
²»¹ýÓиö×¢Òâµã£¬mysqlÄÚ²¿ÊµÏÖ£º
1.³¬Ê±ÉèÖõ¥Î»ÎªÃ룬×îÉÙÅäÖÃ1Ãë
2.µ«mysqlµ×²ãµÄread»áÖØÊÔÁ½´Î£¬ËùÒÔʵ¼Ê»áÊÇ3Ãë
ÖØÊÔÁ½´Î+¡¡×ÔÉíÒ»´Î=3±¶³¬Ê±Ê±¼ä£¬ÄÇô¾ÍÊÇ˵×îÉÙ³¬Ê±Ê±¼äÊÇ3Ã룬²»»áµÍÓÚÕâ¸öÖµ£¬¶ÔÓڴ󲿷ÖÓ¦ÓÃÀ´Ëµ¿ÉÒÔ½ÓÊÜ£¬µ«ÊǶÔÓÚС²¿·ÖÓ¦ÓÃÐèÒªÓÅ»¯¡£
²é¿´Ò»¸öÉèÖ÷ÃÎÊmysql³¬Ê±µÄ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";
?>
¡¾Memcached¡¿
[PHPÀ©Õ¹]
php_memcache¿Í»§¶Ë£º
Á¬½Ó³¬Ê±£ºboolMemcache::connect(string$host[,int$port[,int$timeout]])
ÔÚgetºÍsetµÄʱºò£¬¶¼Ã»ÓÐÃ÷È·µÄ³¬Ê±ÉèÖòÎÊý¡£
libmemcached¿Í»§¶Ë£ºÔÚphp½Ó¿ÚûÓÐÃ÷ÏԵij¬Ê±²ÎÊý¡£
˵Ã÷£ºËùÒÔ˵£¬ÔÚPHPÖзÃÎÊMemcachedÊÇ´æÔںܶàÎÊÌâµÄ£¬ÐèÒª×Ô¼ºhack²¿·Ö²Ù×÷£¬»òÕßÊDzο¼ÍøÉϲ¹¶¡¡£
[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;
}
//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Ïà¶Ô¡£µ±Ò»¸öÒì²½¹ý³Ìµ÷Ó÷¢³öºó£¬µ÷ÓÃÕß²»ÄÜÁ¢¿ÌµÃµ½½á¹û¡£Êµ¼Ê´¦ÀíÕâ¸öµ÷ÓõIJ¿¼þÔÚÍê³Éºó£¬Í¨¹ý״̬¡¢Í¨ÖªºÍ»Øµ÷À´Í¨Öªµ÷ÓÃÕß¡£Òì²½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{
//there'ssomethingtoreadon$socket
}
}
}
?>
±à³Ì Òì²½¶à·¸´ÓÃIO & ³¬Ê±Á¬½Ó´¦ÀíÀà ±à³Ì
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;
}
}
?>
±±¾©Ð£Çø