2012-02-25 3 views
2

Я занимаюсь некоторыми бенчмарками памяти PHP, и мне интересно, есть ли способ оптимизировать сборщик мусора, чтобы уменьшить потребление памяти (как это возможно на других языках, таких как JAVA).PHP Сбор мусора и оптимизация памяти

Я нашел только три настраиваемых параметра, связанных с GC в php.ini: session.gc_probability, session.gc_divisor и session.gc_maxlifetime. Это только для сессий, и я не сравниваю это.

Возможные оптимизации, которые я знаю до сих пор, связаны с кодом, например, избегая циркулярных ссылок и заставляя цикл сбора мусора путем вызова gc_collect_cycles() (благодаря этой статье http://www.alexatnet.com/comment/86).

Кто-нибудь знает какие-либо конфигурационные трюки или хорошие практики в управлении памятью PHP?

+0

Нет ничего особенного, что вы можете сделать с помощью конфигурационных указаний, только путем написания кода таким образом, чтобы уменьшить использование памяти - что само по себе является мистерией для большинства «программистов» там :) –

+0

Если вы на самом деле не нажимаете проблемы с памятью и/или проблемы с производительностью из-за проблем с GC, я действительно не стал бы беспокоиться об этом, так как в большинстве случаев это будет [тег: микро-оптимизация] – GordonM

ответ

4

Насколько я знаю, форсирование коллекции с помощью gc_collect_cycles() является самым близким к минимуму использования памяти в момент времени t.

GC, конечно же, является временной операцией, и приложение редко критично привязано к памяти, и поэтому нет смысла предлагать варианты для ненужного запуска GC-прогона в ходе выполнения программы. Вдобавок к этому, PHP делает, предлагая возможность включения и выключения коллектора циклов по требованию (gc_enable(), gc_disable()), чтобы вы могли оптимизировать свой код на время (избегая накладных расходов на GC, решающий начать) - конечно легко понять, как это может быть полезно.

В общем, PHP по философии избегает таких тем, как управление памятью и GC, и ваши тесты, возможно, должны уважать это для более реального мировоззрения.

Надеюсь, это поможет.

(Поклон @ GordonM-х со ссылкой на микро-оптимизации, а также комментарий.)

+0

Дело в том, что я искал такие микроконтроллеры gc, оптимизация. Но, obvioulsy PHP сборщик мусора не может быть настроен. Я хотел быть уверенным. Благодарю. –

0

Я использую метод unset() для очистки переменной, когда она мне больше не нужна.

0

В общем управлении памятью ПГПСА работает из коробки для всех переменных, которые вы объявляете и использование. Используя 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 в вашем скрипте в зависимости от того, насколько он эффективен.

 Смежные вопросы

  • Нет связанных вопросов^_^