ÀÖÓãµç¾º

½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

PHPÖм¸ÖÖ³£¼ûµÄ³¬Ê±´¦ÀíÈ«Ãæ×ܽá

¸üÐÂʱ¼ä: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;

}

}

?>

0 ·ÖÏíµ½£º
ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