1. Go to this page and download the library: Download laith343/laravel-fcm-blast library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
laith343 / laravel-fcm-blast example snippets
'credentials' => env('FIREBASE_CREDENTIALS'), // service-account JSON path or string (null = fake-token test mode)
'project_id' => env('FIREBASE_PROJECT_ID'),
'rate_cap_per_sec' => 10000, // global cap, split across workers
'token_source' => App\Fcm\MyTokenSource::class,
'message_builder' => App\Fcm\MyMessageBuilder::class,
'invalid_token_handler' => App\Fcm\PruneToken::class, // optional
'http_version' => '2tls', // HTTP/2 for real FCM, HTTP/1.1 for cleartext mocks
'max_host_connections' => 16, // small for HTTP/2 (real FCM); null = rateCap*0.3 (HTTP/1.1 mock)
use Laith343\FcmBlast\Contracts\TokenSource;
class MyTokenSource implements TokenSource
{
public function count(): int { /* total active tokens */ }
public function stream(int $offset, int $limit): \Generator { /* yield device tokens */ }
}
use Laith343\FcmBlast\Contracts\MessageBuilder;
class MyMessageBuilder implements MessageBuilder
{
// Return the FCM v1 "message" body; the engine injects `token` and the envelope.
// $context is null unless your TokenSource attached one (see below).
public function build(string $token, mixed $context = null): array
{
return ['notification' => ['title' => 'Hi', 'body' => 'There']];
}
}
use Laith343\FcmBlast\Support\OutboundToken;
// In TokenSource::stream()
yield new OutboundToken($user->fcm_token, ['locale' => $user->locale, 'name' => $user->name]);
// or, no context:
yield $user->fcm_token;
use Laith343\FcmBlast\Contracts\ContextAware;
use Laith343\FcmBlast\Contracts\TokenSource;
class CampaignTokenSource implements TokenSource, ContextAware
{
private int $campaignId;
public function withRunContext(mixed $context): static
{
$this->campaignId = $context['campaign_id'];
return $this;
}
public function count(): int { /* tokens for $this->campaignId */ }
public function stream(int $offset, int $limit): Generator { /* ... */ }
}
use Laith343\FcmBlast\Contracts\InvalidTokenHandler;
class PruneToken implements InvalidTokenHandler
{
public function __invoke(string $token): void { /* deactivate $token */ }
}
use Laith343\FcmBlast\Facades\FcmBlast;
$runId = FcmBlast::tokensFrom(MyTokenSource::class) // optional if set in config
->buildMessage(MyMessageBuilder::class)
->onInvalidToken(PruneToken::class) // optional
->validateOnly(true) // optional dry run: validate, no delivery
->start(total: 1_000_000, workers: 4);
$status = FcmBlast::status($runId); // Laith343\FcmBlast\Support\BlastStatus
$status->sent; // attempts completed (/ FCM 429/503 retry events (quota) -> watch this for quota limits
$status->transportRetries; // transient transport retry events (timeout/reset) -> watch this for network limits
$status->failed; // permanent errors / retries exhausted
$status->rps;
$status->avgLatencyMs;
$status->progressPercent;
$status->finished;
$status->stalled; // running but no worker has reported in ~15s (workers died)
$status->toArray(); // for JSON endpoints