Laravel uygulamanız sabah 2’de kapandı. Bunu sabah 9’da bir müşteriniz size e-posta gönderdiğinde öğrendiniz. Bu durum size tanıdık geliyor mu?
Çoğu Laravel eğitimi dağıtım (deploy) aşamasında sona erer. Bu makale burada devreye giriyor. Sonunda HTTP çalışma süresi (uptime) izleme, kuyruklu işlerin ve Artisan komutlarının kalp atış hızı kontrolleri, Slack uyarıları, halka açık bir durum sayfası ve README’nizde canlı bir durum rozeti elde edeceksiniz — hepsi 30 dakikadan kısa sürede, ücretsiz.
PHP Geliştiricilerinin En Çok Kaçırdığı İki Hata
PHP Geliştiricilerinin En Çok Kaçırdığı İki Hata
Laravel üretim hataları, doğru araçlar olmadan fark edilmeden kalan iki kalıba düşer:
Endpoint arızaları — uygulamanız 500 hata kodları vermeye veya zaman aşımına uğramaya başlar. Kullanıcılar kırık bir sayfada takılır. Siz bunun farkına, ancak kullanıcılar şikayet ettiğinde varırsınız (ya da şikayet etmezler ve sadece giderler).
Gizli kuyruk hataları — kuyruk işçileriniz işlemleri işlemeyi durdurur. E-postalar gönderilmez. Webhooklar teslim edilmez. Raporlar üretilmez. Hiçbir istisna atılmaz. Hiçbir şey kaydedilmez. Sadece sessizce sonuç almaya devam etmeyi bırakırsınız, ta ki aşağı akışta bir şey bozulana kadar.
Her ikisi de bir sağlık endpoint’i ve bir izleme aracı ile çözülebilir. Şimdi bunları bağlayalım.
Adım 1: Bir sağlık kontrolu rotası ekleyin
Adım 1: Bir sağlık kontrolu rotası ekleyin
Laravel, kutudan çıktığında bir sağlık endpoint’iyle gelmez, ancak eklemek yaklaşık iki dakikanızı alır.
spatie/laravel-health paketini yükleyin:
composer require spatie/laravel-health
Migasyonları yayınlayın ve çalıştırın:
php artisan vendor:publish --tag="health-migrations"
php artisan migrate
Kontrollerinizi AppServiceProvider içinde kaydedin:
// app/Providers/AppServiceProvider.php
use Spatie\Health\Facades\Health;
use Spatie\Health\Checks\Checks\DatabaseCheck;
use Spatie\Health\Checks\Checks\CacheCheck;
use Spatie\Health\Checks\Checks\UsedDiskSpaceCheck;
public function boot(): void
{
Health::checks([
new DatabaseCheck(),
new CacheCheck(),
UsedDiskSpaceCheck::new()->failWhenUsedSpaceIsAbovePercentage(90),
]);
}
Paket otomatik olarak bir /up rotası kaydeder. Bunu yerel ortamda doğrulayabilirsiniz:
php artisan serve
curl http://localhost:8000/up
# {"finishedAt":"...","checkResults":[...]}
Bir 200 sağlıklı demektir. Bir 500 bir şeylerin yanlış olduğunu gösterir — ve tam olarak neyin yanlış olduğunu size bildirir.
Minimal, sıfır bağımlılığa sahip bir sağlık kontrolü tercih ediyorsanız, kendiniz de bir tane ekleyebilirsiniz:
// routes/web.php
Route::get('/health', function () {
try {
DB::connection()->getPdo();
return response()->json(['status' => 'ok']);
} catch (\Exception $e) {
return response()->json(['status' => 'error', 'message' => $e->getMessage()], 500);
}
});
Her iki yaklaşım da işe yarar. Önemli olan, uygulamanız sorun yaşadığında 200 olmayan bir URL’ye sahip olmanızdır.
Adım 2: HTTP çalışma süresi izleme ayarlayın
Adım 2: HTTP çalışma süresi izleme ayarlayın
Sağlık endpoint’iniz aktif durumda, bunu Vigilmon‘a yönlendirin:
- vigilmon.online‘da ücretsiz bir hesap oluşturun
- Yeni İzleyici → HTTP seçeneğine tıklayın
https://yourdomain.com/up(ya da/health) girin- Kontrol aralığını 5 dakika olarak ayarlayın (ücretsiz seviyede)
- Kaydedin
Vigilmon endpoint’inizi her 5 dakikada bir birden fazla yerden pingler. Eğer bir 200 yerine farklı bir kod dönerse ya da zaman aşımına uğrarsa, hemen uyarı alırsınız.
Ayrıca, kritik rotalar için ayrı izleyiciler de ekleyebilirsiniz:
https://yourdomain.com/— ana sayfanız çalışıyorhttps://yourdomain.com/api/ping— API katmanınız yanıt veriyorhttps://yourdomain.com/login— yetkilendirme akışınız erişilebilir
Her monitör bağımsız çalışır. Eğer API’niz kapanırsa ancak ana sayfanız sorunsuzsa, hangi katmanın bozulduğunu tam olarak bileceksiniz.
Adım 3: Kuyruklu işler için kalp atış hızı izleme
Adım 3: Kuyruklu işler için kalp atış hızı izleme
HTTP izleme sunucu arızalarını yakalar. Ancak sessizce duran işler için ne yapmalıyız?
Kalp atış hızı deseni: işiniz başarılı bir şekilde tamamlandıktan sonra bir URL’yi pingler. Eğer Vigilmon belirli bir süre boyunca ping almazsa, size hemen uyarı verir — iş başarısız olmuş olsa bile, bir istisna fırlatmış olsa bile, ya da tamamen süreklenmeyi durdurmuşsa bile.
İşte bir Laravel işi ile kalp atış hızı:
// app/Jobs/SendDailyDigestJob.php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Http;
class SendDailyDigestJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable;
public function handle(): void
{
// Gerçek iş mantığınız
$this->sendDigestEmails();
// Başarılı bir şekilde ping atın
$heartbeatUrl = config('services.vigilmon.digest_heartbeat_url');
if ($heartbeatUrl) {
Http::timeout(5)->get($heartbeatUrl);
}
}
private function sendDigestEmails(): void
{
// buraya mantığınızı ekleyin
}
}
URL’yi konfigürasyonunuza ekleyin:
// config/services.php
'vigilmon' => [
'digest_heartbeat_url' => env('VIGILMON_DIGEST_HEARTBEAT_URL'),
],
# .env
VIGILMON_DIGEST_HEARTBEAT_URL=https://vigilmon.online/heartbeats/your-unique-token
Vigilmon’da bir Kalp Atış İzleyicisi oluşturun:
- Yeni İzleyici → Kalp Atışı seçeneğine tıklayın
- Beklenen aralığı ayarlayın (örneğin, her 24 saatte bir)
- Tekil ping URL’sini kopyalayın
- Bunu
VIGILMON_DIGEST_HEARTBEAT_URLolarak ortamınıza ayarlayın
Artisan komutlarıyla da çalışır
Artisan komutlarıyla da çalışır
Scheduled tasks(using artisan schedule:run) ile çalışıyorsanız, aynı desen geçerlidir:
// app/Console/Commands/GenerateReportsCommand.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
class GenerateReportsCommand extends Command
{
protected $signature = 'reports:generate';
protected $description = 'Günlük raporları oluştur';
public function handle(): int
{
$this->generateReports();
// Başarı durumunda kalp atışı gönder
$url = config('services.vigilmon.reports_heartbeat_url');
if ($url) {
Http::timeout(5)->get($url);
}
return Command::SUCCESS;
}
}
Bunu zamanlayıcınıza kaydedin:
// app/Console/Kernel.php (ya da Laravel 11+ için routes/console.php)
Schedule::command('reports:generate')->dailyAt('06:00');
Kalp atışı, gerçek icrayı izler — sadece cron’un çalışıp çalışmadığını değil. Eğer komut ortada çökerse, ping gönderilmez ve uyarı alırsınız.
Adım 4: Slack veya e-posta ile uyarılar
Adım 4: Slack veya e-posta ile uyarılar
Vigilmon’da hangi şekilde bildirim almak istediğinizi yapılandırın:
Slack için:
- Slack iş alanınızda bir gelen webhook oluşturun
- Vigilmon’da Bildirimler → Yeni Kanal → Slack seçeneğine gidin
- Webhook URL’sini yapıştırın
- Her monitörde etkinleştirin
E-posta için:
- Vigilmon’da Bildirimler → Yeni Kanal → E-posta seçeneğine gidin
- Adresinizi veya bir dağıtım listesini girin
- Monitörlerinizde etkinleştirin
Uyarı mesajları şu şekilde görünmektedir:
🔴 KAPALI: yourdomain.com/up
Durum: 500 Internal Server Error
Tespit edilen: ABD-Doğu, AB-Batı
3 dakika önce
İyileşme bildirimi:
✅ İYİLEŞTİ: yourdomain.com/up YENİDEN AÇIK
Kapanma süresi: 14 dakika
Kalp atışı bildirimi:
🔴 KAÇIRILDI: Günlük Özet İş Kalp Atışı
Beklenen her: 24 saat
Son ping alındı: 26 saat önce
Adım 5: Halka açık durum sayfası ve README rozeti
Adım 5: Halka açık durum sayfası ve README rozeti
Halka açık bir durum sayfası, kullanıcılarınızın “sadece ben mi?” sorusunu yanıtlar — ve olaylar sırasında destek gürültüsünü azaltır.
Vigilmon’da:
- Durum Sayfaları → Yeni Durum Sayfası seçeneğine gidin
- Bir ad verin ve hangi izleyicileri göstereceğinizi seçin
- Halka açık URL’yi kopyalayın ve belgelerinizde, alt bilgide veya hata sayfalarınızda paylaşın
Ayrıca, GitHub README’nize canlı bir durum rozeti de yerleştirebilirsiniz. Vigilmon’da her izleyici için bir rozet uç noktası bulunmaktadır:
https://vigilmon.online/badge/{your-monitor-slug}
Rozet mevcut durumu gösterir (up, down veya degraded) ve yanıt süresini. README.md dosyanıza ekleyin:

Ya da durum sayfanıza bir bağlantı veren bir HTML gömme olarak:
Yapmış Olduğunuz Şeyler
Yapmış Olduğunuz Şeyler
| Ne | Nasıl |
|---|---|
| HTTP çalışma süresi izleme | /up rotası + Vigilmon HTTP monitörü |
| Veritabanı / önbellek sağlığı | spatie/laravel-health kontrolleri |
| Kuyruk iş izleme | Her işin sonunda kalp atışı ping’i |
| Artisan komut izleme | Başarılı tamamlama durumunda kalp atışı ping’i |
| Anlık uyarılar | Slack veya e-posta webhook bildirimleri |
| Halka açık durum sayfası | Vigilmon durum sayfası |
| README durumu rozet | /badge/{slug} SVG gömülü |
Tüm bu sistemin maliyeti Vigilmon’un ücretsiz seviyesinde 0$ ve günlerce süren sessiz kuyruk hatasını bulmaktan daha kısa bir süre alır.
Sonraki Adımlar
Sonraki Adımlar
- Kritik arka plan işleri için her birinin kalp atışını ekleyin, sadece günlükler için değil
- Yanıt süre trendlerini izleyin — yavaşlama genellikle tam bir kesintiden saatler önce tespit edilebilir
- Kontrol kontrollerinize
UsedDiskSpaceCheckveRedisCheckekleyin, böylece disk dolu olayları ve önbellek hataları, kesintiye neden olmadan önce ortaya çıkabilir
Ücretsiz olarak başlayın: vigilmon.online.
Kaynak: Orijinal Makale
- PHP Geliştiricilerinin En Çok Kaçırdığı İki Hata
- Adım 1: Bir sağlık kontrolu rotası ekleyin
- Adım 2: HTTP çalışma süresi izleme ayarlayın
- Adım 3: Kuyruklu işler için kalp atış hızı izleme
- Adım 4: Slack veya e-posta ile uyarılar
- Adım 5: Halka açık durum sayfası ve README rozeti
- Yapmış Olduğunuz Şeyler
- Sonraki Adımlar


