第一篇文章 有点小激动 PHP 轮询方面的知识
6

欢迎指教
对于很多没有支持 websocket 的网站应用来说 写一些需要长轮询的应用时是一个很蛋疼的事情
例如 微信登录
微信登录需要一个长轮询去请求得到用户有没有扫描二维码
如果一直ajax 轮询请求 时间一长 浏览器就会变的很卡 可以考虑 休眠的方式来解决
下面是代码

$file_name = './test.txt';  // 此处建议使用 redis 或者其他的 缓存 尽量不使用数据库来扫描结果

for ( $i = 0; $i < 30; $i++ ) {
    $text = file_get_contents($file_name); //演示 使用文件来存储扫描结果

    if(!empty($text)){
        file_put_contents($file_name, ''); //为了更好的演示 这里每次有结果之后 将文件写为空

        exit(json_encode(['status' => 1, 'msg' => $text]));
    }

    if($i > 28){
        exit(json_encode(['status' => 0, 'msg' => '继续下一轮长轮询!']));
    }

    usleep(2000000);
}

上面的阈值自己定义 自己验证过是可以的

有什么不对的地方 欢迎指教

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

沙发自己坐

8个月前
$uid = retry(20, function () use ($uuid) {
    $payload = $this->get($uuid);

    if (!($uid = array_get($payload, 'id'))) {
        abort(408);
    }

    return $uid;
}, 1000);

laravel 中实现的类似功能,超时返回408 状态码的话,浏览器 network 只会显示一条请求,有点神奇。。

8个月前

@Abel94 几条请求主要还是要看你前端写的是 setTimeout 还是 setTimeIntval

8个月前

@a_life_long_learner 不是,我测试环境和生产环境代码是一样的。比如我前端设置一个请求 20 秒超时,服务器返回 408 就重发请求,测试环境会发出 N 条 20 秒的请求,生产环境只会有一条一直等待响应的请求,而服务器实际上收到了 N 条请求。

8个月前

@Abel94 你说的是network 里面的请求数 同时有很多条?

8个月前

php的话可以使用 phpsocket.io 自适应论询和 websocket 。

IE10 以上对websocket 有完整支持。

我们新项目原生支持websocket:
https://github.com/notadd/notadd/tree/next

8个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!