Что именно делает функция PHP gc_enable? - PullRequest
12 голосов
/ 17 января 2011

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 17 января 2011

gc_enable требуется только в том случае, если вы звоните gc_disable.На самом деле нет разумной причины делать это, поскольку это может привести к тому, что циклические ссылки не будут собираться мусором (например, до 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 теперь может обнаружить это и очистить эти объекты. </p>

8 голосов
/ 17 января 2011

В руководстве по PHP есть полная глава о сборке мусора , объясняющая это:

Обычно я стараюсь не просто ссылаться на сторонние сайты, но чувствую, что это слишком много для подведения итогов.

2 голосов
/ 03 декабря 2014

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

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

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

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

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

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

...