最近我在尝试用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;//----结束验证登录
}
分享到:
相关推荐
在PHP编程中,session是用于跟踪...通过及时释放文件锁或者自定义session存储处理器,可以有效地解决并发请求时因文件独占锁造成的阻塞问题。同时,结合使用其他优化技术,可以进一步提高系统的响应速度和可扩展性。
这里需要注意的是,不要通过操作系统命令(如`$kill process_num`或`$kill -9 process_num`)来终止用户连接,因为这可能会留下未释放的锁,从而导致其他问题。正确的做法是在数据库级别使用`ALTER SYSTEM KILL ...
因为在多台服务器提供服务时,用户的一系列操作可能会分散在不同的服务器上完成,这会导致用户的权限验证失败,因为Session信息没有在服务器间同步。因此,实现应用集群环境下Session一致性是必须考虑的问题。 本文...
1. **文件锁机制**:PHP使用文件锁来确保Session文件的独占访问。当一个请求开始Session时,文件被锁定,直到Session结束或通过`session_write_close()`函数显式关闭。 2. **并发问题**:在多用户同时访问的情况下...
- 这个SessionID通过Cookie返回给客户端,以后每次客户端发送请求时,都会携带这个SessionID,服务器根据这个ID找到对应的Session数据。 - 如果用户关闭了Cookie功能,那么Session机制将无法正常工作,因为Session...
在Windows操作系统环境中,多用户多会话(Multi-User Multi-Session)的环境常常出现在服务器或者桌面虚拟化场景中,每个用户登录系统后都会创建一个独立的会话。在这种环境下,多个用户可能同时运行相同的应用程序...
Windows Audio Session API (WASAPI) 是微软推出的一种高级音频处理接口,用于高效、低延迟地与音频硬件交互。在“sample_wasapi_wasp_wasapicapture”这个示例项目中,开发者使用C++语言实现了WASAPI的音频播放功能...
这个函数会返回文件的全部内容,因为我们的文件只包含一个数字,所以可以直接转换为整数。 ```php $count = (int) file_get_contents('counter.txt'); ``` 2. **增加计数**: 我们将计数增加1,然后需要确保这个...
2. Oracle服务器为用户进程分配一个服务器进程(独占服务器模式),或者通过调度器连接到一个共享服务器进程(共享服务器模式)。 3. 服务器进程代表用户进程与Oracle实例进行通信,并执行SQL语句。 ##### 连接方式...
在ActiveMQ中,这个模型通常通过队列(Queue)来实现,每个消息都会被一个且仅有一个消费者处理。 接下来,我们将讨论如何配置和使用ActiveMQ。首先,你需要在两个不同的项目中分别安装并配置ActiveMQ。这通常涉及...
- Cookie存储在客户端,易被篡改,数据安全性较低,但减少服务器压力。 3. **数据库事务** - 事务是一系列操作的集合,确保要么全部执行成功,要么全部回滚,保证数据一致性。 4. **PHP打印前一天时间** - 使用...
连接可以通过Interprocess通信(同一台机器)、网络连接(CS结构)或三层结构(客户端-应用服务器-数据库服务器)实现。 会话(Session)是用户与数据库的特殊连接,只有验证了用户名和密码的合法用户才能建立会话...
- **连接数据库**:Hibernate通过配置文件实现与数据库的连接。主要包括以下几个方面: - **配置**:通过`hibernate.cfg.xml`文件指定数据库驱动、URL、用户名和密码等。 - **获取JDBC连接**:在Hibernate中可以...
通过安装和配置压缩包中的文件,特别是foo_out_wasapi.dll插件,你可以让foobar2000以独占模式通过WASAPI与音频设备通信,从而达到降低系统噪声、减少延迟、提升音质的目的。这尤其适合那些对音频质量有高要求的用户...
标题中的“wasapi音频独占输出”指的是Windows Audio Session API(WASAPI)的一种工作模式,它是微软在Windows Vista之后引入的音频处理技术。在独占模式下,应用程序可以直接与音频硬件进行通信,跳过了传统的混音...
在文件操作中,可以使用flock()函数来避免文件操作时的冲突,例如在一个文件上设置共享锁(LOCK_SH)或独占锁(LOCK_EX)。 14. 数据库操作失败 在进行数据库操作时,如果操作失败,需要检查相关代码是否正确。例如...
9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 9.4.4 直接通过JDBC API来进行批量操作 9.5 使用元数据 9.6 通过Hibernate调用存储过程 9.7 小结 9.8 思考题 第10章 映射组成...
9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 9.4.4 直接通过JDBC API来进行批量操作 9.5 使用元数据 9.6 通过Hibernate调用存储过程 9.7 小结 9.8 思考题 第10章 映射组成...
9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 9.4.4 直接通过JDBC API来进行批量操作 9.5 使用元数据 9.6 通过Hibernate调用存储过程 9.7 小结 9.8 思考题 第10章 映射组成...