Как в PHP работает сборщик мусора и есть ли он вообще в принципе? Насколько я понял примитивы "потерять" невозможно. А если на объект, массивы или строку потеряна ссылка? Больше никто не ссылается. Он остается висеть в памяти до конца или убивается сборщиком мусора? Или только в ручную убивать объекты можно?
Сборщик мусора есть. Каждый раз при создании примитива создаётся zval контейнер, в котором есть такой ключ, как refcount равный единице по умолчанию. Это кол-во ссылок на значение. Когда удалены все ссылки на значение, методом unset($var), тогда контейнер удаляется из памяти. У объектов и массивов своя таблица имён. Например, при создании массива [1 => 'first', 2 => 'second'] создаётся три zval контейнера (массив контейнер; в нем у ключа 1 свой контейнер и ключа 2 тоже свой контейнер). Объект и массив удаляется из памяти, когда у них refcount равен нулю. Т.е. все ссылки убиты методом unset() Использованные источники: https://stackoverflow.com/questions...ollection-why-is-this-object-still-referenced про ссылки на объекты, пример как убивать их и пример, демонстрирующий, что unset(&$var) не убьёт ссылку https://php.ru/manual/features.gc.refcounting-basics.html про контейнеры @MouseZver а как же демоны, сокет серверы, ну PhpComet, ещё PhpReact есть, по-моему. Я знаю, что это все дичь, когда есть socket.io, но все же может кто-то использует php сокет серверы
Спасибо! Хорошее объяснение! А String - это примитив в PHP или объект? Или вообще отдельная тема? И раз зашел разговор - они Mutable или immutable? Т.е. при изменении строки каждый раз новая делается?
с точки зрения движка - все и всегда хранится в структурах zval. Даже undefined. --- Добавлено --- https://github.com/php/php-src/blob/master/Zend/zend_types.h я сейчас серьезно, код пыха довольно прост и понятен, даже если ты не разбираешься в сях. p.s. GC вроде как опять переписан в 7.3, правда я ещё не разбирался что они там поменяли.