Uygulama yazarken bazen client işlemlerine ihtiyacımız olur ve farklı kaynaklardan bilgi, görsel vs gibi bilgiler almamız gerekebilir. Burada anlatacağım örnekte ben PHP’nin file_get_contents fonksiyonunu başka siteden resim çekmek için kullanıyorum. Buraya kadar her şey olağan peki resmi çekmek istediğimiz site bize geç cevap verirse ya da çekmek istediğiniz resmin boyutundan dolayı işlem uzun sürerse ne olacak? Böyle bir durumda PHP zaman aşımı hatası (timeouts) verecektir.

PHP’de bir işlemin ne kadar zaman içerisinde tamamlanması gerektiği max_execution_time olarak tanımlı olan değerle ifade edilir. Bu değer varsayılan olarak 30 saniyedir. Ancak yukarıda belirttiğim senaryoda ayrıca devreye giren başka bir zaman aşımı limiti daha var. PHP’de HTTP Client işlemleri yapıldığında bu işlemler için kullanılan zaman aşımı limiti default_socket_timeout ayarı ile belirtilir. Bu değer de varsayılan olarak 60 saniyedir.

Bu senaryoda PHP’nin timeout hatası vermesi için 30 + 60 = 90 saniye gibi bir zaman geçmesi gerekecektir. Çünkü HTTP isteklerindeki default_socket_timeout olarak belirtilen 60 saniyelik zaman aşımı max_execution_time da belirtilen 30 saniyelik süreçten ayrı olarak hesaplanır. Buda işlemin ancak 90 saniye sonra timeout hatası vermesine neden olacaktır.

İçindekiler Tablosu

HTTP Client Zaman Aşımı Süresini Kısıtlama

Http request işlemleriniz için zaman aşımını yönetmenin bir kaç farklı yolu var.

1- PHP’nin varsayılan tanımlamalarını değiştirmek

2- Her request işlemi için özel timeout zamanı belirtmek

PHP’nin Varsayılan Tanımlamalarını Değiştirmek

Uygulamanızdaki bütün HTTP Client işlemlerinde geçerli olması için varsayılan değeri değiştirebilirsiniz. Bunun için PHP ini ayarlarından default_socket_timeout değeri için yeni bir süre belirtmeniz yeterli olacaktır. Aşağıdaki örnekte timeout süresi 10 saniye olarak belirtilmiştir.

ini_set("default_socket_timeout", 10);

Böyle bir değişiklik yaptığınızda bu ayarın tüm HTTP Client işlemlerinde geçerli olacağını file_get_contents, fopen, SOAPClient ve DOMDocument::load işlemlerinin tamamının etkileneceğini unutmayın.

file_get_contents İçin Özel Timeout Süresi Belirtmek

Tüm uygulamayı etkileyecek bir değişikliktense yaptığınız işleme özel timeout süresi belirtmek daha uygun olabilir. Çünkü yaptığınız işleme göre bazı işlemlerin uzun sürmesi bazılarının ise çok kısa sürmesi olağan bir durumdur. Tüm işlemler için kısa bir timeout süresi belirtmek sürekli timeout hatası almanıza neden olabilir.

$context = stream_context_create([
     'http' => [
        'timeout' => 1.0, //saniye
        'ignore_errors' => true,
     ],
]);

$data = @file_get_contents("http://orneksite.com/ornek_resim.jpg", false, $context);

if ($data === false) {
    // timeout
}

Yukarıdaki örnekte file_get_contents fonksiyonu ile link’den veri çekme işlemi yapıyor. Bu işlem için $context içinde belirtildiği gibi timeout süresini 1 saniye olarak belirledik. Ayrıca @file_get_contents ifadesinde de dikkatinizi çekeceği üzere @ işareti ile PHP‘nin burada hata vermesini engellemiş olduk. Böylece linkten veri çekme işleminin 1 saniyeden fazla sürmesi durumunda timeout hatasının meydana gelmesini engelledik ancak 1 saniye sonunda işlemin sonlandırılmasını ve kodun devam etmesini sağladık.

Eğer HTTP request işlemi 1 saniyeden fazla sürerse $data değeri false olarak dönecektir. Bu durumda da kullanıcıya bilgilendirme için bir mesaj iletebilirsiniz ya da timeout olması durumunda farklı işlemler gerçekleştirebilirsiniz.

Bu yazımda file_get_contents için özel timeout tanımlama yapmayı anlattım. SOAPClient, DOMDocument::load gibi diğer işlemler için özel timeout tanımlamasının nasıl yapıldığını incelemek için bu makaleyi inceleyebilirsiniz.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz