В общем управлении памятью ПГПСА работает из коробки для всех переменных, которые вы объявляете и использование. Используя refcounting концепции, PHP видит, что переменная больше не используется, а затем автоматически очищает ее.
Сборщик мусора интересен только для случаев, когда объекты имеют циклические ссылки, A указывает на B, B указывает на A. В этом случае refcounting не работает.
Если в памяти PHP имеется ровно 10.000 объектов, которые потенциально цикличны, потенциально не используются больше, тогда сборщик мусора PHP запускает, если он включен, что по умолчанию. Вы можете отключить или включить его с помощью gc_enable()
и gc_disable()
во время выполнения.
Вы также можете позвонить gc_collect_cycles()
для очистки этих объектов вручную.
Но как оптимизировать этот процесс, если вам нужно? Запуск коллектора циклов не должен быть эффективным или полезным, из 10.000 потенциальных объектов, многие из них все еще могут быть использованы и не могут быть очищены. В этом случае вы теряете процессорные циклы для проверки всех объектов и принятия решения не очищать их. Если вы это сделаете, уменьшение памяти не будет.
Обычно GC запускается только в длинных сценариях, и только иногда в коротких веб-запросах, когда они создают слишком много объектов.В общем, вы не должны думать об этом слишком много, потому что дефолты работают на 99% случаев использования.
С расширением PHP «garbage_stats» вы можете получить доступ к метрикам и статистическим данным о том, насколько эффективно и быстро работает GC и сколько памяти было уменьшено. Он работает на PHP 7+ (потому что крючки доступны только с тех пор): https://github.com/tideways/php_garbage_stats
Если вы установили расширение, вы можете увидеть статистику сбора мусора для сценариев CLI, называя их:
$ php -dgc_stats.enable=1 -dgc_stats.show_report=1 test.php
Found 7 garbage collection runs in current script.
Collected | Efficency% | Duration | Memory Before | Memory After | Reduction% | Function
----------|------------|----------|---------------|--------------|------------|---------
0 | 0.00 % | 0.01 ms | 365824 | 366320 | -0.14 % | gc_collect_cycles
10000 | 100.00 % | 2.75 ms | 4651320 | 491816 | 89.43 % | foo
10000 | 100.00 % | 3.54 ms | 4652784 | 493280 | 89.40 % | foo
10000 | 100.00 % | 2.11 ms | 4654248 | 494744 | 89.37 % | foo
10000 | 100.00 % | 3.26 ms | 4656168 | 496664 | 89.33 % | Test::foo
9000 | 90.00 % | 1.51 ms | 4694680 | 951176 | 79.74 % | Test::foo
10000 | 100.00 % | 3.11 ms | 5112272 | 952768 | 81.36 % | Test::foo
От А web (например, Apache или FPM), вы можете использовать функцию $runs = gc_stats();
для доступа к этой информации и записи ее в файл журнала.
Основываясь на этой информации, вы можете решить единственное решение, которое можно оптимизировать: включить или отключить GC в вашем скрипте в зависимости от того, насколько он эффективен.
Нет ничего особенного, что вы можете сделать с помощью конфигурационных указаний, только путем написания кода таким образом, чтобы уменьшить использование памяти - что само по себе является мистерией для большинства «программистов» там :) –
Если вы на самом деле не нажимаете проблемы с памятью и/или проблемы с производительностью из-за проблем с GC, я действительно не стал бы беспокоиться об этом, так как в большинстве случаев это будет [тег: микро-оптимизация] – GordonM