【问题标题】:Long Polling - Best way to timing out a request after certain seconds长轮询 - 在特定秒后超时请求的最佳方式
【发布时间】:2013-09-21 18:44:41
【问题描述】:

进行长轮询请求,如果服务器在一段时间后没有响应,则会返回令人不快的错误(405 with nginx)。如何在几秒钟后使 PHP 请求过期?你推荐几秒?提前谢谢你。

【问题讨论】:

  • php到底在做什么,它是在循环/休眠等待什么吗?
  • 是的,这是一个循环等待的东西。
  • 你能分享那部分代码,然后我会回答你的问题
  • 代码很简单,就是一个while(1)(无限循环),还有一个sql语句,在while的末尾随机休眠(1秒或3秒)。
  • 你的 javascript 是否设计为在连接终止时重新连接?如果不是,它是如何完成的

标签: php nginx long-polling


【解决方案1】:

好的,这就是我的做法,我已经为我的一个业余时间项目构建了一个类似的脚本,而不是做一个完整的无限循环,我会做一个循环数量有限的循环,然后睡觉中间以节省大量 cpu 使用,可能不完全是您的代码的设计方式,但它很好,并且它以正常的 200 代码优雅地停止,当然您可以更改循环计数器和睡眠值以适合您的代码。

<?php
    header('Cache-Control: no-cache');
    header("Content-Type: text/event-stream");
    $i = 60;
    while($i--){
        echo "data: ".date("Y-m-d H:i:s")."\n\n";
        echo "\n\n";
        ob_flush();
        flush();
        sleep(1);
    }

然后让javascript重新连接并开始一个新的循环。

PS:你真的让你的数据流式传输吗?还是在连接终止之前流保持空白?

【讨论】:

  • 非常感谢,我喜欢您的解决方案,但是,我确实有一个问题。这样循环是60次尝试,因为有1秒的sleep可能会超过60秒的限制,如果没有结果,然后返回错误405,不是吗?
  • 你可以扩展nginx的正常限制,让我看看配置
  • 在包含长轮询的位置块中尝试fastcgi_read_timeout 2m;(2 分钟超时)之类的操作,例如location /longpoll
猜你喜欢
  • 2012-12-22
  • 2021-10-13
  • 2012-07-10
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多