Как работает использование памяти apache PHP? - программирование
Подтвердить что ты не робот

Как работает использование памяти apache PHP?

Чтобы дать некоторый контекст:

Недавно я поговорил с коллегой об использовании автозагрузчиков в PHP. Я спорил в пользу их, против него.

Моя точка зрения заключается в том, что Autoloaders могут помочь вам свести к минимуму ручную исходную зависимость, которая, в свою очередь, поможет вам сократить объем потребляемой памяти, если в нее будут включены большие файлы, которые вам могут не понадобиться.

Его ответ заключался в том, что включение файлов, которые вам не нужны, не является большой проблемой, поскольку после того, как файл был включен после того, как он хранится в памяти дочерним процессом Apache, и эта часть памяти будет доступна для последующих запросов. Он утверждает, что вы не должны беспокоиться о количестве включенных файлов, потому что достаточно скоро все они будут загружены в память и использованы по требованию из памяти. Поэтому память не является проблемой, и накладные расходы на поиск файла, который вам нужен в файловой системе, вызывают большую озабоченность.

Он умный парень и, как правило, знает, о чем он говорит. Тем не менее, я всегда думал, что память, используемая Apache и PHP, специфична для обрабатываемого конкретного запроса. Каждому запросу присваивается объем памяти, равный опции memory_limit PHP, и любая исходная компиляция и обработка действительны только для срока действия запроса.

Даже с кэшами op-code, такими как APC, я думал, что индивидуальный запрос по-прежнему должен загружать каждый файл в его собственную часть памяти, и что APC является просто ярлыком для его предварительной компиляции для процесса ответа.

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

ОБНОВЛЕНИЕ:

Чтобы уточнить, часть обсуждения автозагрузчика была скорее контекстом:).

Возможно, он не был ясен, но мой главный вопрос заключается в том, будет ли Apache объединять свои ресурсы для ответа на несколько запросов (особенно память, используемая включенными файлами), или каждый запрос должен будет получить код, необходимый для удовлетворения путь выполнения в изоляции от других запросов, обработанных из того же процесса.

например.: Файлы 1, 2, 3 и 4 равны по 100 КБ каждый. Запрос A включает файлы 1, 2 и 3. Запрос B включает файлы 1, 2, 3 и 4.

По его мнению, он думает, что Request A будет потреблять 300 КБ для полного его выполнения, а Request B будет потреблять еще 100 КБ, потому что файлы 1,2 и 3 уже находятся в памяти.

На мой взгляд, это 300 КБ и 400 КБ, потому что они оба обрабатываются независимо (если одним и тем же процессом).

Это возвращает его к его аргументации, что "просто включите партию", потому что вы будете использовать ее в любом случае "в отличие от моего" включают только то, что вам нужно, чтобы уменьшить размер запроса.

Это довольно фундаментально для того, как я подхожу к созданию веб-сайта PHP, поэтому я был бы очень заинтересован в том, что я не в курсе.

Я также всегда считал, что для крупномасштабной памяти веб-сайта является самым ценным ресурсом и больше беспокоит, чем проверки файловой системы для автозагрузчика, которые в любом случае кэшируются ядром.

Вы правы, хотя время для сравнения!

4b9b3361

Ответ 1

Вот как вы выигрываете аргументы: запустите реалистичный тест и станьте справа от чисел.

У меня было такое же обсуждение, поэтому я попробовал эксперимент. Используя APC, я попробовал приложение Kohana с одним монолитным включением (включая все Kohana), а также со стандартным автозагрузчиком. Конечным результатом было то, что сингл включился быстрее по статистически нерелевантной ставке (менее 1%), но использовал немного больше памяти (в соответствии с функциями памяти PHP). Выполнение теста без APC (или XCache и т.д.) Бессмысленно, поэтому я не беспокоился.

Итак, мой вывод состоял в том, чтобы продолжить использование автозагрузки, потому что это намного проще в использовании. Попробуйте сделать то же самое с вашим приложением и покажите своему другу результаты.

Теперь вам не нужно гадать.

Отказ от ответственности: я не использовал Apache. Я не могу подчеркнуть достаточно, чтобы запускать собственные тесты на вашем собственном оборудовании в своем приложении. Не верьте, что мой опыт будет вашим.

Ответ 2

Ты мудрый ниндзя, кузнечик.

Автозагрузчики не загружают файл класса до тех пор, пока не будет запрошен класс. Это означает, что они будут использовать как минимум столько же памяти, что и руководство, но обычно намного меньше.

Классы читают свежие из файла каждый запрос, даже если поток apache может обрабатывать несколько запросов, поэтому все ваши друзья, все прочитанные, не содержат воды.

Вы можете доказать это, поставив эхо "foo"; выше определения класса в файле класса. Вы увидите на каждом новом запросе, что строка будет выполнена независимо от того, будет ли вы автоматически загружать или вручную включать весь мир файлов классов в начале.

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

Да, apc и такие (как и все решения для кеширования) могут преодолеть негативные последствия и даже вывести небольшие выигрыши в производительности, но вы едите много ненужной памяти, если вы делаете это на нетривиальном числе библиотек и обслуживаете большое количество клиентов. Попробуйте что-нибудь. Загрузите здоровый кусок библиотек груши в массивном файле include при одновременном использовании 500 подключений на вашей странице.

Даже используя такие вещи, как Apc, вам выгодно использовать автозагрузчики с любыми классами, отличными от имен (в настоящее время большинство существующих php-кодов), поскольку это может помочь избежать глобального загрязнения пространства имен при работе с большими библиотеками классов.

Ответ 3

Это мое предположение.

Я думаю, что автозагрузчики - очень плохая идея по следующим причинам.

  • Мне нравится знать, что и где мои скрипты захватывают данные/код. Делает отладку проще.
  • Это также имеет проблемы с конфигурацией, поскольку если один из ваших разработчиков изменяет файл (обновление и т.д.) или конфигурацию, и все перестает работать, сложнее узнать, где он сломан.
  • Я также считаю, что это ленивое программирование.

Что касается проблем с памятью/предварительной записью, так же дешево купить еще немного памяти для компьютера, если она борется с этим.