Php 使用flush()、会话cookie和长执行时间时没有应答

Php 使用flush()、会话cookie和长执行时间时没有应答,php,time,session-cookies,outputcache,flush,Php,Time,Session Cookies,Outputcache,Flush,我可以将问题简化为我在服务器上使用的以下脚本: <?php session_start(); header('Content-type: text/plain', TRUE); flush(); sleep(300);?> 我立即按预期收回标题: HTTP/1.1 200 OK Date: Sat, 03 Nov 2012 20:15:53 GMT Server: Apache/2.2.22 (Fedora) X-Powered-By: PHP/5.3.17 Set-Cookie:

我可以将问题简化为我在服务器上使用的以下脚本:

<?php
session_start();
header('Content-type: text/plain', TRUE);
flush();
sleep(300);?>
我立即按预期收回标题:

HTTP/1.1 200 OK
Date: Sat, 03 Nov 2012 20:15:53 GMT
Server: Apache/2.2.22 (Fedora)
X-Powered-By: PHP/5.3.17
Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
Set-Cookie: PHPSESSID=m7bmvblakkil96rqjq7j8f0f42; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain; charset=UTF-8
如果我随后使用以下命令终止连接并重新连接:

GET /proxy/test.php HTTP/1.1                
Host: localhost
Cookie: PHPSESSID=knkeaq2ao0cllpcci0rnassqj4
在重新启动我的Web服务器之前,我不会再得到任何头。 我本来希望立即再次检索响应标题。 我真的不知道我为什么会有这种行为。也许是某种虫子?或者我误解了一些行为。 如果有人能帮我,那就太好了,因为我真的不知道发生了什么

附言:
我在fedora 17上运行Apache/2.2.22和PHP5.3.17,但服务器包不在fedora 16 repos中,因为我需要zend debugger,它不能与fedora 17附带的PHP一起工作。

因为您的会话在第一个请求中仍然打开(300秒),所以无法在第二个请求中开始使用它。它将等待第一个会话关闭并写入文件系统,然后再尝试为第二个请求读取该会话。因为您无法确定第一个请求是否要修改第二个请求已经使用的相同会话变量


您可以在睡眠前使用
session\u write\u close()。但之后您不能更改任何会话变量。

谢谢。我想你是对的,真的没有办法在多个连接中使用$\u会话数组吗?我不确定如果你实现自己的会话处理程序,例如使用数据库存储,是否可以避免这种行为。您可以在
会话设置保存处理程序
页面上阅读。刚刚发现,在会话写入关闭()之后,我仍然可以读取会话变量,因此我被保存。正如我在这里发现的,可以调用session\u start()写入会话变量,然后再次调用session\u write\u close()。在服务器上长期运行的任何脚本中使用
session\u write\u close()
。它将写出并保存会话数据,释放会话文件上的锁,但仍将$\u会话保留在该脚本中以供读取。请注意,如果稍后传入的任何脚本在该长时间运行的脚本仍处于活动状态时修改会话,您将获得会话数据的去同步。
GET /proxy/test.php HTTP/1.1                
Host: localhost
Cookie: PHPSESSID=knkeaq2ao0cllpcci0rnassqj4