代码如下啊,可是过了十秒钟后,jquery发起那个http请求的时候,那个请求却一直处于阻塞的状态,小弟才疏学浅,不明白其中的道理,跪求真相帝的出现。a.php<?php session_start(); ?>
<?php $_SESSION['hello'] = '我爱美女 !';?>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script>
<script type="text/javascript">
function test() {
setTimeout(function(){
$.post("test.php");
}, 10000);
}
test();
</script>
</head>
</html><?php   $i = 0;
while(true){
$value = $_SESSION['NULL'];
echo ($value == NULL)? '我很空虚!-'. $i++ .'<br />' : $value;
sleep(1);
flush();
}test.php<?php
session_start(); $value = $_SESSION['hello']; echo $value;

解决方案 »

  1.   

    $value = $_SESSION['NULL']; 
    ?? 什么意思
      

  2.   

    关键点就是这次取值必须要访问session
      

  3.   

    $_SESSION['NULL'],取什么空值呢?如果照你那样写,只能解释成一个键值为'NULL'的session变量,'NULL'在这里只是作为不普通的字符串,和PHP中的NULL数据类型无关!
    我认为你想的效果应该这样写<?php      $i = 0;
    while(true){
        $value = $_SESSION['hello'];
        echo ($value == NULL)? '我很空虚!-'. $i++ .'<br />' : $value;
        sleep(1);
        flush();
    }
      

  4.   

    恩,是的,其实不用纠结在这里的,不管这个键值是NULL还是hello,或者是其他的一些什么。也无所谓取出来的是什么。
    这里的关键点就在于需要对session进行一次的访问。然后在发起的另外的一个关于session操作的http链接会被阻塞住,这是关键。我不知道这是为什么,很纠结。
      

  5.   

    你的php整型还在解析php代码, js部分不会读到
      

  6.   


    你的php程序还在运行, 也就是没有完成html解析 ,js 要php输出完成后才会读取
      

  7.   

    我没有明白,你的意思是js在html没有被解析完后不会执行?
    可是我用firebug查看的,那个post请求已经产生了,js确实被执行了的,只是得不到返回值。
    会不会是不是php的在进行session操作的时候存在了lock之类的东西。致使第一次session第一次操作还没完成的时候,第二次请求也在排队等待被执行?
      

  8.   


    根据你的代码我用firebug查看没有发送请求。 是否清除了测试?
      

  9.   

    请求失败返回HTTP 504 错误 – 网关超时 (Gateway timeout)
      

  10.   


    js发送http请求 -> php接收请求,执行结束,返回 -> js获取http返回,执行callback问题在于你的代码php何时执行结束了?整个while(true)死循环.
    ps : 不过comet也是这么做的,hold住socket连接,有更新才返回,问题是你的代码根本就没有结束while(true)的条件。
      

  11.   

    原因是很清楚的,session_start() 是有锁的,任一时刻只能有一个进程访问 session 数据。你的 a.php 调用了 session_start(),却一直没有结束,这时其它进程(test.php)调用 session_start() 的时候会被锁住,也就是阻塞了。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  12.   

    你去 PHP 手册里读一下 session_write_close() 的说明就都清楚了。
      

  13.   

    非常感谢大家的帮忙,已经搞定了。
    http://surmise-sky.com/thinkin-about-php-session-lock-operation/
      

  14.   

    总结得不错,鼓掌!不过还是要吹毛求疵一下:看你行文的意思,似乎认为 PHP 的 session 之所以有锁,是因为“php是动态脚本解释型语言。他存放session的机制和java之类的直接将session扔到内存中的方式不一样……”。对此,我以为不然。我的理解是,对 session 的访问设置锁,是一种设计选择,而不是因为某种先天原因的不得已。加锁是避免访问冲突的最简单的方法,但不是唯一的方法,事实上,PHP 也有办法启用替代的 session 机制,比如 http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)