Как PHP может вызвать утечки памяти, переполнение буфера, переполнения стека и какие-либо другие ошибки такого вида? PHP может даже вызвать такие ошибки?
Вызывая некую бесконечную рекурсию, вы можете вызвать сбой PHP.
Например, файл, который рекурсивно требует самого себя, должен вызвать переполнение стека:
require __FILE__;
Или рекурсию в магическом методе __ sleep ()
, который должен десериализовать объект, но вызывает serialize ()
вместо:
class sleepCrasher
{
public function __sleep()
{
serialize($this);
}
}
serialize(new sleepCrasher());
Или деструктор класса , который создает новые экземпляры:
class destructorCrasher
{
public function __destruct()
{
new destructorCrasher();
}
}
// Calling __destruct() manually is just for the sake of example,
// In real scenarios, PHP's garbage collector will crash PHP for you.
(new destructorCrasher())->__destruct();
А также рекурсивный __ toString ()
:
class toStringCrasher
{
public function __tostring()
{
return strval($this);
}
}
strval(new toStringCrasher());
Есть и другие сценарии рекурсии, от которых защищен PHP. Например, вызов рекурсивной функции без условия выхода или рекурсивного самодостаточного генератора. Они вызывают не сбой, а фатальную ошибку Допустимый размер памяти ...
.
Дополнительные примеры можно найти в:
PHP - это интерпретируемый язык, поэтому все скрипты php защищены от утечки памяти, переполнения буфера и переполнения стека.
Как бы то ни было, вы столкнетесь с проблемами как таковыми:
Целочисленное переполнение, если вы присвоите слишком большое число, оно будет переполнено, и никаких исключений не произойдет.
Недостаточно памяти, используется больше памяти, чем размер памяти, заданный в вашем php.ini
Вы можете либо делать то, что может вызвать переполнение на любом языке (например, рекурсивно вызывать текущую функцию, бездумно поглощать память и т. Д.), Либо полагаться на старый добрый интерпретатор PHP для этой работы. Посмотрите , сколько утечек памяти было исправлено в PHP5 (Мой любимый: в 5.2.6 они исправили ошибку №44069 : «Огромное использование памяти при конкатенации с использованием .
вместо . =
').
В целом PHP нормально (максимум), если вы просто хотите обслужить один HTTP-запрос. Но вы не можете делать с ним сложные вещи (однажды я пытался реализовать клиент Peer2Peer, сервер умер из-за нехватки памяти всего через 10 минут - это, конечно, могло быть ошибкой с моей стороны, но я потратил несколько дней на поиск утечек в мой собственный код - безрезультатно).