PHP yığın taşması işlemek değil?

4 Cevap php

Ben sadece şu PHP kodu çalıştı şaşırdım:

function foo()
{
    foo();
}
foo();

: "İç sunucu hatası 500" Ben almak bekleniyor. Bunun yerine bağlantı (hayır alınan bayt) derhal kapatılmalı ve günlük dosyaları apache hata alıyor göstermektedir edildi. WTF? Bu PHP bilinen bir hata mı? Kaçırdığım bazı yapılandırma seçenekleri var mı? Her kaza yığın taşması için bir kaza süreç olduğundan, iyi ... oldukça kabul edilemez bence.

4 Cevap

PHP bu ile başa çıkmak mümkün değil, sadece sonsuz bir döngü içine gidin ve bir segment hataya üretecek.

http://bugs.php.net/bug.php?id=49823

ayrıca

http://www.mail-archive.com/php-bugs@lists.php.net/msg128905.html

iBlog - Ilia Alshanetsky alınan

Stack overflow. PHP does not have any internal stack protection choosing to rely upon the system stack without any protection. This means that if you have a recursive function or a method PHP will eventually crash.

function a() { a(); } a();

There are 2 solutions to this problem, 1 avoid using recursive functions they are generally a bad idea anyway, and if you MUST use them implement some counter using a global variable that would prevent the function from iterating itself more then X amount of time for values of X between 500 to 1000. The other solution involves using the xdebug extension that implements protection against stack overflows by defining a limit on how deep can recursive functions go via a php.ini value. This is a better solution in hosting environments where you have no control over the scripts that are being ran on the server.

genellikle kötü bir fikir "olduğunu özyinelemeli fonksiyonlarını kullanarak kaçının 0 riiight :))) onlar icat edildi :)) onun kötü bir ideea çünkü ...

Ben fonksiyonlar denir kez sayısına bir hrd üst limit belirleyerek önerin. Global değişkenleri kullanmak YAPMAYIN (aslında daha özyinelemeli işlevleri çağırmak gerekebilir, niye böyle küresellerle kirletmez?). Bir işlev için ekstra parametreleri kullanabilirsiniz

function a($param1, $param2, $depth=100){
  $depth--;
  if(!$depth==0) return error
}

Bu bilinen bir hata olduğunu düşünüyorum. Listesine bakın Top 10 ways to crash PHP.