Подтвердить что ты не робот

Что делает функция gc_enable PHP точно?

Прежде чем вы скажете мне прочитать руководство, ознакомьтесь с документацией php.net для этой функции:

Внимание
Эта функция в настоящее время не документирована; доступен только список его аргументов.

Это было полезно!

Эта страница объясняет, что она позволяет сборку мусора для циклических ссылок. Где и когда это полезно? Может ли кто-нибудь показать мне пример его использования? Предпочтительно пример, где циклическая ссылка создается и затем собирается.

4b9b3361

Ответ 1

gc_enable требуется только при вызове gc_disable. Для этого не существует разумной причины, так как это приведет к циклическим ссылкам, чтобы не собирать мусор (например, pre-5.3, когда циклический GC не существовал).

Сборщик мусора PHP работает по подсчету ссылок. Вы можете представить переменную как "указатель" на объект. Когда объект не имеет указателей на него, он "мертв", потому что ничего не может достичь, поэтому он собирает мусор.

//one thing points to the Foo object
$a = new Foo();

//now two things do
$b = $a;

//now only $b points to it
$a = null;

//now nothing points to Foo, so php garbage collects the object
$b = null;

Учтите это:

$a = new Foo();
$b = new Bar();
$b->foo = $a;
$a->bar = $b;

$a = $b = null;

В этот момент ничего не держится за $a или $b, кроме самих объектов. Это циклическая ссылка, а в предыдущих версиях php (< 5.3) не собиралась. Циклический коллектор в 5.3 теперь может обнаружить это и очистить эти объекты.

Ответ 3

Есть причины, по которым мы используем gc_disable и gc_enable.

В последнем руководстве по PHP в нем указано

Может быть очень полезно для больших проектов, когда вы создаете много объектов, которые должны оставаться в памяти. Таким образом, GC не может их очистить и просто тратить время процессора.

Проблема в композиторе: https://github.com/composer/composer/pull/3482#issuecomment-65199153

Решение и ответы людей: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

Напоминаем, что вторая ссылка выше содержит много комментариев с графикой.