1

我可以将我的问题减少到我放在服务器上的以下脚本:

<?php
session_start();
header('Content-type: text/plain', TRUE);
flush();
sleep(300);?>

当我使用以下命令连接到此脚本时:

GET /test.php HTTP/1.1
Host: localhost

我按预期立即恢复了标题:

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

在我重新启动我的网络服务器之前,我不再得到任何标题。我本来希望立即再次检索响应标头。我真的不知道为什么我会得到这种行为。也许这是某种错误?或者我误解了一些行为。如果有人可以帮助我,那就太好了,因为我真的不知道发生了什么。

Ps:我在 fedora 17 上运行 Apache/2.2.22 和 PHP 5.3.17,但是服务器包不在 fedora 16 存储库中,因为我需要 zend 调试器,它不适用于 fedora 17 附带的 PHP。

4

1 回答 1

2

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

您可以session_write_close()在睡眠之前使用,以便会话变量立即可用。但是之后您将无法更改任何会话变量。

于 2012-11-03T21:01:32.917 回答