Entonces, este es un servidor de despacho de taxis simple integrado en php Laravel que envía notificaciones automáticas a los taxistas en línea coincidentes dentro del radio del Cliente, utilizando un bucle foreach:
foreach ($Providers_active as $key => $Provider) { (new SendPushNotification)->IncomingRequest($Provider->id); }Obtengo todos los Controladores en línea en el radio del Cliente usando esto:
$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();y mi función IncomingRequest se ve así:
public function IncomingRequest($provider){ $provider = Provider::where('id',$provider)->with('profile')->first(); return $this->sendPushToProvider($provider->id, "New Ride Request"); }Pero dado que este código se ejecuta literalmente en una milésima de segundo, todos los controladores coincidentes reciben la notificación automática al mismo tiempo. Pero estoy tratando de enviarles las notificaciones automáticas una por una con un retraso de quizás un par de segundos.
Tenga en cuenta:
Pero estoy bastante seguro de que esas no son las mejores maneras de hacerlo.
Los pondría en una cola de trabajos. Puede limitar la frecuencia con la que se procesa un trabajo. Entonces, si desea enviar una notificación cada 10 segundos, puede hacerlo.
https://laravel.com/docs/8.x/queues#rate-limiting
Aquí hay un código de ejemplo que tienen en los documentos. Esto muestra perHour() pero también hay perMinute() , por lo que si usó perMinute(6) debería enviar uno cada 10 segundos.
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); }); }