Installation:
composer require rudderstack/rudder-php-sdk
No need to clone the repo manually—Composer handles dependencies.
First Use Case: Track a user's page view in a Laravel controller:
use Rudder\Rudder;
// Initialize in a service provider (e.g., AppServiceProvider)
Rudder::init(config('rudderstack.write_key'), [
'data_plane_url' => config('rudderstack.data_plane_url'),
'consumer' => 'lib_curl', // or 'lib_http'
'debug' => env('RUDDER_DEBUG', false),
]);
// Track an event in a controller
Rudder::track('user_viewed_page', [
'userId' => auth()->id(),
'page' => 'dashboard',
'properties' => ['referrer' => request()->header('referer')]
]);
Where to Look First:
examples/ for Laravel-like use cases).config/rudderstack.php (create this file for centralized config).app/Providers/RudderServiceProvider.php (recommended for SDK initialization).AppServiceProvider):
public function boot()
{
Rudder::init(config('rudderstack.write_key'), config('rudderstack.options'));
}
.env:
RUDDER_WRITE_KEY=your_write_key
RUDDER_DATA_PLANE_URL=https://your-data-plane.rudderstack.com
RUDDER_DEBUG=false
Rudder::page('Home', [
'url' => url()->current(),
'properties' => ['title' => 'Home Page']
]);
Rudder::track('form_submitted', [
'userId' => auth()->id(),
'form' => 'contact',
'properties' => ['email' => $request->email]
]);
Rudder::identify('user123', [
'email' => 'user@example.com',
'traits' => ['plan' => 'pro']
]);
Rudder::flush(); // Send queued events immediately
flush_at (default: 100 events) and max_queue_size (default: 10,000) in initialization to balance latency and reliability.// app/Http/Middleware/TrackPageViews.php
public function handle($request, Closure $next)
{
Rudder::page($request->route()->getName(), [
'url' => $request->url(),
'properties' => ['user_agent' => $request->userAgent()]
]);
return $next($request);
}
// app/Observers/UserObserver.php
public function created(User $user)
{
Rudder::track('user_created', [
'userId' => $user->id,
'properties' => $user->toArray()
]);
}
debug: true).storage/logs/rudder.log (create this file if missing):
// In AppServiceProvider
if (config('rudderstack.debug')) {
Storage::makeDirectory('logs');
Rudder::setLogger(function ($message) {
Log::channel('single')->info($message);
});
}
Write Key Exposure:
.env to version control. Use Laravel's .env encryption or a secrets manager.RUDDER_WRITE_KEY in AppServiceProvider:
if (empty(config('rudderstack.write_key'))) {
throw new \RuntimeException('RudderStack write key not configured.');
}
Queue Size Limits:
max_queue_size is exceeded, events may drop silently.$queueSize = Rudder::getQueueSize();
if ($queueSize > config('rudderstack.max_queue_size') * 0.9) {
Log::warning("RudderStack queue near capacity: {$queueSize}");
}
Debug Mode in Production:
debug: true) can bloat storage logs.'debug' => app()->environment('local'),
Consumer Library Quirks:
lib_curl is default but may fail on shared hosting (e.g., cURL disabled).lib_http:
'consumer' => extension_loaded('curl') ? 'lib_curl' : 'lib_http',
Verify Events: Use RudderStack’s Debugger to confirm events are received.
debug: true and check storage/logs/rudder.log for payloads.Network Issues:
data_plane_url is correct (HTTPS required).lib_http temporarily to rule out cURL issues.Payload Validation: RudderStack rejects malformed events. Validate with:
try {
Rudder::track('event', ['invalid' => null]);
} catch (\Rudder\Exception\InvalidPayloadException $e) {
Log::error("RudderStack payload error: " . $e->getMessage());
}
Custom Transformers: Modify event payloads before sending:
Rudder::setTransformer(function ($event) {
$event['properties']['processed_at'] = now()->toIso8601String();
return $event;
});
Batch Processing Hooks: Intercept batches before flushing:
Rudder::setBatchProcessor(function ($batch) {
// Add correlation IDs or enrich data
foreach ($batch as &$event) {
$event['context']['integration'] = 'laravel';
}
return $batch;
});
Fallback for Offline Mode:
Store events in a database table (rudder_events) and retry on next request:
// In a queue job
public function handle()
{
$events = DB::table('rudder_events')->limit(100)->get();
foreach ($events as $event) {
Rudder::track($event->event, $event->properties);
}
DB::table('rudder_events')->whereIn('id', $events->pluck('id'))->delete();
}
flush_at vs. flush_queue:
flush_at: Auto-flushes when queue reaches this size (default: 100).flush_queue: Manually flush the queue (use sparingly in high-traffic apps).'timeout' => 10, // seconds
How can I help you explore Laravel packages today?