Hepimiz bu durumu yaşadık. Sessiz bir Salı, kahvenizi almışsınız ve basit bir API entegrasyonu yapıyorsunuz—bu durumda benimki Monnify. Laravel Http facade kullanıyorsunuz çünkü modern bir geliştiricisiniz. En iyi uygulamaları aklınızda tutarak bir try-catch bloğu ile sarmalıyorsunuz.
“Gönder” tuşuna bastığınız an.
Sonuç: Soğuk bir 503 Service Unavailable. Hiçbir stack trace yok. Hata günlüğü yok. Sadece beyaz bir ölüm ekranı ve derin bir ihanet duygusu.
“Kara Delik” Sırrı
“Kara Delik” Sırrı
Koduma logger() çağrıları eklemeye başladım, sanki karanlık bir ormanda iz bırakıyormuşum gibi.
logger(“Buradayım”) — Kaydedildi.
logger(“API çağrısına hazırlanıyorum”) …Kaydedildi.
$response = Http::post(…)
logger(“Hayatta kaldım!”) … KAYDEDİLMEDİ.
Kodum sadece başarısız olmuyordu; mikroatomik bir solucan deliğine kayboluyordu. Catch bloğu? Yoksayıldı. Finally bloğu? Efsane. Sunucum (Nginx/Litespeed) PHP’ye bakıyor ve “Kendini bulmak için fazla zaman harcıyorsun, bu işi bırakıyorum,” diyerek süreci sonlandırıyordu.
Alışıldık Şüpheliler (yani “Scriptimi Ne Öldürdü”)
Üç saatlik araştırma sonucunda, bu 503 hayaletinin arkasındaki üç suçluyu buldum; özellikle eski sistemlerle çalışırken yaygın olanlar:
1. “İsimlendirilmiş Argüman” Snobluğu
Ben ->retry(3, 100, throw: true) kullanıyordum. İşte sıkıntı: İsimlendirilmiş argümanlar Laravel 10+ / PHP 8.0+ lüksüdür. Sunucunuz daha eski bir versiyonda çalışıyorsa, bu sadece bir hata değil—bu bir Fatal Syntax Error. Çünkü bu, mantık içindeki bir sözdizimi hatasıdır ve script çalışmaya bile başlamadan ölüyor.
2. \Exception ile \Throwable Arasındaki Kavga
Standard catch (\Exception $e) bir kapıcı gibi, sadece kimlikleri kontrol eder. Scriptiniz Fatal Error veya Type Error (eski sürüm uyumsuzluklarında yaygındır) ile karşılaşırsa, o kapıcının yanından geçip gider. Bunun yerine catch (\Throwable $e) kullanmalısınız—tam vücut kontrolden geçen kapıcı.
3. Guzzle “Sizi Görmüyor”
Bazen, Guzzle kütüphanesi (Laravel’in Http’sini destekleyen) ve sunucunuzun SSL sertifikaları anlaşamaz. Sürekli devam eden bir el sıkışmasına takılırlar, bu da PHP şikayet etmeden önce sunucu tarafında bir zaman aşımına yol açarak 503 döner.
Çözüm: “Eski Okul” Pure cURL Kullanmak
Çözüm: “Eski Okul” Pure cURL Kullanmak
Bir frameworkün yüksek düzeydeki “büyüsü” lanetli bir kalıntı gibi davranmaya başladığında, temellere geri dönersiniz. Fancy Http facade’ı Pure PHP cURL ile değiştirdim.
cURL, frameworkünüzün hislerini umursamaz. İnternetin “Yaşlı Adam”ıdır—sadece çalışır. cURL kullanarak, CONNECTTIMEOUT ve TIMEOUT ayarlarını belirleyebildim, bu da scriptin sessizce asılı kalmak yerine yüksek sesle başarısız olmasını sağladı.
Facade sizi hayal kırıklığına uğratırsa, köklerinizi hatırlayın:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['nin' => $nin]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $token
]);
// Sunucuya şunu söyle: "Eğer 10s içinde bir geri dönüş almazsan, bağır."
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$result = curl_exec($ch);
if (curl_errno($ch)) {
logger()->error("CURL Hatası: " . curl_error($ch));
}
curl_close($ch);
return $result;
Hikayenin Dersleri
Hikayenin Dersleri
Frameworkünüzün sizi yanıltmasına izin vermeyin. Eğer loglarınız cümle ortasında duruyorsa ve sunucunuz 503 hatası veriyorsa:
\Exception’a güvenmeyi bırakın ve \Throwable yakalamaya başlayın.
Sözdizimi uyumluluğunuzu kontrol edin. (İsimlendirilmiş argümanlar eski PHP versiyonlarında hayatınızı mahvedebilir).
Magic’i geçin (bu çok önemli!). Eğer Http facade takılıyorsa, cURL kullanın. “Vazgeçmek” değil, “kontrolü ele almak.“
Şimdi, o API’leri düzeltin ve biraz uyku alın. Bunu hak ettiniz!
Kaynak: Orijinal Makale


