
æšæ¶ãèåãªã³ãã¥ããã£ã
ãŸã第äžã«ãéåžžã«æçšãªãªãœãŒã¹ã«æè¬ããŸãã äœåºŠãé¢çœãã¢ã€ãã¢ãå®çšçãªãã³ããèŠã€ããŸããã
ãã®èšäºã®ç®çã¯ãPHPã§ã»ãã·ã§ã³ã䜿çšããéã®èœãšãç©Žãæããã«ããããšã§ãã ãã¡ãããPHPã®ããã¥ã¡ã³ããšå€ãã®äŸããããŸããããã®èšäºã¯å®å šãªã¬ã€ãã§ã¯ãããŸããã ã»ãã·ã§ã³ãæäœããéã®ãã¥ã¢ã³ã¹ã®äžéšãæããã«ããéçºè ãäžèŠãªæéã®æµªè²»ããä¿è·ããããã«èšèšãããŠããŸãã
ã»ãã·ã§ã³ã䜿çšããæãäžè¬çãªäŸã¯ããã¡ãããŠãŒã¶ãŒèªèšŒã§ãã æ°ããã¿ã¹ã¯ã®åºçŸã«åãããŠäžè²«ããŠéçºããããã«ãæãåºæ¬çãªå®è£ ããå§ããŸãããã
ïŒäŸã®ã¹ããŒã¹ãšæéãç¯çŽããããã«ãçŸããã¯ã©ã¹éå±€ãå æ¬çãªãšã©ãŒåŠçãããã³ãã®ä»ã®æ£ããããšãåããæ¬æ Œçãªãã¹ãã¢ããªã±ãŒã·ã§ã³ãããã§æ§ç¯ããã®ã§ã¯ãªããã»ãã·ã§ã³ãæäœããæ©èœã®ã¿ã«å¶éããŸãïŒã
function startSession() { // , TRUE // ( session.auto_start php.ini - ) if ( session_id() ) return true; else return session_start(); // : 5.3.0 session_start() TRUE . // 5.3.0, session_id() // session_start() } function destroySession() { if ( session_id() ) { // , , setcookie(session_name(), session_id(), time()-60*60*24); // session_unset(); session_destroy(); } }
泚ïŒèªè ã¯PHPã»ãã·ã§ã³ã®åºæ¬çãªç¥èãæã£ãŠãããšç解ãããŠãããããããã§ã¯session_startïŒïŒããã³session_destroyïŒïŒé¢æ°ã®åçã«ã€ããŠã¯èª¬æããŸããã ãã°ã€ã³ãã©ãŒã ãšãŠãŒã¶ãŒèªèšŒã®çµçã®ã¿ã¹ã¯ã¯ãèšäºã®ãããã¯ã«é¢é£ããŠããªããããããããçç¥ããŸãã 以éã®åãªã¯ãšã¹ãã§ãŠãŒã¶ãŒãèå¥ããããã«ãã»ãã·ã§ã³å€æ°å ã«ãŠãŒã¶ãŒèå¥åãä¿åããå¿ èŠãããããšã ããæãåºããŸãïŒããšãã°ãuseridãšããååã§ïŒãããã¯ãã»ãã·ã§ã³ã®åç¶æéå ã®ãã¹ãŠã®åŸç¶ã®ãªã¯ãšã¹ãã§äœ¿çšã§ããŸãã startSessionïŒïŒé¢æ°ã®çµæã®åŠçãå®è£ ããããšãå¿ èŠã§ãã é¢æ°ãFALSEãè¿ããå Žåããã©ãŠã¶ã«ãã°ã€ã³ãã©ãŒã ã衚瀺ããŸãã é¢æ°ãTRUEãè¿ããèš±å¯ãŠãŒã¶ãŒã®èå¥åïŒãã®å Žåã¯useridïŒãå«ãã»ãã·ã§ã³å€æ°ãååšããå Žåãèš±å¯ãŠãŒã¶ãŒã®ããŒãžã衚瀺ããŸãïŒãšã©ãŒåŠçã®è©³çŽ°ã«ã€ããŠã¯ãã»ãã·ã§ã³å€æ°ã«é¢ããã»ã¯ã·ã§ã³ã®2013-06-07ã®è¿œå ãåç §ããŠãã ããïŒã
ãããŸã§ã®ãšããããã¹ãŠãæ確ã§ãã 質åã¯ããŠãŒã¶ãŒã®éã¢ã¯ãã£ãïŒã»ãã·ã§ã³ã¿ã€ã ã¢ãŠãïŒã®å¶åŸ¡ãå®è£ ãã1ã€ã®ãã©ãŠã¶ãŒã§è€æ°ã®ãŠãŒã¶ãŒã®åææäœãå¯èœã«ããã»ãã·ã§ã³ãäžæ£äœ¿çšããä¿è·ããå¿ èŠããããšãã«å§ãŸããŸãã ããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
PHPãã«ãã€ã³ã«ãããŠãŒã¶ãŒã®éã¢ã¯ãã£ãç¶æ ã®ç£èŠ
ãŠãŒã¶ãŒåãã®ããããçš®é¡ã®ã³ã³ãœãŒã«ã®éçºè ã®éã§ããçºçããæåã®è³ªåã¯ããŠãŒã¶ãŒåŽã§ã¢ã¯ãã£ããã£ããªãå Žåã®ã»ãã·ã§ã³ã®èªåçµäºã§ãã PHPã®çµã¿èŸŒã¿æ©èœã䜿çšããŠãããè¡ããããç°¡åãªããšã¯ãããŸããã ïŒãã®ãªãã·ã§ã³ã¯ç¹ã«ä¿¡é Œæ§ãé«ãæè»ã§ã¯ãããŸããããå®å šæ§ã®ããã«èæ ®ããŠãã ããïŒã
function startSession() { // ( ) $sessionLifetime = 300; if ( session_id() ) return true; // ini_set('session.cookie_lifetime', $sessionLifetime); // , // : production- php.ini if ( $sessionLifetime ) ini_set('session.gc_maxlifetime', $sessionLifetime); if ( session_start() ) { setcookie(session_name(), session_id(), time()+$sessionLifetime); return true; } else return false; }
å°ã説æã ãåãã®ããã«ãPHPã¯ããªã¯ãšã¹ãããããŒã§ãã©ãŠã¶ããéä¿¡ãããCookieã®ååã«ãã£ãŠãéå§ããã»ãã·ã§ã³ã決å®ããŸãã ãã©ãŠã¶ãŒã¯ããã®cookieããµãŒããŒããåãåããsession_startïŒïŒé¢æ°ããããé 眮ããŸãã Cookieããã©ãŠã¶ã§æéåãã«ãªããšããªã¯ãšã¹ãã§ã¯éä¿¡ãããŸãããã€ãŸããPHPã¯ã©ã®ã»ãã·ã§ã³ãéå§ããå¿ èŠãããããå€æã§ãããæ°ããã»ãã·ã§ã³ã®äœæãšèŠãªããŸãã PHPã®session.gc_maxlifetimeèšå®ãã©ã¡ãŒã¿ãŒã¯ããŠãŒã¶ãŒã®éã¢ã¯ãã£ãã®ã¿ã€ã ã¢ãŠãã«çããèšå®ãããPHPã»ãã·ã§ã³ã®æå¹æéãèšå®ãããµãŒããŒã«ãã£ãŠå¶åŸ¡ãããŸãã ã»ãã·ã§ã³ã©ã€ãã¿ã€ã ã³ã³ãããŒã«ã¯æ¬¡ã®ããã«æ©èœããŸãïŒããã§ã¯ãäžæãã¡ã€ã«ã®ã»ãã·ã§ã³ã¹ãã¬ãŒãžã®äŸãæãäžè¬çã§ãããããã©ã«ãã§PHPãªãã·ã§ã³ã«ã€ã³ã¹ããŒã«ãããŠãããšèããŠããŸãïŒã
PHPèšå®ãã©ã¡ãŒã¿ãŒsession.save_pathã«ã»ãã·ã§ã³ãä¿åããããã®ãã£ã¬ã¯ããªãšããŠèšå®ããããã£ã¬ã¯ããªã«æ°ããã»ãã·ã§ã³ãäœæãããšãsess_ <sessionid>ãšããååã®ãã¡ã€ã«ãäœæãããŸããããã§ã<sessionid>ã¯ã»ãã·ã§ã³èå¥åã§ãã ããã«ãåãªã¯ãšã¹ãã§ãæ¢åã®ã»ãã·ã§ã³ã®éå§æã«ãPHPã¯ãã®ãã¡ã€ã«ã®å€æŽæéãæŽæ°ããŸãã ãããã£ãŠãåŸç¶ã®åãªã¯ãšã¹ãã§ãPHPã¯ãçŸåšã®æå»ãšã»ãã·ã§ã³ãã¡ã€ã«ã®æçµå€æŽæå»ã®å·®ã«ãããã»ãã·ã§ã³ãã¢ã¯ãã£ãã§ãããããã®æå¹æéãæ¢ã«åããŠããããå€æã§ããŸãã ïŒå€ãã»ãã·ã§ã³ãã¡ã€ã«ãåé€ããã¡ã«ããºã ã«ã€ããŠã¯ã次ã®ã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãïŒã
æ³šïŒ session.gc_maxlifetimeãã©ã¡ãŒã¿ãŒã¯ãåããµãŒããŒå ïŒããæ£ç¢ºã«ã¯ãåãã¡ã€ã³PHPããã»ã¹å ïŒã®ãã¹ãŠã®ã»ãã·ã§ã³ã«åœ±é¿ããããšã«æ³šæããŠãã ããã å®éã«ã¯ãããã¯ãè€æ°ã®ãµã€ãããµãŒããŒäžã§å®è¡ãããŠãããåãµã€ãã«ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ããªãããã«ç¬èªã®ã¿ã€ã ã¢ãŠããããå Žåããµã€ãã®1ã€ã§ãã®ãã©ã¡ãŒã¿ãŒãèšå®ãããšãä»ã®ãµã€ãã®ã€ã³ã¹ããŒã«ã«ã€ãªããããšãæå³ããŸãã å ±æãã¹ãã£ã³ã°ã«ã€ããŠãåãããšãèšããŸãã ãã®ç¶æ³ãåé¿ããããã«ãåããµãŒããŒå ã®ãµã€ãããšã«åå¥ã®ã»ãã·ã§ã³ãã£ã¬ã¯ããªã䜿çšãããŸãã ã»ãã·ã§ã³ãã£ã¬ã¯ããªãžã®ãã¹ã¯ãphp.inièšå®ãã¡ã€ã«ã®session.save_pathãã©ã¡ãŒã¿ãŒã䜿çšããŠããŸãã¯ini_setïŒïŒé¢æ°ãåŒã³åºããŠèšå®ããŸãã ãã®åŸãåãµã€ãã®ã»ãã·ã§ã³ã¯å¥ã ã®ãã£ã¬ã¯ããªã«ä¿åãããããããã®ãµã€ãã«èšå®ãããsession.gc_maxlifetimeãã©ã¡ãŒã¿ã¯ãã®ã»ãã·ã§ã³ã§ã®ã¿æå¹ã«ãªããŸãã ç¹ã«åšåº«ã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®äžè¶³ãå¶åŸ¡ããããã®ããæè»ãªãªãã·ã§ã³ãããããããã®ã±ãŒã¹ã詳现ã«æ€èšããŸããã
ã»ãã·ã§ã³å€æ°ã䜿çšããŠãŠãŒã¶ãŒã®éã¢ã¯ãã£ããç£èŠãã
以åã®ããŒãžã§ã³ã¯ããã®ã·ã³ãã«ãïŒã»ãã®æ°è¡ã®è¿œå ã³ãŒãïŒã§ãå¿ èŠãªãã®ãã¹ãŠãæäŸããŠããããã«æãããŸãã ãããããã¹ãŠã®ãªã¯ãšã¹ãããŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®çµæãšã¿ãªããããã§ã¯ãªãå Žåã¯ã©ãã§ããããã ããšãã°ãã¿ã€ããŒãããŒãžã«ã€ã³ã¹ããŒã«ãããAJAXèŠæ±ãå®æçã«å®è¡ããŠãµãŒããŒããæŽæ°ãåä¿¡ããŸãã ãã®ãããªèŠæ±ã¯ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ãšèŠãªãããšã¯ã§ããŸãããã€ãŸãããã®å Žåãã»ãã·ã§ã³ã©ã€ãã¿ã€ã ã®èªå延é·ã¯æ£ãããããŸããã ãã ããPHPã¯session_startïŒïŒé¢æ°ãåŒã³åºããã³ã«ã»ãã·ã§ã³ãã¡ã€ã«ã®å€æŽæéãèªåçã«æŽæ°ããããããªã¯ãšã¹ãã«ãã£ãŠã»ãã·ã§ã³ã®æå¹æéã延é·ããããŠãŒã¶ãŒã®éã¢ã¯ãã£ãã¿ã€ã ã¢ãŠãã¯çºçããŸããã ããã«ãsession.gc_maxlifetimeãã©ã¡ãŒã¿ãŒã®è€éãã«é¢ããåã®ã»ã¯ã·ã§ã³ã®æåŸã®ã¡ã¢ã¯ãå®è£ ãé£ãããšæããããããããŸããã
ãã®åé¡ã解決ããããã«ãçµã¿èŸŒã¿ã®PHPã¡ã«ããºã ã®äœ¿çšãæåŠãããŠãŒã¶ãŒãéã¢ã¯ãã£ããªæéãç¬èªã«å¶åŸ¡ã§ããæ°ããã»ãã·ã§ã³å€æ°ãããã€ãå°å ¥ããŸãã
function startSession($isUserActivity=true) { $sessionLifetime = 300; if ( session_id() ) return true; // ( ) ini_set('session.cookie_lifetime', 0); if ( ! session_start() ) return false; $t = time(); if ( $sessionLifetime ) { // , // , // ( , lastactivity) if ( isset($_SESSION['lastactivity']) && $t-$_SESSION['lastactivity'] >= $sessionLifetime ) { // , , // , , destroySession(); return false; } else { // , // , // lastactivity , // sessionLifetime if ( $isUserActivity ) $_SESSION['lastactivity'] = $t; } } return true; }
ãŸãšãããšã åãªã¯ãšã¹ãã§ãæåŸã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ç¬éããçŸåšã®ç¬éãŸã§ã¿ã€ã ã¢ãŠãã«éãããã©ããããã§ãã¯ããããã«éããå Žåãã»ãã·ã§ã³ãç Žæ£ããŠæ©èœãäžæããFALSEãè¿ããŸãã ã¿ã€ã ã¢ãŠãã«éãããå€TRUEã®ãã©ã¡ãŒã¿ãŒ$ isUserActivityãé¢æ°ã«æž¡ãããå ŽåãæåŸã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®æéãæŽæ°ããŸãã ããšã¯ãåŒã³åºãã¹ã¯ãªããã§ãªã¯ãšã¹ãããŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®çµæã§ãããã©ãããå€æããããã§ãªãå Žåã¯ããã©ã¡ãŒã¿ãŒå€$ isUserActivityãFALSEã«èšå®ããŠstartSessioné¢æ°ãåŒã³åºããŸãã
2013幎6æ7æ¥ã«æŽæ°
sessionStartïŒïŒé¢æ°ã®çµæã®åŠç
ã³ã¡ã³ãã¯ãFALSEãè¿ãããŠããšã©ãŒã®åå ãå®å šã«ç解ã§ããªããšããäºå®ã«æ³šæãåèµ·ããŸããããããã¯å®å šã«çå®ã§ãã ããã§è©³çŽ°ãªãšã©ãŒåŠçãå ¬éããŸããã§ããïŒèšäºã®ããªã¥ãŒã ã¯ããã»ã©å°ãããããŸããïŒãããã¯èšäºã®ãããã¯ã«çŽæ¥é¢ä¿ããªãããã§ãã ããããã³ã¡ã³ããããã°ããããæ確ã«ããŸãã
ã芧ã®ãšãããsessionStarté¢æ°ã¯2ã€ã®å Žåã«FALSEãè¿ããŸãã å éšãµãŒããŒãšã©ãŒïŒphp.iniã®äžé©åãªã»ãã·ã§ã³èšå®ãªã©ïŒãåå ã§ã»ãã·ã§ã³ãéå§ã§ããªãã£ãããã»ãã·ã§ã³ã®æå¹æéãåããŠããŸãã æåã®ã±ãŒã¹ã§ã¯ããµãŒããŒã«åé¡ãããããšãšãµããŒããµãŒãã¹ãžã®é£çµ¡æ¹æ³ã瀺ããšã©ãŒãå«ãããŒãžã«ãŠãŒã¶ãŒã転éããå¿ èŠããããŸãã 2çªç®ã®ã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒããã°ã€ã³ãã©ãŒã ã«è»¢éããã»ãã·ã§ã³ã«æå¹æéãåããããšã瀺ã察å¿ããã¡ãã»ãŒãžã衚瀺ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ããšã©ãŒã³ãŒããå ¥åããFALSEã§ã¯ãªã察å¿ããã³ãŒããè¿ãå¿ èŠããããŸããåŒã³åºãå ã®ã¡ãœããã§ããã確èªããããã«å¿ããŠåäœããŸãã
ããã§ããµãŒããŒäžã®ã»ãã·ã§ã³ããŸã ååšããŠããŠãããŠãŒã¶ãŒã®éã¢ã¯ãã£ãã¿ã€ã ã¢ãŠããæéåãã«ãªããšãæåã«ã¢ã¯ã»ã¹ãããšãã«ã»ãã·ã§ã³ãç Žæ£ãããŸãã ãããŠãããã¯ãã°ããŒãã«PHPèšå®ã§èšå®ãããŠããã»ãã·ã§ã³ã©ã€ãã¿ã€ã ã«é¢ä¿ãªãçºçããŸãã
泚ïŒãã©ãŠã¶ãŒãéããããã»ãã·ã§ã³åã®Cookieãèªåçã«ç Žæ£ãããå Žåã¯ã©ããªããŸããïŒ æ¬¡åãã©ãŠã¶ãéãããšãã®ãµãŒããŒãžã®èŠæ±ã«ã¯ã»ãã·ã§ã³Cookieãå«ãŸããããµãŒããŒã¯ã»ãã·ã§ã³ãéããŠãŠãŒã¶ãŒã®éã¢ã¯ãã£ãã®ã¿ã€ã ã¢ãŠãã確èªã§ããŸããã ç§ãã¡ã«ãšã£ãŠãããã¯æ°ããã»ãã·ã§ã³ãäœæããããšãšåçã§ãããæ©èœãšã»ãã¥ãªãã£ã«ã¯åœ±é¿ããŸããã ããããå ¬æ£ãªçåãçããŸã-誰ãå€ãã»ãã·ã§ã³ãç Žæ£ããŸããããããŸã§ã«ã¿ã€ã ã¢ãŠãåŸã«ç Žæ£ããå ŽåïŒ ãŸãã¯ãã»ãã·ã§ã³ãã£ã¬ã¯ããªã§æ°žä¹ ã«ãã³ã°ããŸããïŒ PHPã®å€ãã»ãã·ã§ã³ãã¯ãªã¢ããããã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãšåŒã°ããã¡ã«ããºã ããããŸãã ãµãŒããŒãžã®æ¬¡ã®èŠæ±ã®ç¬éã«éå§ãããã»ãã·ã§ã³ãã¡ã€ã«ã®æåŸã®å€æŽã®æ¥ä»ã«åºã¥ããŠãã¹ãŠã®å€ãã»ãã·ã§ã³ãã¯ãªãŒãã³ã°ããŸãã ãã ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ã¯ããµãŒããŒãžã®ãã¹ãŠã®èŠæ±ã§éå§ãããããã§ã¯ãããŸããã èµ·åã®é »åºŠïŒãŸãã¯ç¢ºçïŒã¯ãsession.gc_probabilityããã³session.gc_divisorèšå®ã®2ã€ã®èšå®ã«ãã£ãŠæ±ºãŸããŸãã æåã®ãã©ã¡ãŒã¿ãŒã2çªç®ã®ãã©ã¡ãŒã¿ãŒã§é€ç®ããçµæã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ãããªã¬ãŒãã確çã§ãã ãããã£ãŠããµãŒããŒãžã®ãã¹ãŠã®èŠæ±ã§ã»ãã·ã§ã³ã¯ãªãŒãã³ã°ã¡ã«ããºã ãèµ·åããã«ã¯ããããã®ãã©ã¡ãŒã¿ãŒãåãå€ïŒããšãã°ã1ãïŒã«èšå®ããå¿ èŠããããŸãã ãã®ã¢ãããŒãã«ãããã»ãã·ã§ã³ãã£ã¬ã¯ããªã¯ã¯ãªãŒã³ã«ãªããŸãããæããã«ãµãŒããŒã«ãšã£ãŠã¯é«ãããŸãã ãããã£ãŠãå®åã·ã¹ãã ã§ã¯ãsession.gc_divisorã®ããã©ã«ãå€ã¯1000ã«èšå®ãããŸããã€ãŸããã¬ãŒãããžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ã¯1/1000ã®ç¢ºçã§éå§ãããŸãã php.iniãã¡ã€ã«ã§ãããã®èšå®ãè©ŠããŠã¿ããšãäžèšã®å Žåããã©ãŠã¶ããã¹ãŠã®CookieãéããŠã¯ãªã¢ããŠããå€ãã»ãã·ã§ã³ãã»ãã·ã§ã³ãã£ã¬ã¯ããªã«ãã°ããæ®ãããšããããŸãã ããããããã¯ããªããå¿é ããªãã§ãã ããããªããªã ãã§ã«è¿°ã¹ãããã«ãããã¯ç§ãã¡ã®ã¡ã«ããºã ã®ã»ãã¥ãªãã£ã«æ±ºããŠåœ±é¿ããŸããã
2013幎6æ7æ¥ã«æŽæ°
ã»ãã·ã§ã³ãã¡ã€ã«ã®ããã¯ã«ããã¹ã¯ãªããã®ããªãŒãºã®é²æ¢
ã³ã¡ã³ãã§ã¯ãã»ãã·ã§ã³ãã¡ã€ã«ã®ãããã¯ã«ããåæå®è¡ã¹ã¯ãªããã®ãã³ã°ã«é¢ãã質åãæèµ·ãããŸããïŒæãæãããªãã·ã§ã³-é·ãããŒãªã³ã°ãšããŠïŒã
ãŸãããã®åé¡ã¯ãµãŒããŒã®è² è·ããŠãŒã¶ãŒæ°ã«çŽæ¥äŸåããªãããšã«æ³šæããŠãã ããã ãã¡ããããªã¯ãšã¹ããå€ãã»ã©ãã¹ã¯ãªããã®å®è¡ã¯é ããªããŸãã ããããããã¯éæ¥çãªäŸåé¢ä¿ã§ãã ãã®åé¡ã¯ããµãŒããŒã1人ã®ãŠãŒã¶ãŒã«ä»£ãã£ãŠè€æ°ã®ãªã¯ãšã¹ããåä¿¡ããå Žåã«ãåãã»ãã·ã§ã³å ã§ã®ã¿è¡šç€ºãããŸãïŒããšãã°ããã®ãã¡ã®1人ã¯ãã³ã°ããŒãªã³ã°ã§ãæ®ãã¯éåžžã®ãªã¯ãšã¹ãã§ãïŒã åãªã¯ãšã¹ãã¯åãã»ãã·ã§ã³ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããããšããŸããåã®ãªã¯ãšã¹ãããã¡ã€ã«ã®ããã¯ã解é€ããªãã£ãå Žåã次ã®ãªã¯ãšã¹ãã¯ãã³ã°ããŸãã
ã»ãã·ã§ã³ãã¡ã€ã«ã®ããã¯ãæå°éã«æããããã«ãã»ãã·ã§ã³å€æ°ã䜿çšãããã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®äºããçŽåŸã«session_write_closeïŒïŒé¢æ°ãåŒã³åºããŠã»ãã·ã§ã³ãéããããšã匷ããå§ãããŸãã å®éã«ã¯ãããã¯ãã»ãã·ã§ã³å€æ°ã«ãã¹ãŠãä¿åããŠãã¹ã¯ãªããã®å®è¡äžã«ããããåç §ããªãããšãæå³ããŸãã ã»ãã·ã§ã³å€æ°ã«äœæ¥ããŒã¿ãä¿åããå¿ èŠãããå Žåã¯ãã»ãã·ã§ã³ã®éå§æã«ããã«èªã¿åããåŸã§äœ¿çšããããã«ããŒã«ã«å€æ°ã«ä¿åããŠã»ãã·ã§ã³ãéããŸãïŒsession_destroyã䜿çšããŠã»ãã·ã§ã³ãç Žæ£ããã®ã§ã¯ãªããsession_write_closeé¢æ°ã䜿çšããŠã»ãã·ã§ã³ãéããããšãæå³ããŸãïŒã
ãã®äŸã§ã¯ãã»ãã·ã§ã³ãéããŠãã®æå¹æéãšæ¿èªããããŠãŒã¶ãŒã®ååšã確èªããçŽåŸã«ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªè¿œå ã®ã»ãã·ã§ã³å€æ°ïŒååšããå ŽåïŒããã¹ãŠèªã¿åã£ãŠä¿åããsession_write_closeïŒïŒãåŒã³åºããŠã»ãã·ã§ã³ãéããç¶è¡ããå¿ èŠãããããšãæå³ããŸãé·ãããŒãªã³ã°ã§ãéåžžã®ã¯ãšãªã§ããã¹ã¯ãªããã®å®è¡ã
ã»ãã·ã§ã³ãäžæ£äœ¿çšããä¿è·ãã
ç¶æ³ãæ³åããŠãã ããã ãŠãŒã¶ãŒã®1人ããã©ãŠã¶CookieïŒã»ãã·ã§ã³ãä¿åãããŠããïŒã奪ããæå®ãããé»åã¡ãŒã«ã«éä¿¡ããããã€ã®æšéŠ¬ããã£ããããŸãã æ»æè ã¯Cookieãåãåããããã䜿çšããŠèš±å¯ãŠãŒã¶ãŒã«ä»£ãã£ãŠãªã¯ãšã¹ããåœè£ ããŸãã ãµãŒããŒã¯ãèš±å¯ããããŠãŒã¶ãŒããã®èŠæ±ã§ãããã®ããã«ããã®èŠæ±ãæ£åžžã«åãå ¥ããŠåŠçããŸãã IPã¢ãã¬ã¹ã®è¿œå æ€èšŒãå®è£ ãããŠããªãå Žåããã®ãããªæ»æã«ããããŠãŒã¶ãŒã¢ã«ãŠã³ãã®ãããã³ã°ãæåãããã®åŸã®çµæããã¹ãŠããããããŸãã
ãªããããå¯èœã§ããïŒ æããã«ãã»ãã·ã§ã³ã®ååãšèå¥åã¯ã»ãã·ã§ã³ã®å šæéãéããŠåžžã«åãã§ããããã®ããŒã¿ãååŸãããšãå¥ã®ãŠãŒã¶ãŒã«ä»£ãã£ãŠïŒåœç¶ããã®ã»ãã·ã§ã³ã®æå¹æéå ã«ïŒãªã¯ãšã¹ããèªç±ã«éä¿¡ã§ããŸãã ããããããã¯æãäžè¬çãªã¿ã€ãã®æ»æã§ã¯ãããŸããããçè«çã«ã¯ãã¹ãŠãå®è¡å¯èœã§ããããã«èŠããŸããç¹ã«ããã®ãããªããã€ã®æšéŠ¬ã¯ãŠãŒã¶ãŒã®ãã©ãŠã¶Cookieã奪ã管çè æš©éããå¿ èŠãšããªãããšãèãããš
ãã®çš®ã®æ»æããã©ã®ããã«èº«ãå®ãããšãã§ããŸããïŒ ç¹°ãè¿ããŸãããæããã«ãã»ãã·ã§ã³èå¥åã®æå¹æéãå¶éããåãã»ãã·ã§ã³å ã§èå¥åãå®æçã«å€æŽããŸãã ãŸããã»ãã·ã§ã³ã®ååãå€æŽããŠãå€ãã»ãã·ã§ã³ãå®å šã«åé€ããŠæ°ããã»ãã·ã§ã³ãäœæããå€ãã»ãã·ã§ã³å€æ°ãããã¹ãŠã®ã»ãã·ã§ã³å€æ°ãã³ããŒããããšãã§ããŸãã ããããããã¯ã¢ãããŒãã®æ¬è³ªã«åœ±é¿ãäžããªããããç°¡åã«ããããã«ãã»ãã·ã§ã³èå¥åã«éå®ããŠããŸãã
ã»ãã·ã§ã³IDã®æå¹æéãçãã»ã©ãæ»æè ããŠãŒã¶ãŒã®ãªã¯ãšã¹ããåœé ããããã«Cookieãåãåã£ãŠäœ¿çšããæéãçããªãããšã¯æããã§ãã çæ³çãªã±ãŒã¹ã§ã¯ãåãªã¯ãšã¹ãã«æ°ããèå¥åã䜿çšããå¿ èŠããããŸããããã«ãããä»ã®èª°ãã®ã»ãã·ã§ã³ã䜿çšããå¯èœæ§ãæå°éã«æããããŸãã ãã ããã»ãã·ã§ã³èå¥åã®åçææéãä»»æã«èšå®ãããäžè¬çãªã±ãŒã¹ãæ€èšããŸãã
ïŒãã§ã«èæ ®ãããŠããã³ãŒãã®éšåã¯çç¥ããŸãïŒã
function startSession($isUserActivity=true) { // $idLifetime = 60; ... if ( $idLifetime ) { // , // , // ( , starttime) if ( isset($_SESSION['starttime']) ) { if ( $t-$_SESSION['starttime'] >= $idLifetime ) { // // session_regenerate_id(true); $_SESSION['starttime'] = $t; } } else { // , // $_SESSION['starttime'] = $t; } } return true; }
ãã®ãããæ°ããã»ãã·ã§ã³ãäœæãããšãïŒãŠãŒã¶ãŒãæ£åžžã«ãã°ã€ã³ãããšãã«çºçããŸãïŒãstarttimeã»ãã·ã§ã³å€æ°ãèšå®ããŸããããã¯ãæåŸã®ã»ãã·ã§ã³IDçæã®æå»ãçŸåšã®ãµãŒããŒæå»ãšçããå€ã«æ ŒçŽããŸãã 次ã«ãåãªã¯ãšã¹ãã§ãèå¥åã®æåŸã®çæããååãªæéãçµéãããïŒidLifetimeïŒã確èªããçµéããå Žåã¯æ°ããèå¥åãçæããŸãã ãããã£ãŠãèå¥åã®èšå®ãããæå¹æéäžã«ãèš±å¯ããããŠãŒã¶ãŒã®Cookieãåãåã£ãæ»æè ãããã䜿çšããããšãã§ããªãã£ãå ŽåããµãŒããŒã¯åœã®ãªã¯ãšã¹ããäžæ£ãšã¿ãªããæ»æè ã¯ãã°ã€ã³ããŒãžã«ãªãã€ã¬ã¯ããããŸãã
æ³šïŒ session_startïŒïŒãšåæ§ã«æ°ããcookieãéä¿¡ããsession_regenerate_idïŒïŒé¢æ°ãåŒã³åºããšãæ°ããã»ãã·ã§ã³IDããã©ãŠã¶ãŒã®cookieã«å ¥ããŸãããããã£ãŠãcookieãèªåã§æŽæ°ããå¿ èŠã¯ãããŸããã
ã»ãã·ã§ã³ãå¯èœãªéãä¿è·ãããå Žåã¯ãèå¥åã®æå¹æéã1ã«èšå®ããããsession_regenerate_idïŒïŒé¢æ°ãè§ãã£ãããå€ãããã¹ãŠã®ãã§ãã¯ãåé€ããã ãã§ååã§ããããã«ãããåãªã¯ãšã¹ãã§èå¥åãåçæãããŸãã ïŒãã®ã¢ãããŒãã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ç¢ºèªããŸããã§ããããsession_regenerate_idïŒtrueïŒé¢æ°ã¯æ¬è³ªçã«4ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠãããšããèšããŸããïŒæ°ããèå¥åã®çæãã»ãã·ã§ã³Cookieããã®ããããŒã®äœæãå€ãCookieã®åé€ãæ°ããã»ãã·ã§ã³ãã¡ã€ã«ã®äœæïŒã
åæ çãªäœè«ïŒããã€ã®æšéŠ¬ãéåžžã«è³¢ããæ»æè ã«Cookieãéä¿¡ããªãããCookieãåä¿¡ãããšããã«äºåã«æºåãããåœã®ãªã¯ãšã¹ããéä¿¡ããããã«ãªã£ãå Žåãäžèšã®æ¹æ³ã¯ããã®ãããªæ»æããä¿è·ã§ããªãå¯èœæ§ãé«ãåœã®ãªã¯ãšã¹ããéä¿¡ããŠãå®è³ªçã«éãã¯ãããŸãããçŸæç¹ã§ã¯ãã»ãã·ã§ã³èå¥åã¯åçæãããªãå¯èœæ§ããããŸãã
è€æ°ã®ãŠãŒã¶ãŒã«ä»£ãã£ãŠ1ã€ã®ãã©ãŠã¶ãŒã§åæã«äœæ¥ããæ©èœ
æåŸã«æ€èšãããã®ã¯ãè€æ°ã®ãŠãŒã¶ãŒãåããã©ãŠã¶ãŒã§åæã«äœæ¥ããå¯èœæ§ã§ãããã®æ©èœã¯ããŠãŒã¶ãŒã®åææäœããšãã¥ã¬ãŒãããå¿ èŠããããã¹ã段éã§ç¹ã«åœ¹ç«ã¡ãŸãã䜿çšå¯èœãªæŠåšåº«å šäœã䜿çšããããã·ãŒã¯ã¬ããã¢ãŒãã§ãã©ãŠã¶ãŒã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãéãããããã®ã§ã¯ãªãããæ°ã«å ¥ãã®ãã©ãŠã¶ãŒã§å®è¡ããããšããå§ãããŸãã
åã®äŸã§ã¯ãã»ãã·ã§ã³åãæ瀺çã«æå®ããªãã£ããããããã©ã«ãã§èšå®ãããååïŒPHPSESSIDïŒã䜿çšããŸãããããã¯ããããŸã§ã«äœæãããã¹ãŠã®ã»ãã·ã§ã³ããPHPSESSIDãšããååã§ãã©ãŠã¶ãŒã«Cookieãéä¿¡ããããšãæå³ããŸããæããã«ãCookieåãåžžã«åãå Žåãåããã©ãŠã¶ãŒå ã§åãååã®2ã€ã®ã»ãã·ã§ã³ãæŽçããæ¹æ³ã¯ãããŸããããã ãããŠãŒã¶ãŒããšã«ç¬èªã®ã»ãã·ã§ã³åã䜿çšãããšãåé¡ã¯è§£æ±ºããŸãããã£ãŠã¿ãŸãããã
function startSession($isUserActivity=true, $prefix=null) { ... if ( session_id() ) return true; // , // , , // (, MYPROJECT) session_name('MYPROJECT'.($prefix ? '_'.$prefix : '')); ini_set('session.cookie_lifetime', 0); if ( ! session_start() ) return false; ... }
ããã§ãåŒã³åºãã¹ã¯ãªãããåãŠãŒã¶ãŒã®startSessionïŒïŒé¢æ°ã«äžæã®ãã¬ãã£ãã¯ã¹ãæž¡ãããšã確èªããå¿ èŠããããŸããããã¯ãããšãã°ãåãªã¯ãšã¹ãã®GET / POSTãã©ã¡ãŒã¿ã«ãã¬ãã£ãã¯ã¹ãæž¡ãããè¿œå ã®Cookieã䜿çšããŠè¡ãããšãã§ããŸãã
ãããã«
çµè«ãšããŠãäžèšã§èª¬æãããã¹ãŠã®ã¿ã¹ã¯ãå«ããPHPã»ãã·ã§ã³ãæäœããããã®é¢æ°ã®å®å šãªæçµã³ãŒããæäŸããŸãã
function startSession($isUserActivity=true, $prefix=null) { $sessionLifetime = 300; $idLifetime = 60; if ( session_id() ) return true; session_name('MYPROJECT'.($prefix ? '_'.$prefix : '')); ini_set('session.cookie_lifetime', 0); if ( ! session_start() ) return false; $t = time(); if ( $sessionLifetime ) { if ( isset($_SESSION['lastactivity']) && $t-$_SESSION['lastactivity'] >= $sessionLifetime ) { destroySession(); return false; } else { if ( $isUserActivity ) $_SESSION['lastactivity'] = $t; } } if ( $idLifetime ) { if ( isset($_SESSION['starttime']) ) { if ( $t-$_SESSION['starttime'] >= $idLifetime ) { session_regenerate_id(true); $_SESSION['starttime'] = $t; } } else { $_SESSION['starttime'] = $t; } } return true; } function destroySession() { if ( session_id() ) { session_unset(); setcookie(session_name(), session_id(), time()-60*60*24); session_destroy(); } }
ãã®èšäºããã»ãã·ã§ã³ã®ã¡ã«ããºã ãå®éã«è©³ãã調ã¹ãããšã®ãªã人ã®ããã«å°ãæéãç¯çŽããPHPã«æ £ãå§ããã°ããã®äººã«ãã®ã¡ã«ããºã ã®ååãªç解ãäžããããšãé¡ã£ãŠããŸãã