- Konu sahibi
- #1
İlk olarak hatanın kaynağını ayırın: PHP kodu gerçekten uzun sürüyorsa süre sınırını kontrollü biçimde artırın; yavaşlayan bölüm bir veritabanı sorgusu, uzak sunucu isteği veya sonsuz döngüyse yalnızca zaman aşımını yükseltmek yerine o bölümü düzeltin. PHP’de varsayılan
“Maximum execution time exceeded” hatası, PHP betiğinin izin verilen çalışma süresini aştığını gösterir. Bu durum her zaman PHP kodunun bütün olarak yavaş olduğu anlamına gelmez; büyük bir döngü, verimsiz sorgu, dosya işlemi, harici API isteği veya sonlanmayan bir işlem belirli noktada beklemeye neden olabilir.
Önce mevcut değeri ve PHP’nin kullandığı yapılandırmayı kontrol edin. Geçici olarak aşağıdaki kodu çalıştırabilirsiniz:
Tarayıcı üzerinden çalışan PHP ile komut satırından çalışan PHP farklı
Windows’ta
İşlem gerçekten uzun sürüyor ve hangi bölümün zaman aldığını biliyorsanız, ilgili betiğin başında
Buradaki
Sadece o betik çalıştığı sürece geçerli bir ayar yapmak isterseniz
Aynı türdeki betiklerin tamamı için daha yüksek bir süre gerekiyorsa, PHP’nin kullandığı
Dosyayı kaydettikten sonra web sunucusunu veya PHP-FPM hizmetini yeniden başlatmanız gerekebilir. Yeniden başlatma yöntemi işletim sistemine, web sunucusuna ve barındırma paneline göre değişir; doğrulanmamış bir menü adını kesin işlem sırası gibi uygulamayın. Değişikliğin web tarafında etkinleştiğini, tarayıcıdan çalıştırılan küçük bir
PHP komut satırında çalıştırılan betikler için sınırı yalnızca o çalıştırmada değiştirmek isterseniz PHP’nin
PHP CLI için varsayılan çalışma süresi çoğu durumda
Aşağıdaki ayrım, süreyi artırmanın yeterli olup olmadığını gösterir.
Gözlenen durum | Anlamı | İzlenecek yol
Kod her çalışmada benzer sürede tamamlanıyor, ancak sınırı aşıyor | İşlem beklenenden uzun fakat sonlanıyor | Geçici olarak süreyi artırın; ardından işlemi parçalara bölmeyi değerlendirin.
Çalışma süresi giderek artıyor veya işlem hiç bitmiyor | Sonsuz döngü, yanlış koşul veya büyüyen veri kümesi olabilir | Döngü koşulunu, sayaçları ve işlenen kayıt sayısını inceleyin; süreyi sınırsız yapmayın.
Hata veritabanı veya API çağrısında oluşuyor | Bekleme, sorgu planı veya uzak servisin yanıt süresi etkili olabilir | Sorguyu ölçün, gerekli alanları ve kayıtları sınırlayın; harici istemci için ayrıca bağlantı ve yanıt zaman aşımı belirleyin.
Kod ayarı değiştirdiği hâlde aynı değer görülüyor | Yanlış php.ini, kısıtlı yapılandırma veya farklı PHP SAPI kullanılıyor olabilir | Web ve CLI yapılandırmalarını ayrı kontrol edin; hosting yöneticisine mevcut değer ve hedef değerle başvurun.
Sorunu bulmak için uzun işlemin öncesi ve sonrasına zaman ölçümü ekleyebilirsiniz:
Bu ölçüm, yavaşlığın hangi bölümde olduğunu gösterir; tek başına sorgunun neden yavaş olduğunu kanıtlamaz. Sorgu ölçümünde kullanılan SQL, parametreler ve kayıt sayısı ayrıca incelenmelidir. Üretim ortamında hassas verileri loglamayın ve geçici tanılama kodunu işiniz bittiğinde kaldırın.
Özellikle veritabanı işlemlerinde tüm kayıtları tek seferde çekmek yerine sayfalama veya parça parça işleme kullanmak, uygun indeksleri kontrol etmek ve gereksiz alanları seçmemek daha kalıcı çözümlerdir. Büyük dışa aktarma, görsel işleme veya toplu güncelleme gibi işler tarayıcı isteğine bağlanmak yerine komut satırı görevi ya da kuyruk tabanlı arka plan işlemi olarak tasarlanabilir.
PHP’nin
Hosting kullanıyorsanız destek talebine şu bilgileri birlikte yazın: hatanın tam metni, oluştuğu URL veya komut, yaklaşık kaç saniye sonra oluştuğu,
max_execution_time değeri genellikle 30 saniyedir; bu sınır aşılırsa betik sonlandırılır.Hatanın ne anlama geldiğini belirleyin
“Maximum execution time exceeded” hatası, PHP betiğinin izin verilen çalışma süresini aştığını gösterir. Bu durum her zaman PHP kodunun bütün olarak yavaş olduğu anlamına gelmez; büyük bir döngü, verimsiz sorgu, dosya işlemi, harici API isteği veya sonlanmayan bir işlem belirli noktada beklemeye neden olabilir.
Önce mevcut değeri ve PHP’nin kullandığı yapılandırmayı kontrol edin. Geçici olarak aşağıdaki kodu çalıştırabilirsiniz:
PHP:
<?php
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'SAPI: ' . PHP_SAPI . PHP_EOL;
?>
Tarayıcı üzerinden çalışan PHP ile komut satırından çalışan PHP farklı
php.ini dosyaları kullanabilir. Bu nedenle komut satırında gördüğünüz değer, web sunucusunun çalıştırdığı PHP için geçerli olmayabilir. Komut satırında PHP’nin yapılandırmasını incelemek için şu komutu kullanabilirsiniz:
Bash:
php --ini
php -i | grep max_execution_time
Windows’ta
grep bulunmuyorsa ikinci komut yerine php -i çıktısı içinde max_execution_time ifadesini arayın.Kısa süreli çözüm: yalnızca ilgili betiğin süresini artırın
İşlem gerçekten uzun sürüyor ve hangi bölümün zaman aldığını biliyorsanız, ilgili betiğin başında
set_time_limit() kullanabilirsiniz:
PHP:
<?php
set_time_limit(120);
// Uzun süren, ancak sonlanacağı bilinen işlem
for ($i = 0; $i < 1000000; $i++) {
// İşlem
}
echo 'İşlem tamamlandı.';
?>
Buradaki
120, sürenin saniye cinsinden değeridir. set_time_limit(0) zaman sınırını kaldırır; ancak web sunucusunun, PHP-FPM’in, proxy’nin veya istemcinin ayrıca uyguladığı zaman aşımı varsa istek yine kesilebilir. Bu nedenle sınırsız süreyi özellikle web isteklerinde kalıcı çözüm olarak kullanmayın. set_time_limit() çağrısı süre sayacını yeniden başlatır; bu yüzden döngünün her turunda çağırarak problemi gizlemek yerine işlemin neden uzun sürdüğünü bulmak daha doğrudur.Sadece o betik çalıştığı sürece geçerli bir ayar yapmak isterseniz
ini_set() de kullanılabilir:
PHP:
<?php
if (ini_set('max_execution_time', '120') === false) {
exit('max_execution_time değiştirilemedi.');
}
// Uzun süren işlem
?>
ini_set() başarılı olduğunda önceki değeri döndürür; başarısız olduğunda false döner ve yeni değer uygulanmaz. Ayar, betik sonlandığında eski hâline döner. Bu nedenle kodun başına eklenen ayarın gerçekten etkili olup olmadığını ini_get('max_execution_time') ile kontrol edin.Kalıcı ayar gerekiyorsa php.ini değerini değiştirin
Aynı türdeki betiklerin tamamı için daha yüksek bir süre gerekiyorsa, PHP’nin kullandığı
php.ini dosyasındaki şu satırı değiştirin:
INI:
max_execution_time = 120
Dosyayı kaydettikten sonra web sunucusunu veya PHP-FPM hizmetini yeniden başlatmanız gerekebilir. Yeniden başlatma yöntemi işletim sistemine, web sunucusuna ve barındırma paneline göre değişir; doğrulanmamış bir menü adını kesin işlem sırası gibi uygulamayın. Değişikliğin web tarafında etkinleştiğini, tarayıcıdan çalıştırılan küçük bir
ini_get() kontrolüyle doğrulayın. Eski değer görünüyorsa yanlış php.ini dosyasını düzenlemiş olabilir veya barındırma sağlayıcısı bu yönergenin değiştirilmesine izin vermiyor olabilir.PHP komut satırında çalıştırılan betikler için sınırı yalnızca o çalıştırmada değiştirmek isterseniz PHP’nin
-d seçeneğini kullanabilirsiniz:
Bash:
php -d max_execution_time=120 script.php
PHP CLI için varsayılan çalışma süresi çoğu durumda
0 olduğundan, web isteği ile CLI çalıştırmasını aynı davranışta kabul etmeyin. CLI komutunda yine de işletim sistemi, görev zamanlayıcısı veya çalıştırma komutu tarafından ayrıca süre sınırı uygulanabilir.Hangi durumda hangi çözüm uygulanmalı?
Aşağıdaki ayrım, süreyi artırmanın yeterli olup olmadığını gösterir.
Gözlenen durum | Anlamı | İzlenecek yol
Kod her çalışmada benzer sürede tamamlanıyor, ancak sınırı aşıyor | İşlem beklenenden uzun fakat sonlanıyor | Geçici olarak süreyi artırın; ardından işlemi parçalara bölmeyi değerlendirin.
Çalışma süresi giderek artıyor veya işlem hiç bitmiyor | Sonsuz döngü, yanlış koşul veya büyüyen veri kümesi olabilir | Döngü koşulunu, sayaçları ve işlenen kayıt sayısını inceleyin; süreyi sınırsız yapmayın.
Hata veritabanı veya API çağrısında oluşuyor | Bekleme, sorgu planı veya uzak servisin yanıt süresi etkili olabilir | Sorguyu ölçün, gerekli alanları ve kayıtları sınırlayın; harici istemci için ayrıca bağlantı ve yanıt zaman aşımı belirleyin.
Kod ayarı değiştirdiği hâlde aynı değer görülüyor | Yanlış php.ini, kısıtlı yapılandırma veya farklı PHP SAPI kullanılıyor olabilir | Web ve CLI yapılandırmalarını ayrı kontrol edin; hosting yöneticisine mevcut değer ve hedef değerle başvurun.
Asıl yavaş bölümü ölçmeden süreyi yükseltmeyin
Sorunu bulmak için uzun işlemin öncesi ve sonrasına zaman ölçümü ekleyebilirsiniz:
PHP:
<?php
$baslangic = microtime(true);
// İncelenecek işlem
$sonuc = veriyi_isle();
$gecen = microtime(true) - $baslangic;
error_log(sprintf('veriyi_isle süresi: %.3f saniye', $gecen));
?>
Bu ölçüm, yavaşlığın hangi bölümde olduğunu gösterir; tek başına sorgunun neden yavaş olduğunu kanıtlamaz. Sorgu ölçümünde kullanılan SQL, parametreler ve kayıt sayısı ayrıca incelenmelidir. Üretim ortamında hassas verileri loglamayın ve geçici tanılama kodunu işiniz bittiğinde kaldırın.
Özellikle veritabanı işlemlerinde tüm kayıtları tek seferde çekmek yerine sayfalama veya parça parça işleme kullanmak, uygun indeksleri kontrol etmek ve gereksiz alanları seçmemek daha kalıcı çözümlerdir. Büyük dışa aktarma, görsel işleme veya toplu güncelleme gibi işler tarayıcı isteğine bağlanmak yerine komut satırı görevi ya da kuyruk tabanlı arka plan işlemi olarak tasarlanabilir.
PHP süresi artırıldığı hâlde istek yine kesiliyorsa
PHP’nin
max_execution_time değeri tek zaman aşımı değildir. Web sunucusu ve PHP çalışma ortamı da isteği sonlandırabilir. PHP belgeleri Apache ve IIS gibi sunucularda ayrıca sunucu zaman aşımı yapılandırmalarının bulunabileceğini belirtir. Bu nedenle PHP değeri 120 saniye olduğu hâlde örneğin daha erken bir sürede bağlantı kopuyorsa, hata kaydında web sunucusu, PHP-FPM veya proxy kesintisini arayın.Hosting kullanıyorsanız destek talebine şu bilgileri birlikte yazın: hatanın tam metni, oluştuğu URL veya komut, yaklaşık kaç saniye sonra oluştuğu,
PHP_VERSION, PHP_SAPI, görülen max_execution_time değeri ve işlemin veritabanı, dosya veya harici API kullanıp kullanmadığı. İstediğiniz değişiklik de açık olmalıdır: örneğin “web PHP için max_execution_time değerinin 120 saniye yapılması ve PHP-FPM/web sunucusu zaman aşımının bu değere izin verip vermediğinin kontrol edilmesi”. Böylece yalnızca PHP ayarının değil, isteği kesen diğer katmanın da incelenmesini sağlamış olursunuz.