За последние 24 часа нас посетил 11761 программист и 1259 роботов. Сейчас ищут 475 программистов ...

Сборщик мусора и работа с памятью в PHP

Тема в разделе "PHP для новичков", создана пользователем glorsh66, 6 сен 2018.

  1. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    242
    Симпатии:
    4
    Как в PHP работает сборщик мусора и есть ли он вообще в принципе?

    Насколько я понял примитивы "потерять" невозможно.

    А если на объект, массивы или строку потеряна ссылка? Больше никто не ссылается.
    Он остается висеть в памяти до конца или убивается сборщиком мусора?


    Или только в ручную убивать объекты можно?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.562
    Симпатии:
    1.284
    Адрес:
    Лень
    Один вердикт: PHP создан чтобы сдохнуть, после выполнения
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Сборщик мусора есть.

    Каждый раз при создании примитива создаётся 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 сокет серверы
     
    #3 виталий032, 6 сен 2018
    Последнее редактирование: 6 сен 2018
    glorsh66 и romach нравится это.
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    процесс swoole + laravel запущен в июне и как-то не дохнет до сих пор. Всё это уже давно не дичь.
     
    glorsh66 нравится это.
  5. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    242
    Симпатии:
    4
    Спасибо! Хорошее объяснение!


    А String - это примитив в PHP или объект? Или вообще отдельная тема?
    И раз зашел разговор - они Mutable или immutable?
    Т.е. при изменении строки каждый раз новая делается?
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    с точки зрения движка - все и всегда хранится в структурах zval. Даже undefined.
    --- Добавлено ---
    https://github.com/php/php-src/blob/master/Zend/zend_types.h

    я сейчас серьезно, код пыха довольно прост и понятен, даже если ты не разбираешься в сях.

    p.s. GC вроде как опять переписан в 7.3, правда я ещё не разбирался что они там поменяли.
     
    виталий032 и glorsh66 нравится это.