Причинение сбоя PHP
Как PHP может вызвать утечку памяти, переполнение буфера, переполнение стека и любые другие ошибки такого рода? Может ли PHP вызвать такие ошибки?
Ответы
Ответ 1
Вызывая некоторую бесконечную рекурсию, вы можете вызвать сбой 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 garbage collector will crash PHP for you.
(new destructorCrasher())->__destruct();
Также как рекурсивный __toString()
:
class toStringCrasher
{
public function __tostring()
{
return strval($this);
}
}
strval(new toStringCrasher());
Существуют и другие сценарии рекурсии, защищенные PHP. Например, вызов рекурсивной функции без условия выхода или рекурсивного самопроизвольного генератора. Эти не приводят к сбою, но фатальная ошибка Allowed memory size of ...
.
Для получения дополнительных примеров вы можете увидеть:
Ответ 2
Вы можете либо сделать материал, который может вызвать переполнение на любом языке (например, рекурсивно вызвать текущую функцию, бездумно использовать память и т.д.), или полагаться на старого старого интерпретатора PHP для выполнения этой работы. Просто посмотрите сколько утечек памяти было исправлено в PHP5 (Мой любимый: В 5.2.6 они исправили ошибка # 44069: 'Огромное использование памяти с конкатенацией с помощью .
вместо .=
').
В целом PHP - это нормально (самое большее), если вы просто хотите обслуживать один HTTP-запрос. Но вы не можете делать с ним сложные вещи (однажды я попробовал реализовать клиент Peer2Peer, сервер скончался от нехватки памяти всего через 10 минут - может быть ошибкой от моего имени, конечно, но я провел несколько дней, обнаружив утечки в мой собственный код - безрезультатно).
Ответ 3
PHP - интерпретируемый язык, поэтому все скрипты php защищены от утечек памяти, переполнения буфера и.
Как вы столкнетесь с такими проблемами:
Целочисленное переполнение, если вы назначаете слишком большой номер, он будет переполняться, и никаких исключений не будет.
Недостаточно памяти, используя больше памяти, чем размер памяти, настроенный в вашем php.ini