hosting

PHP Limitlerini Aşan İşler: Uzun İşlemleri Parçalamak

Zaman aşımına uğrayan uzun PHP işlerini parçalara bölme, kuyruk kurma ve ilerleme takibi yapma yöntemleri. PHP Limitlerini Aşan İşler: Uzun İşlemleri…

PHP Limitlerini Aşan İşler: Uzun İşlemleri Parçalamak
İçindekiler
  1. Karşınıza Çıkan Sınırlar
  2. Limit Yükseltmek Neden Çözüm Değil?
  3. Parçalı Çalıştırma
  4. Tetikleme Yöntemleri
  5. Bellek Yönetimi
  6. İlerleme Göstermek
  7. Büyük Dışa Aktarma
  8. Zamanlanmış Görevle Çalıştırmak
  9. İş Durumu Takibi
  10. Sonuç
  11. Sıkça Sorulan Sorular (SSS)
  12. Limitleri yükseltsem yeterli olmaz mı?
  13. Parçaladım ama hâlâ bellek hatası alıyorum?
  14. Sonraki parçayı nasıl tetiklemeliyim?
  15. Aynı kod görevde çalışıyor ama web'de çalışmıyor?

PHP Limitlerini Aşan İşler: Uzun İşlemleri Parçalamak

Beş bin kayıtlık bir dışa aktarma başlatıyorsunuz, sayfa bir süre bekliyor ve sonra boş ekran geliyor. Bellek limiti veya süre limiti aşıldı. Limitleri yükseltmek çözüm gibi görünüyor ama sürdürülebilir değil.

Bu yazı, uzun süren işleri paylaşımlı hostingde yapılabilir hâle getirmeyi ele alıyor.

Karşınıza Çıkan Sınırlar

Paylaşımlı hostingde birden fazla limit vardır ve hangisine takıldığınız farklı belirti üretir:

Limit Belirti
Bellek limiti Ölümcül hata, bellek tükendi
Süre limiti Maksimum süre aşıldı hatası
Web sunucusu zaman aşımı Ağ geçidi hatası
Tarayıcı zaman aşımı Sayfa yüklenemedi
Hesap kaynak kotası Süreç sonlandırıldı

Üçüncü satır sinsi bir durum üretir: web sunucusu zaman aşımına uğrayıp bağlantıyı kesse bile, PHP betiği arka planda çalışmaya devam edebilir — kullanıcı hata görür ama işlem yarım kalmaz, hatta tamamlanır.

Bu, kullanıcının işlemi tekrar başlatmasına ve aynı işin iki kez yapılmasına yol açar.

Limit Yükseltmek Neden Çözüm Değil?

Limitleri artırmak geçici bir rahatlama sağlar:

  • Veri büyüdükçe yine yetmez.
  • Hesap kotanız sınır koyar.
  • Uzun süren süreç diğer ziyaretçileri engeller.
  • Kullanıcı deneyimi kötü kalır.
  • Çökerse her şey kaybolur.

Üçüncü madde paylaşımlı hostingde belirleyicidir: on dakika çalışan bir betik, hesabınızın eşzamanlı süreç kotasından bir tanesini o süre boyunca işgal eder ve diğer ziyaretçiler sıraya girer.

Beşinci madde ise en can sıkıcı olanıdır. Dokuz dakika çalışıp onuncu dakikada kesilen bir işlem, hiçbir ilerleme bırakmaz.

Parçalı Çalıştırma

Doğru çözüm işi küçük adımlara bölmektir:

  1. İşi başlatın ve bir iş kaydı oluşturun.
  2. Her çalıştırmada belirli sayıda kayıt işleyin.
  3. İlerlemeyi kaydedin.
  4. Bitmediyse tekrar tetikleyin.
  5. Bitince kullanıcıya bildirin.

İkinci madde limitlerin altında kalmayı sağlar: her çalıştırma birkaç saniye sürdüğü için hiçbir limite yaklaşılmaz ve işlem sınırsız sayıda kayıt için sürdürülebilir olur.

