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

欢迎指教
对于很多没有支持 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);
}

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

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
$uid = retry(20, function () use ($uuid) {
    $payload = $this->get($uuid);

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

    return $uid;
}, 1000);

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

6年前 评论

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

6年前 评论

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

6年前 评论

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

6年前 评论

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

IE10 以上对websocket 有完整支持。

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

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!