Preloading
Починаючи з PHP 7.4.0, можна налаштувати передзавантаження скриптів в opcache в момент старту PHP. Будь-які функції, класи, інтерфейси або трейти (але не константи) у цих файлах будуть глобально доступні для всіх запитів без їх явного завантаження. Таке попереднє завантаження дозволяє досягти більшої зручності та продуктивності (бо код завжди доступний) за рахунок використання більшої кількості пам'яті. Також, при внесенні змін у завантажені скрипти, щоб ці зміни стали доступними, доведеться перезавантажити PHP. З цього випливає, що передзавантаження є сенс використовувати тільки у виробничому оточенні, але не в оточенні розробки.
Зверніть увагу, що баланс підвищення продуктивності та споживання пам'яті залежить від програми. «Передзавантаження всього на світі» може бути найпростішою стратегією, але не обов'язково кращою. Також, передзавантаження працюватиме лише у випадку, коли PHP працює в режимі обслуговування запитів без перезавантаження. Таким чином, хоч передзавантаження можна використовувати в режимі CLI з включеним opcache, але в більшості випадків безглуздо. Винятком є використання передзавантаження з бібліотеками FFI
Зауваження :
Завантаження не підтримується у Windows.
Налаштування передзавантаження складається з двох етапів і вимагає ввімкненого opcache. Для початку, налаштуйте opcache.preloadв php.ini:
opcache.preload=preload.php
Файл preload.php - це обов'язковий файл, який буде запущено один раз під час старту сервера (PHP-FPM, mod_php, etc.) і який завантажить код на постійну пам'ять. У серверах, які запускаються від імені root перед перемиканням на непривілейованого користувача системи або якщо PHP запускається від імені root (не рекомендується), значення opcache.preload_user може вказувати системного користувача для запуску попереднього завантаження. Запуск попереднього завантаження від імені root за промовчанням заборонено. Встановіть opcache.preload_user=root
, щоб явно це дозволити.
У скрипті preload.php будь-який файл, вказаний у виразах include include_once require require_once або opcache_compile_file(), буде завантажено в постійну пам'ять. У наступному прикладі будуть завантажені всі файли .php в директорії src, якщо вони не містять Test
в имени.
Loading...
Иinclude і opcache_compile_file() будуть працювати, але при цьому будуть трохи по-різному оброблені.
- Вираз includeзапустить код із файлу, аopcache_compile_file()ні. Це вплине лише на умовні декларації (функції, оголошені в блоках if).
- Через те щоincludeзапустить код, вкладеніincludeтакож будуть оброблені та передзавантажені.
- Функцияopcache_compile_file()може завантажувати файли у будь-якому порядку. Тобто якщо файл a.php визначає клас
A
та b.php визначає класB
, який є спадкоємцемA
, то функцияopcache_compile_file()може завантажити ці два файли у будь-якому порядку. При використанні виразуinclude, з іншого боку, файл a.phpповинен бутизавантажений першим. - У будь-якому випадку, якщо якийсь скрипт надалі запросить включення вже завантаженого скрипта, то він буде виконаний, але сутності перетворюватися не будуть. Використання виразуinclude_onceне запобігає повторному увімкненню файлу. Може знадобитися завантажити файл знову, щоб увімкнути певні глобальні константи, оскільки вони не обробляються попереднім завантаженням.
Який підхід використовувати залежить від бажаної поведінки. Для коду, який використовує автозавантажувач, підхід із викликом функції opcache_compile_file() дасть більше гнучкості. З кодом, який завантажуватиметься вручну, варіант з виразом include може бути надійнішим.