#php
#php
Вопрос:
Предположим, у меня есть PHP include file только с большой сгенерированной статической структурой данных, так что что-то вроде этого:
<? define('STATICDATA', ['something => ['stuff1' => ['stuff2' => ....
Мне интересно, оптимизирует ли PHP загрузку этих данных в память для каждого запроса. Я знаю о кэше кода операции и о том, что проанализированный код хранится в памяти, я просто хотел бы знать, содержит ли загруженный файл такие статические данные, тогда PHP оптимизирует его, подготавливая образ этого файла в памяти и просто делает копию в памяти для нового запроса? Или он выполняет коды операций, даже если это одна и та же инициализация каждый раз?
В моем случае речь идет не о производительности, мне просто интересно, достаточно ли виртуальная машина PHP достаточно умна, чтобы оптимизировать загрузку этих данных, или она обрабатывает их так же, как и любой другой код, и выполняет его каждый раз, когда поступает новый запрос.
Комментарии:
1. Обычно он выполняет коды операций каждый раз. В PHP 7.4 есть предварительная загрузка кода операции, которая будет сохранять данные, которые вы сообщаете, в памяти дольше, чем один запрос, но вы должны явно его настроить
2. @apokryfos если я использую define, то данные не могут измениться, верно? Так почему вы должны сообщать об этом PHP? Не мог бы он, например, просто скопировать эти данные в область памяти, используемую для хранения констант, и ссылаться на это местоположение каждый раз, когда к этим данным обращаются, пропуская инициализацию?
3. Это немного сложнее. Я бы подумал. Данные должны находиться в ячейке памяти, доступной PHP, и в формате, понятном PHP. Обычно в PHP нет перелива между различными запросами, поэтому вы не можете напрямую обмениваться данными между запросами PHP, даже если они обрабатываются одним и тем же рабочим процессом PHP, поскольку все удаляется в конце каждого запроса. Я думаю, что наиболее близким к тому, что вы описываете, является использование какого-то кэша памяти, такого как memcache, но он по-прежнему не хранит необработанную понятную PHP память
4. Я не вижу причин, по которым виртуальная машина PHP не может совместно использовать область данных между запросами, которая содержит только постоянные данные, поэтому проблем с параллелизмом нет.
5. Я не говорю, что это невозможно, я говорю, что это не так, нет реальной виртуальной машины PHP в том смысле, что нет контейнера PHP, постоянно работающего в фоновом режиме, поэтому нет ничего постоянного, чтобы сохранить эти данные в памяти. Наиболее близким является PHP-FPM worker, но он также не всегда имеет длительный срок службы и построен поверх традиционного PHP, который традиционно не сохранялся в памяти.