PHP长连接session被独占,通过解释SESSION文件来验证SESSION内容
最近我在尝试用PHP来实现Comet技术,为了保证系统的权限等问题,所以要进行用户登录验证。但代码实现后,基本功能没问题,但是系统的访问性能明显下降了,变得一直在等待。网友的解释是:当用到php的长连接的时候,如果使用了session,则第一次请求的时候session被独占,第二次请求(同浏览器的不同窗口)则要等到第一次运行
结束了才能运行。
比如如下代码:
<?php
set_time_limit(20);
session_start();
header('Cache-Control', 'no-store, no-cache, must-revalidate');
while (@ob_end_clean());
for($i=0; $i<25; $i++) {
print date('h:i:s') . "\n";
flush();
sleep(2);
}
?>
但是,
当我们去掉
session_start
(
)
;
这
样就能解决了吗?还不行。我们还要给url加个参数让两个页面的url不同才行。有些浏览器为了安全,不让同时打开同一页面,得排队。
-----------------------------------------------------------------------------------------------------------------------------------
最后我验证用户是否已经登录的方法是:
define('PS_DELIMITER', '|');
define('PS_UNDEF_MARKER', '!');
function session_real_decode($str){
$str = (string)$str;
$endptr = strlen($str);
$p = 0;
$serialized = '';
$items = 0;
$level = 0;
while ($p < $endptr) {
$q = $p;
while ($str[$q] != PS_DELIMITER)
if (++$q >= $endptr) break 2;
if ($str[$p] == PS_UNDEF_MARKER) {
$p++;
$has_value = false;
} else {
$has_value = true;
}
$name = substr($str, $p, $q - $p);
$q++;
$serialized .= 's:' . strlen($name) . ':"' . $name . '";';
if ($has_value) {
for (;;) {
$p = $q;
switch ($str[$q]) {
case 'N': /* null */
case 'b': /* boolean */
case 'i': /* integer */
case 'd': /* decimal */
do $q++;
while ( ($q < $endptr) && ($str[$q] != ';') );
$q++;
$serialized .= substr($str, $p, $q - $p);
if ($level == 0) break 2;
break;
case 'R': /* reference*/
$q+= 2;
for ($id = ''; ($q < $endptr) && ($str[$q] != ';'); $q++) $id .= $str[$q];
$q++;
$serialized .= 'R:' . ($id + 1) . ';'; /* increment pointer because of outer array */
if ($level == 0) break 2;
break;
case 's': /* string */
$q+=2;
for ($length=''; ($q < $endptr) && ($str[$q] != ':'); $q++) $length .= $str[$q];
$q+=2;
$q+= (int)$length + 2;
$serialized .= substr($str, $p, $q - $p);
if ($level == 0) break 2;
break;
case 'a': /* array */
case 'O': /* object */
do $q++;
while ( ($q < $endptr) && ($str[$q] != '{') );
$q++;
$level++;
$serialized .= substr($str, $p, $q - $p);
break;
case '}': /* end of array|object */
$q++;
$serialized .= substr($str, $p, $q - $p);
if (--$level == 0) break 2;
break;
default:
return false;
}
}
} else {
$serialized .= 'N;';
$q+= 2;
}
$items++;
$p = $q;
}
return @unserialize( 'a:' . $items . ':{' . $serialized . '}' );
}
function checkLogin(){
$sessionpath = session_save_path();
$sessionfile =$sessionpath.'/sess_'.$_POST['sessionid'];
$username=$_POST['username'];
//-----验证用户是否已经登录------
$checked=false;
if(file_exists($sessionfile)){
$sessioncode=file_get_contents($sessionfile);
if(!empty($sessioncode)){
$session=session_real_decode($sessioncode);
//error_log(json_encode($session));
if($session && isset($session['user_session']) && $session['user_session']->username==$username){
$checked=true;
}
}
}
return $checked;//----结束验证登录
}
页:
[1]