Причинение сбоя 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