我想实现一个长连接,
客户端用js向服务端发出一个请求,php接到请求后,进行一些处理(用curl到别的地方取一些信息),然后推送到客户端,这时候客户端(JS)接到信息进行处理后,用什么方式可以再将信息利用这个长连接发送到服务器端?
我用类似这种方式实现长连接的,是不是这种长连接只能是客户端第一次向服务端发送请求后,后续只能是服务器向客户端推送内容,客户端还能利用这个连接向服务器发送内容么:header("Content-Type:text/html");
set_time_limit(0);$num = 3;
while($num){
    $num--;
    print str_repeat(" ", 4096);
    echo date("H:i:s")."<br/>";                                                                                                                              
    ob_flush();
    flush();
    sleep(2);
}ob_end_flush();

解决方案 »

  1.   

    所谓“长连接”是等待数据返回时间很长的连接
    服务端也没有“推送到客户端”,只是在收到请求后经过一个相当长的时间间隔后才“返回”数据到客户端在模拟“长连接”的实现中
    客户端的 ajax 在收到返回数据后,立即发起新的一轮连接
    服务器端的 php 也不是像你那样一直处于死循环中,而是一旦输出完成就跳出循环而结束程序的运行
      

  2.   

    传送到客户端程序后再激活一个js函数,通过ajax,把数据再传回php的一个方法里,那时那个连接肯定不在了,不能持续的,放在缓存里应该也不行
      

  3.   


    确实是这样的,我虽然有flush输出缓存,这个连接也有保持,但是前端只有等这个请求结束了才能拿到返回内容,有什么办法在php flush推送到前端后,就让前端捕获?
      

  4.   

    请使用AJAX定时器轮询,这个世界没有HTTP长连接。
      

  5.   

    需求是这样的,浏览器请求服务器A上的一个php脚本,这个脚本 初始化curl去站点B请求一些信息,这时候站点B会保存一个id在session中,如果我再次发起一个请求到服务器A的这个脚本,会导致站点b的那个session 值发生变化。所以我需要保持这个curl连接,在站点B的这个会话期间去做一些事情。
      

  6.   

    在使用 ajax 时,我们都是用 readyState == 4 来判断数据是否加载完成(status == 200 只是表示没有错误)按照你的期望,你可以在 readyState == 3 (表示有数据到达)时就开始去数据
    只不过这个信号只是在 Firefox 中才是可靠的Firefox 是在 netscape 公司倒闭时公布的 netscape 浏览器源码的基础上发展的
    而 netscape 浏览器本身就是支持 server push 的,只是当时占主流的 IE 不支持,所以这个技术发展不起来
    估计当大多浏览器厂商把 bt、p2p 技术引入浏览器时,服务器推才有可能真正的发展起来