Dördüncü madde için birkaç yöntem vardır ve hangisinin uygun olduğu ortama bağlıdır.

Tetikleme Yöntemleri

Sonraki parçayı başlatmanın yolları:

Yöntem Özelliği
Tarayıcıdan ardışık istek Basit, sayfa açık kalmalı
Zamanlanmış görev Arka planda, gecikmeli
Kendini yeniden tetikleme Hızlı, dikkatli kurulmalı
Sayfa yenileme yönlendirmesi Eski ama çalışır

Birinci satır en kolay ve en görünür olanıdır: tarayıcının ardışık istekler göndermesi, kullanıcıya ilerleme çubuğu göstermeyi de mümkün kılar — işlem şeffaf olur.

Dezavantajı, kullanıcının sayfayı kapatmaması gerektiğidir. Uzun işlemlerde bu bir kısıttır.

İkinci satır bu kısıtı ortadan kaldırır. Kullanıcı işi başlatır, sayfayı kapatır ve zamanlanmış görev arka planda tamamlar. Karşılığında işlem hemen başlamaz, bir sonraki görev çalışmasını bekler.

Üçüncü satır dikkatli kurulmazsa tehlikelidir — sonsuz döngüye girip hesabınızın kaynaklarını tüketebilir. Mutlaka bir üst sınır konmalıdır.

Bellek Yönetimi

Parçalama tek başına bellek sorununu çözmez:

  • Tüm sonuçları diziye toplamayın.
  • Satır satır işleyin.
  • Çıktıyı biriktirmeden yazın.
  • Kullanılmayan değişkenleri serbest bırakın.

Birinci madde en yaygın bellek hatasının kaynağıdır: on bin kaydı bir diziye alıp sonra işlemek, on bin kaydın tamamını aynı anda bellekte tutmak demektir.

Bunun yerine sonuçları satır satır okuyup her birini işleyip serbest bırakmak, bellek kullanımını sabit tutar — kayıt sayısı ne olursa olsun.

Üçüncü madde dışa aktarma işlemlerinde önemlidir. Tüm çıktıyı bir değişkende biriktirip sonda yazmak yerine, her satırı üretildiği anda dosyaya yazmak belleği korur.

İlerleme Göstermek

Uzun işlemlerde kullanıcıyı bilgilendirmek gerekir:

  1. Toplam ve işlenen sayıyı gösterin.
  2. Yüzde hesaplayın.
  3. Tahmini kalan süreyi belirtin.
  4. İptal seçeneği sunun.
  5. Bittiğinde net bildirim yapın.

Dördüncü madde kullanıcıya kontrol verir: yanlışlıkla başlatılan bir işlemi durduramamak, kullanıcıyı sekmeyi kapatmaya zorlar — ve arka plan işi devam eder.

İptal desteği, iş kaydına bir durum alanı ekleyip her parçada kontrol etmekle sağlanır.

Büyük Dışa Aktarma

Rapor ve dışa aktarma özel bir durumdur:

Yaklaşım Uygunluk
Anında akış olarak gönderme Orta boyut, süre limiti riski
Parçalı dosya üretip indirtme Büyük veri için doğru
E-posta ile gönderme Kullanıcı beklemez
Bağlantı gönderme Büyük dosyalarda en iyisi

Dördüncü satır en sağlam çözümdür: dosya arka planda hazırlanır ve kullanıcıya indirme bağlantısı gönderilir — hiçbir zaman aşımı riski kalmaz.

Üçüncü satırda ise ek boyutu sınırı sorun çıkarır. Büyük dosyalar e-postayla gönderilemez; bağlantı yöntemi bu kısıtı da aşar.

Birinci satır orta boyutlar için pratiktir ama çıktı tamponlaması kapatılmalı ve veriler üretildikçe gönderilmelidir.

Zamanlanmış Görevle Çalıştırmak

Arka plan işleri için görev kurulumu:

  • Sık aralıkla çalışsın. Bekleyen iş varsa alsın.
  • Çakışmayı önleyin. Kilit kullanın.
  • Her çalışmada sınırlı iş yapsın.
  • Hata durumunu kaydetsin.
  • Komut satırı sürümünü kullanın.

Beşinci madde önemli bir avantaj sağlar: komut satırından çalışan PHP genellikle web isteğinden farklı ve daha gevşek limitlere tabidir — süre limiti çoğu kurulumda sınırsızdır.

Bu, aynı kodun web isteğinde başarısız olurken zamanlanmış görevde çalışmasını açıklar.

İkinci madde ise üst üste binmeyi önler. Görev her dakika çalışıyorsa ve bir çalışma iki dakika sürüyorsa, kilit olmadan iki kopya aynı işi yapar.

İş Durumu Takibi

Arka plan işleri için bir kayıt tablosu gerekir:

  1. İş türü ve parametreleri
  2. Durum — bekliyor, çalışıyor, bitti, hata.
  3. İlerleme — kaç kayıt işlendi.
  4. Başlangıç ve bitiş zamanı
  5. Sonuç veya hata mesajı

İkinci maddede bir tuzak vardır: "çalışıyor" durumunda kalan bir iş, süreç çöktüyse sonsuza kadar öyle kalır ve yeniden alınmaz.

Bu yüzden duruma bir zaman damgası eşlik etmeli ve belirli süredir güncellenmeyen işler yeniden bekleyen duruma alınmalıdır.

Bu tür arka plan yapılarını zamanlanmış görev desteğiyle kurabileceğiniz hosting planları üzerinde, komut satırı PHP erişimi de genellikle mevcuttur.

Sonuç

Uzun işlemlerde limitleri yükseltmek sürdürülebilir bir çözüm değildir — on dakika çalışan bir betik, hesabınızın eşzamanlı süreç kotasından birini o süre boyunca işgal eder ve diğer ziyaretçiler bekler. Doğru yaklaşım işi parçalara bölüp ilerlemeyi kaydetmektir. Bellek tarafında ise en yaygın hata sonuçları diziye toplamaktır; satır satır işlemek bellek kullanımını sabit tutar. Ve komut satırından çalışan PHP genellikle daha gevşek limitlere tabidir.

Sıkça Sorulan Sorular (SSS)

Limitleri yükseltsem yeterli olmaz mı?

Geçici bir rahatlama sağlar ama veri büyüdükçe yine yetmez. Daha önemlisi, uzun çalışan bir betik hesabınızın eşzamanlı süreç kotasından birini o süre boyunca işgal eder ve diğer ziyaretçiler sıraya girer. Ayrıca çökerse hiçbir ilerleme kalmaz.

Parçaladım ama hâlâ bellek hatası alıyorum?

Muhtemelen sonuçları bir diziye topluyorsunuz. On bin kaydı diziye alıp sonra işlemek, hepsini aynı anda bellekte tutmak demektir. Satır satır okuyup her birini işleyip serbest bırakın — bellek kullanımı kayıt sayısından bağımsız sabit kalır.

Sonraki parçayı nasıl tetiklemeliyim?

Kullanıcı sayfayı açık tutabiliyorsa tarayıcıdan ardışık istek en basit ve şeffaf yöntemdir — ilerleme çubuğu da gösterebilirsiniz. Uzun işlemlerde zamanlanmış görev daha uygundur; kullanıcı sayfayı kapatabilir ve iş arka planda tamamlanır.

Aynı kod görevde çalışıyor ama web'de çalışmıyor?

Normal. Komut satırından çalışan PHP genellikle web isteğinden farklı ve daha gevşek limitlere tabidir — süre limiti çoğu kurulumda sınırsızdır. Ağır işleri zamanlanmış göreve taşımak bu farktan yararlanmanızı sağlar.