示例:
xyz.com的所有页面都使用会话来检查我是否已登录并显示自定义内容。我在iMac上使用Firefox登录xyz.com。现在,当我尝试同时访问xyz.com/page1.php和xyz.com/page2.php时,直到page1加载page2未被处理。
代码示例
xyz.com/contains(链接):
/* session check code here */
Page1
Page2
xyz.com/page1.php包含:
/* session check code here */
echo "Hello";
flush();
sleep(5);
echo "done";
xyz.com/page2.php包含:
/* 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页加载之前,对page2的请求正在等待处理。它根本没有处理过。我怎么知道的?第2页末尾的代码记录了我正在监视的文件的访问时间。让我们考虑以下情况:
要求被解雇(按顺序) 1. page1.php 2. page2.php 3. page2.php 4. page1.php 5. page1.php 6. page2.php
结果(约)
1237961919< - #2
1237961920< - #3
1237961931< - #6
预期的内容(约)
1237961915< - #2
1237961915< - #3
1237961915< - #6
^假设所有呼叫同时被触发
观察
在处理呼叫时,我显然无法访问xyz.com(是另一个请求)。但是,如果我在另一个浏览器(Safari)中打开它,它运行良好。那是因为这是另一场会议?
可能的原因
服务器有一些安全措施吗?
我更喜欢编码器,但如果有人可以指点,我可以查看服务器(VPS)以查看apache / php是否配置错误。
我没有正确处理会话?
重要吗?不应该将第二个请求作为不同的线程处理吗?
外星人正在控制我的VPS。
好的,开个玩笑。我只是厌倦了追踪这个问题。如果有人知道这里可能出现什么问题,我真的很感激。
答案 0 :(得分:4)
在完成会话检查代码后,尝试在page1.php中调用session_write_close()
。
/* session check code here */
session_write_close();
echo "Hello";
flush();
这应关闭会话文件(删除锁定),page2.php可以打开它。
答案 1 :(得分:3)
您的服务器正在使用基于文件的会话。当一个请求挂起时,会话文件被锁定,服务器将对尝试使用同一会话的任何后续请求进行排队。
切换到数据库存储的会话,你会没事的。
答案 2 :(得分:1)
答案 3 :(得分:0)
从未遇到过类似的事情。你确定你没有使用CGI而不是FastCGI吗?还要检查你的网络服务器产生多少个php进程以及它们可以处理多少个请求。
为了帮助您进行测试,您可能希望将sleep function放在测试页中。
答案 4 :(得分:0)
不知道php,但是使用asp.net,会话对象一次不能被多个线程用于读/写。所以它产生了你所描述的东西。第二个请求等待会话状态“解锁”以开始处理。它确实有意义,因为会话对象对于请求的所有处理都是一致的。