Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 每个会话只允许一个请求的服务器_Php_Session - Fatal编程技术网

Php 每个会话只允许一个请求的服务器

Php 每个会话只允许一个请求的服务器,php,session,Php,Session,情景: xyz.com的所有页面都使用会话来检查我是否已登录并显示自定义内容。我在iMac上使用Firefox登录xyz.com。现在,当我尝试访问时,同时访问xyz.com/page1.php和xyz.com/page2.php,直到page1加载page2为止 代码示例 xyz.com/contains(链接): xyz.com/page2.php包含: /* session check code here */ echo "Hello"; flush(); sleep(5); echo "

情景:

xyz.com的所有页面都使用会话来检查我是否已登录并显示自定义内容。我在iMac上使用Firefox登录xyz.com。现在,当我尝试访问时,同时访问xyz.com/page1.php和xyz.com/page2.php,直到page1加载page2为止

代码示例

xyz.com/contains(链接):

xyz.com/page2.php包含:

/* session check code here */
echo "Hello";
flush();
sleep(5);
echo "done";
/* session check code here */
echo "Second Page";
/* {insert code} to log time() to log.txt */
测试

我就是这么做的。我登录到shell并保持此命令运行:

user@xyz.com [~/public_html]# tail -f log.txt
在我的浏览器(Firefox)(在xyz.com上)中,我在选项卡中打开了page1和page2的多个实例。如果您可以看到,page1将至少需要5秒钟才能加载。现在,在加载第1页之前,对第2页的请求处于挂起状态。根本没有处理过。我怎么知道?第2页末尾的代码记录了我正在监视的文件的访问时间。让我们考虑下面的情况:

向(按顺序)发出的请求 1.page1.php 2.page2.php 3.page2.php 4.page1.php 5.page1.php 6.page2.php

结果(近似值)


1237961919你的和。

从未遇到过这样的事情。你确定你没有使用CGI而不是FastCGI吗?还要检查您的Web服务器生成了多少php进程,以及每个进程可以处理多少请求


为了帮助您进行测试,您可能需要将其放入测试页面

您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将对以后尝试使用同一会话的任何请求排队


切换到数据库存储会话,您会没事的

对于php不知道,但是对于asp.net,会话对象一次不能由多个线程在读/写中使用。所以它产生了你所描述的东西。第二个请求等待会话状态“解锁”以开始处理。这样,会话对象在请求的所有处理中都是一致的,这是有道理的。

在完成会话检查代码后,尝试调用page1.php中的
会话写入关闭()

/* session check code here */
session_write_close();
echo "Hello";
flush();
这将关闭会话文件(移除锁),page2.php可以打开它


如果同时使用safari访问第1页和第2页,是否会发生同样的情况?只是为了检查你的浏览器是否有问题。是的,Safari上也有。我也在其他计算机上试用过。您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将对以后尝试使用同一会话的任何请求排队。切换到数据库存储会话,一切都会好起来的。所有这些请求都是在服务器上生成的,也就是说,当我运行top时,它们显示为进程。谢谢,但这不是FF问题。只需强调一点:刷新()或将一些输出发送回浏览器以使其正常工作非常重要
/* session check code here */
session_write_close();
echo "Hello";
flush();