찾다
백엔드 개발PHP 튜토리얼PHP超时处理全面总结

概述

在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景:

  1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现
  2. 为了保证Web服务器不会因为当个页面处理性能差而导致无法访问其他页面,则会对某些页面操作设置
  3. 对于某些上传或者不确定处理时间的场合,则需要对整个流程中所有超时设置为无限,否则任何一个环节设置不当,都会导致莫名执行中断
  4. 多个后端模块(MySQL、Memcached、HTTP接口),为了防止单个接口性能太差,导致整个前面获取数据太缓慢,影响页面打开速度,引起雪崩
  5. 。。。很多需要超时的场合

这些地方都需要考虑超时的设定,但是PHP中的超时都是分门别类,各个处理方式和策略都不同,为了系统的描述,我总结了PHP中常用的超时处理的总结。

Web服务器超时处理

Apache

一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时操作。

目前apachefastcgiphp-fpm模式下有三个超时设置:

fastcgi超时设置:

修改httpd.conf的fastcgi连接配置,类似如下:

<IfModulemod_fastcgi.c>FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sockScriptAlias/fcgi-bin/”/home/forum/apache/apache_php/cgi-bin/”AddHandlerphp-fastcgi.phpActionphp-fastcgi/fcgi-bin/php-cgiAddTypeapplication/x-httpd-php.php</IfModule>

缺省配置是30s,如果需要定制自己的配置,需要修改配置,比如修改为100秒:(修改后重启apache):

<IfModulemod_fastcgi.c>FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100ScriptAlias/fcgi-bin/”/home/forum/apache/apache_php/cgi-bin/”AddHandlerphp-fastcgi.phpActionphp-fastcgi/fcgi-bin/php-cgiAddTypeapplication/x-httpd-php.php</IfModule>

如果超时会返回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一个进程的最长生命周期,过期之后无条件killMaxProcessCount最大进程个数DefaultMinClassProcessCount每个程序启动的最小进程个数DefaultMaxClassProcessCount每个程序启动的最大进程个数IPCConnectTimeout程序响应超时时间IPCCommTimeout与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的MaxRequestsPerProcess每个进程最多完成处理个数,达成后自杀

Lighttpd

配置:lighttpd.conf

Lighttpd配置中,关于超时的参数有如下几个(篇幅考虑,只写读超时,写超时参数同理):

主要涉及选项:

server.max-keep-alive-idle=5server.max-read-idle=60server.read-timeout=0server.max-connection-idle=360————————————————–#每次keep-alive的最大请求数,默认值是16server.max-keep-alive-requests=100#keep-alive的最长等待时间,单位是秒,默认值是5server.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决定。

延伸阅读:

http://www.snooda.com/read/244

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 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。

延伸阅读:

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

<?xmlversion=”1.0″?><configuration>//…Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.EquivalenttoApacheMaxClientsdirective.EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgiUsedwithanypm_style.#php-cgi的进程数量<valuename=”max_children”>128</value>Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminatedShouldbeusedwhen’max_execution_time’inioptiondoesnotstopscriptexecutionforsomereason’0s’means’off’#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数<valuename=”request_terminate_timeout”>0s</value>Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile’0s’means’off’<valuename=”request_slowlog_timeout”>0s</value></configuration>

说明:

在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:

<valuename=”request_terminate_timeout”>0s</value>

就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是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的safe_mode打开了,这些设置都会不生效。

效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。

后端&接口访问超时

HTTP访问

一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。

如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。

CURL 访问HTTP

CURL 是我们常用的一种比较靠谱的访问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一个毫秒级超时的例子:

<?phpif(!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{//Serversleep(10);echo”Done.”;}?>

其他一些技巧:

  1. 按照经验总结是:cURL版本>=libcurl/7.21.0版本,毫秒级超时是一定生效的,切记。
  2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准

流处理方式访问HTTP

除了curl,我们还经常自己使用fsockopen、或者是file操作函数来进行HTTP协议的处理,所以,我们对这块的超时处理也是必须的。

一般连接超时可以直接设置,但是流读取超时需要单独处理。

自己写代码处理:

$tmCurrent=gettimeofday();$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000+($tmCurrent['usec']-$tmStart['usec']);if($intUSGone>$this->_intReadTimeoutUS){returnfalse;}

或者使用内置流处理函数stream_set_timeout()和stream_get_meta_data()处理:

<?php//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超时:

<?php$timeout=array('http=>array('timeout'=>5//设置一个超时时间,单位为秒));$ctx=stream_context_create($timeout);$text=file_get_contents("http://example.com/",0,$ctx);?>

fopen超时:

<?php$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实例:

<?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){//getfrompoolmmc=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([email protected]
_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相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步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{//there’ssomethingtoreadon$socket}}}?>

编程 异步多路复用IO & 超时连接处理类 编程

<?phpclassselect{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;}}?>

C&C++中超时实现

一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库(libevent,libev)也能实现。

一、使用alarm中用信号实现超时 (秒级超时)

说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号(也可使用select实现)

用alarym秒级实现 connect设置超时代码示例:

//信号处理函数staticvoidconnect_alarm(intsigno){debug_printf(“SignalHandler”);return;}//alarm超时连接实现staticvoidconn_alarm(){Sigfunc*sigfunc;//现有信号处理函数sigfunc=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”);

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?Apr 23, 2025 am 12:16 AM

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 어떻게 최적화 할 수 있습니까?PHP 세션 성능을 어떻게 최적화 할 수 있습니까?Apr 23, 2025 am 12:13 AM

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?Apr 23, 2025 am 12:10 AM

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서 세션 이름을 어떻게 구성합니까?PHP에서 세션 이름을 어떻게 구성합니까?Apr 23, 2025 am 12:08 AM

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.