session回话是PHP中非常重要的内容,但是默认情况下,session不支持多进程操作。只要执行session_start()命令,当前session_id对应的session就被当前进程占用住,直到程序运行结束才主动释放。这使得,同一个客户端,在同一时间内,只能有一个请求(进程)可以访问session文件。
session文件这种默认的进程特性在平时不会出现什么问题,但是如果涉及到长轮询,因为长轮询一直执行下去,因此后面所有访问session的进程都将等待。。。。。。
要解决一个进程长时间占用session的问题,可以使用session_write_close()函数来解决,解释当前进程对session的写操作,这样其他进程就可以进行读写。
test_1.php :长轮询
header('content-type:text/html;charset=utf8');
set_time_limit(0);
session_start();
$_SESSION['key']='老虎';
while (1) {
if (connection_aborted()) {//客户端断开连接时退出程序
exit();
}
echo $_SESSION['key'].'
';
//session_write_close();//没有该函数,同一个客户端不能有两个进程同时访问session
ob_flush();
flush();
sleep(2);
}
运行结果:
一直等待。。。直到前面的请求自动释放session文件的占用
让session支持同一个客户端并发操作的方法:
修改 test_1.php 为:
<?php
header('content-type:text/html;charset=utf8');
set_time_limit(0);
session_start();
$_SESSION['key']='老虎';
while (1) {
if (connection_aborted()) {//客户端断开连接时退出程序
exit();
}
echo $_SESSION['key'].'
';
session_write_close();//执行该函数,解锁,实现并发并行操作
ob_flush();
flush();
sleep(2);
}
运行结果:
一个窗口
老虎 老虎 老虎
另一个窗口
老虎 老虎 老虎 老虎 老虎 老虎 老虎