Порождение PHP отказать

Как PHP может вызвать утечки памяти, переполнение буфера, переполнения стека и какие-либо другие ошибки такого вида? PHP может даже вызвать такие ошибки?

13
задан sepehr 17 June 2017 в 12:16
поделиться

3 ответа

Вызывая некую бесконечную рекурсию, вы можете вызвать сбой 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. Например, вызов рекурсивной функции без условия выхода или рекурсивного самодостаточного генератора. Они вызывают не сбой, а фатальную ошибку Допустимый размер памяти ... .

Дополнительные примеры можно найти в:

12
ответ дан 2 December 2019 в 00:17
поделиться

PHP - это интерпретируемый язык, поэтому все скрипты php защищены от утечки памяти, переполнения буфера и переполнения стека.

Как бы то ни было, вы столкнетесь с проблемами как таковыми:

Целочисленное переполнение, если вы присвоите слишком большое число, оно будет переполнено, и никаких исключений не произойдет.

Недостаточно памяти, используется больше памяти, чем размер памяти, заданный в вашем php.ini

1
ответ дан 2 December 2019 в 00:17
поделиться

Вы можете либо делать то, что может вызвать переполнение на любом языке (например, рекурсивно вызывать текущую функцию, бездумно поглощать память и т. Д.), Либо полагаться на старый добрый интерпретатор PHP для этой работы. Посмотрите , сколько утечек памяти было исправлено в PHP5 (Мой любимый: в 5.2.6 они исправили ошибку №44069 : «Огромное использование памяти при конкатенации с использованием . вместо . = ').

В целом PHP нормально (максимум), если вы просто хотите обслужить один HTTP-запрос. Но вы не можете делать с ним сложные вещи (однажды я пытался реализовать клиент Peer2Peer, сервер умер из-за нехватки памяти всего через 10 минут - это, конечно, могло быть ошибкой с моей стороны, но я потратил несколько дней на поиск утечек в мой собственный код - безрезультатно).

2
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: