php - 向出租车司机发送推送通知,但每个循环都有延迟 - php laravel
问题描述
所以这是一个用 php Laravel 构建的简单出租车调度服务器,它使用 foreach 循环向客户半径内匹配的在线出租车司机发送推送通知:
foreach ($Providers_active as $key => $Provider) {
(new SendPushNotification)->IncomingRequest($Provider->id);
}
我使用以下方法获取客户半径内的所有在线驱动程序:
$Providers_active = Provider::with('service')
->select(DB::Raw("(6371 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) AS distance"),'id')
->where('status', 'online')
->orderBy('distance','asc')
->get();
我的IncomingRequest函数如下所示:
public function IncomingRequest($provider){
$provider = Provider::where('id',$provider)->with('profile')->first();
return $this->sendPushToProvider($provider->id, "New Ride Request");
}
但是由于这段代码实际上是在一毫秒内执行的,所以所有匹配的驱动程序都会同时获得推送通知。但我正在尝试将推送通知一一发送给他们,延迟可能是几秒钟。
请注意:
- 我通过比较时间延迟尝试在其中使用while循环。
- 我也在考虑使用 sleep() 方法。
但我很确定这些不是最好的方法。
解决方案
我会将这些放入作业队列中。您可以限制作业处理的频率。因此,如果您想每 10 秒发送一次通知,您可以这样做。
https://laravel.com/docs/8.x/queues#rate-limiting
这是他们在文档中的一些示例代码。这显示perHour()
但也有perMinute()
,所以如果你使用perMinute(6)
它应该每 10 秒发送一个。
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
RateLimiter::for('backups', function ($job) {
return $job->user->vipCustomer()
? Limit::none()
: Limit::perHour(1)->by($job->user->id);
});
}
推荐阅读
- c - 使用'typedef'的正确方法是什么?
- python - 是否可以将“类型”类型的变量传递给组合框,以便集合的所有元素都是可选的?
- java - BufferedReader 没有读取整个文件
- r - 数据表中带条件的子集
- python - 使用几个硬编码过滤器在 Keras 中创建自定义 Conv2D 层?
- javascript - 在 React 组件 TS2532 中使用 axios 从 API 获取数据时如何停止未定义的属性
- python - 如何使用python找出样本均值在+/-一个总体均值单位内的概率为0.95的区间?
- javascript - (node.js)我如何调用这个中间件函数
- c# - 是否可以将 json 格式的文本转换为字符串而不会出错?(C#)
- java - 实现 ReduceFunction 时如何使用泛型类型