3 Kasım 2026 - 20:37
PHP cURL Error 28: İstek Nerede Zaman Aşımına Uğruyor? Görseli
PHP

PHP cURL Error 28: İstek Nerede Zaman Aşımına Uğruyor?

0 Yorumlar

Bir API isteği bazen bir saniyede dönüyor, bazen “cURL error 28” ile kesiliyor. İlk refleks bekleme süresini artırmak oluyor. Ama DNS cevabı gelmiyorsa veya bağlantı kurulup karşı taraf uzun süre susuyorsa aynı ayar farklı sorunları gizler. Önce isteğin nerede beklediğini görelim.

28 numaralı hata, cURL işleminin bir zaman sınırına takıldığını söyler. Hangi aşamanın yavaş olduğunu tek başına açıklamaz. HTTP 500 ise farklıdır: karşı sunucu cevap vermiş, uygulama tarafında hata bildirmiştir. Sertifika doğrulama sorunu içinse cURL 60 rehberine bakabilirsin.

Bağlantı süresi ile toplam süre aynı ayar değil

CURLOPT_CONNECTTIMEOUT, bağlantı kurulması için ayrılan süredir; DNS çözümlemesi ve TLS gibi bağlantı görüşmelerini de kapsar. TLS, HTTPS trafiğini şifreleyen bağlantı katmanıdır. CURLOPT_TIMEOUT ise bağlantı dahil bütün aktarımı sınırlar. Toplam süre 10 saniyeyse bağlantıya 30 saniye tanımak isteği 30 saniye bekletmez. cURL bağlantı süresi belgesi bu ayrımı açıklıyor.

Aşağıdaki örnek PHP cURL eklentisi gerektiriyor. Adresi kendi kontrol ettiğin, küçük cevap döndüren bir deneme adresiyle değiştir. Örnek GET isteği yapar; ödeme veya kayıt oluşturan bir çağrıyı tekrar tekrar göndermek için kullanma.

PHP
<?php
$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 15,
    CURLOPT_FOLLOWLOCATION => false,
]);

$body = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$info = curl_getinfo($ch);

printf("curl_errno=%d http=%d\n", $errno, $info['http_code']);
printf("dns=%.3f connect=%.3f tls=%.3f first=%.3f total=%.3f\n",
    $info['namelookup_time'],
    $info['connect_time'],
    curl_getinfo($ch, CURLINFO_APPCONNECT_TIME),
    $info['starttransfer_time'],
    $info['total_time']
);

if ($body === false) {
    fwrite(STDERR, $error . PHP_EOL);
    exit(1);
}

Bunu terminalde çalıştırılacak bir teşhis dosyası olarak düşün. STDERR, hata mesajlarının yazıldığı terminal kanalı. Örnek, gelen cevabın gövdesini ekrana basmıyor; süreleri inceliyoruz. Web isteği içinde kullanacaksan teşhis bilgisini ziyaretçiye göstermek yerine uygulama kayıtlarına uygun biçimde işle.

Sayıları beş ayrı kronometre sanmayalım

Bu alanlar genellikle isteğin başlangıcından ilgili aşamaya kadar geçen birikimli sürelerdir. dns isim çözümlemesinin tamamlanmasını, connect bağlantının kurulmasını, tls şifreli görüşmenin bitmesini, first ilk yanıt baytını gösterir. total bütün işlemdir. İlk bayt süresi, sunucunun yanıt hazırlamasını da içerir; yalnız uygulama kodunun çalışma süresi değildir. Alan tanımları DNS, TLS ve ilk bayt belgelerinde bulunuyor.

GözlemSonraki kontrol
DNS aşaması gecikiyorUygulamanın kullandığı çözümleyici ve alan adının DNS yanıtı
DNS bitiyor, bağlantı kurulamıyorHedef port, çıkış kuralı, yönlendirme ve adres ailesi
TLS tamamlanıyor, ilk yanıt gecikiyorKarşı uygulama kayıtları, kuyruk ve aradaki proxy
İlk yanıt hızlı, aktarım uzuyorYanıt boyutu, bağlantı hızı ve parça parça veri gönderimi

İstek bir aşamaya ulaşmadan kesildiyse sonraki alan sıfır kalabilir. Bu, o işin sıfır saniyede tamamlandığını göstermez. Bağlantı tekrar kullanımı, proxy ve farklı protokoller de sürelerin yorumunu değiştirir. Tek ölçümle kesin teşhis koymak yerine aynı küçük isteği birkaç kez karşılaştır.

Terminal çalışıyor, PHP çalışmıyorsa

Terminaldeki curl ile PHP eklentisi farklı kütüphane, proxy ayarı veya ağ ortamı kullanabilir. Aynı sunucuda olmak her zaman aynı koşul demek değil. PHP'nin çalıştığı konteyneri, kullanıcıyı ve web/terminal ayrımını kaydet. WordPress'te hata çıkıyorsa doğrudan API denemesiyle uygulamanın kendi HTTP çağrısını ayrı incele; eklenti filtresi veya başka bir işlem toplam süreyi etkileyebilir.

Süreyi artırmak ancak normal yanıt süresini bildiğinde anlamlı. Bir isteğin zaman aşımına uğraması, karşı tarafta hiç işlem yapılmadığını kanıtlamaz. Veri değiştiren çağrılarda otomatik tekrar denemeden önce API'nin aynı işlemi iki kez yapmayı önleyen yöntemini kullan. Düzenlemeden sonra aynı adresi, aynı ortamı ve aynı süre alanlarını tekrar ölç; hangi aşamanın düzeldiğini böyle görebilirsin.

Benzer Yazılar

Yorumlar (0)

Henüz yorum yok. İlk yorum yapan sen ol!

Yorum Yap