`
qiujiayu
  • 浏览: 174111 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP长连接session被独占,通过解释SESSION文件来验证SESSION内容

    博客分类:
  • PHP
阅读更多

        最近我在尝试用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;//----结束验证登录
    }
 

 

0
0
分享到:
评论

相关推荐

    PHP session文件独占锁引起阻塞问题解决方法

    在PHP编程中,session是用于跟踪...通过及时释放文件锁或者自定义session存储处理器,可以有效地解决并发请求时因文件独占锁造成的阻塞问题。同时,结合使用其他优化技术,可以进一步提高系统的响应速度和可扩展性。

    oracle Session与lock 解除

    这里需要注意的是,不要通过操作系统命令(如`$kill process_num`或`$kill -9 process_num`)来终止用户连接,因为这可能会留下未释放的锁,从而导致其他问题。正确的做法是在数据库级别使用`ALTER SYSTEM KILL ...

    集群应用Session一致性实现的三种方案

    因为在多台服务器提供服务时,用户的一系列操作可能会分散在不同的服务器上完成,这会导致用户的权限验证失败,因为Session信息没有在服务器间同步。因此,实现应用集群环境下Session一致性是必须考虑的问题。 本文...

    PHP编程中的Session阻塞问题与解决方法分析

    1. **文件锁机制**:PHP使用文件锁来确保Session文件的独占访问。当一个请求开始Session时,文件被锁定,直到Session结束或通过`session_write_close()`函数显式关闭。 2. **并发问题**:在多用户同时访问的情况下...

    详解ASP.NET中Session的用法

    - 这个SessionID通过Cookie返回给客户端,以后每次客户端发送请求时,都会携带这个SessionID,服务器根据这个ID找到对应的Session数据。 - 如果用户关闭了Cookie功能,那么Session机制将无法正常工作,因为Session...

    windows多用户多session下使用Mutex进行同步控制源代码

    在Windows操作系统环境中,多用户多会话(Multi-User Multi-Session)的环境常常出现在服务器或者桌面虚拟化场景中,每个用户登录系统后都会创建一个独立的会话。在这种环境下,多个用户可能同时运行相同的应用程序...

    Windows Audio Session (WASAPI) sample_wasapi_wasp_wasapicapture_

    Windows Audio Session API (WASAPI) 是微软推出的一种高级音频处理接口,用于高效、低延迟地与音频硬件交互。在“sample_wasapi_wasp_wasapicapture”这个示例项目中,开发者使用C++语言实现了WASAPI的音频播放功能...

    最简单的PHP访问计数器

    这个函数会返回文件的全部内容,因为我们的文件只包含一个数字,所以可以直接转换为整数。 ```php $count = (int) file_get_contents('counter.txt'); ``` 2. **增加计数**: 我们将计数增加1,然后需要确保这个...

    oraclesg读书笔记.docx

    2. Oracle服务器为用户进程分配一个服务器进程(独占服务器模式),或者通过调度器连接到一个共享服务器进程(共享服务器模式)。 3. 服务器进程代表用户进程与Oracle实例进行通信,并执行SQL语句。 ##### 连接方式...

    activeMQ点对点map消息

    在ActiveMQ中,这个模型通常通过队列(Queue)来实现,每个消息都会被一个且仅有一个消费者处理。 接下来,我们将讨论如何配置和使用ActiveMQ。首先,你需要在两个不同的项目中分别安装并配置ActiveMQ。这通常涉及...

    PHP面试试题大全

    - Cookie存储在客户端,易被篡改,数据安全性较低,但减少服务器压力。 3. **数据库事务** - 事务是一系列操作的集合,确保要么全部执行成功,要么全部回滚,保证数据一致性。 4. **PHP打印前一天时间** - 使用...

    oracle sg 读书笔记综合帖.doc

    连接可以通过Interprocess通信(同一台机器)、网络连接(CS结构)或三层结构(客户端-应用服务器-数据库服务器)实现。 会话(Session)是用户与数据库的特殊连接,只有验证了用户名和密码的合法用户才能建立会话...

    Hibernate开发向导

    - **连接数据库**:Hibernate通过配置文件实现与数据库的连接。主要包括以下几个方面: - **配置**:通过`hibernate.cfg.xml`文件指定数据库驱动、URL、用户名和密码等。 - **获取JDBC连接**:在Hibernate中可以...

    FOOBAR2000之wasapi

    通过安装和配置压缩包中的文件,特别是foo_out_wasapi.dll插件,你可以让foobar2000以独占模式通过WASAPI与音频设备通信,从而达到降低系统噪声、减少延迟、提升音质的目的。这尤其适合那些对音频质量有高要求的用户...

    wasapi音频独占输出

    标题中的“wasapi音频独占输出”指的是Windows Audio Session API(WASAPI)的一种工作模式,它是微软在Windows Vista之后引入的音频处理技术。在独占模式下,应用程序可以直接与音频硬件进行通信,跳过了传统的混音...

    令PHP初学者头疼十四条问题大总结

    在文件操作中,可以使用flock()函数来避免文件操作时的冲突,例如在一个文件上设置共享锁(LOCK_SH)或独占锁(LOCK_EX)。 14. 数据库操作失败 在进行数据库操作时,如果操作失败,需要检查相关代码是否正确。例如...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5 使用元数据  9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5 使用元数据  9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5 使用元数据  9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成...

Global site tag (gtag.js) - Google Analytics