1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/opcache/preload.xml
2023-12-12 22:08:28 +03:00

127 lines
8.4 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 28529d3539b850e870e3aa97570f4db0e53daa03 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="opcache.preloading" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Preloading</title>
<para>
Начиная с PHP 7.4.0 можно настроить предзагрузку скриптов в opcache в момент старта PHP.
Любые функции, классы, интерфейсы или трейты (но не константы) в этих файлах будут глобально доступны для всех запросов без необходимости
их явной загрузки. Такая предзагрузка позволяет добиться большего удобства и производительности (потому что код
всегда доступен) за счёт использования большего количества памяти. Также, при внесении изменений в предзагруженные
скрипты, чтобы эти изменения стали доступны, придётся перезагрузить PHP. Из этого следует, что предзагрузку имеет смысл
использовать только в производственном окружении, но не в окружении разработки.
</para>
<para>
Обратите внимание, что баланс повышения производительности и потребления памяти сильно зависит от приложения.
«Предзагрузка всего на свете» может быть простейшей стратегией, но совсем не обязательно лучшей. Также,
предзагрузка будет работать только в случае, когда PHP работает в режиме обслуживания запросов без перезагрузки.
Таким образом, хоть предзагрузку и можно использовать в режиме CLI с включённым opcache, но в большинстве
случаев бессмысленно. Исключением является использование предзагрузки с
<link linkend="ffi.examples-complete">библиотеками FFI</link>.
</para>
<note>
<para>
Предзагрузка не поддерживается в Windows.
</para>
</note>
<para>
Настройка предзагрузки состоит из двух этапов и требует включённого opcache.
Для начала, настройте <link linkend="ini.opcache.preload">opcache.preload</link>
в &php.ini;:
</para>
<informalexample>
<programlisting role="ini">
<![CDATA[
opcache.preload=preload.php
]]>
</programlisting>
</informalexample>
<para>
Файл <filename>preload.php</filename> — это обязательный файл, который будет запущен один раз при старте сервера
(PHP-FPM, mod_php, etc.) и который загрузит код в постоянную память. В серверах, которые запускаются от имени root
перед переключением на непривилегированного пользователя системы или если PHP запускается от имени root (не рекомендуется),
значение <link linkend="ini.opcache.preload-user">opcache.preload_user</link> может указывать системного пользователя
для запуска предварительной загрузки.
Запуск предварительной загрузки от имени root по умолчанию запрещён.
Установите <literal>opcache.preload_user=root</literal>, чтобы явно разрешить это.
</para>
<para>
В скрипте <filename>preload.php</filename> любой файл, указанный в выражениях <function>include</function>,
<function>include_once</function>, <function>require</function>, <function>require_once</function> или
<function>opcache_compile_file</function>, будет загружен в постоянную память. В следующем примере
будут загружены все файлы <filename>.php</filename> в директории <filename>src</filename>, если они не содержат
<literal>Test</literal> в имени.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src');
$fullTree = new RecursiveIteratorIterator($directory);
$phpFiles = new RegexIterator($fullTree, '/.+((?<!Test)+\.php$)/i', RecursiveRegexIterator::GET_MATCH);
foreach ($phpFiles as $key => $file) {
require_once $file[0];
}
?>
]]>
</programlisting>
</informalexample>
<para>
И <function>include</function> и <function>opcache_compile_file</function> будут работать, но при этом
будут немного по разному обработаны.
<itemizedlist>
<listitem><simpara>Выражение <function>include</function> запустит код из файла, а
<function>opcache_compile_file</function> нет. Это повлияет только на условные декларации
(функции объявленные в блоках if).</simpara></listitem>
<listitem><simpara>Из за того, что <function>include</function> запустит код, вложенные <function>include</function>
также будут обработаны и предзагружены.</simpara></listitem>
<listitem><simpara>Функция <function>opcache_compile_file</function> может загружать файлы в любом порядке. То есть, если
файл <filename>a.php</filename> определяет класс <literal>A</literal> и <filename>b.php</filename> определяет класс
<literal>B</literal>, который является наследником <literal>A</literal>, то функция <function>opcache_compile_file</function> может
загрузить эти два файла в любом порядке. При использовании выражения <function>include</function>, с другой стороны, файл <filename>a.php</filename>
<emphasis>должен быть</emphasis> загружен первым.</simpara></listitem>
<listitem><simpara>В любом случае, если какой-то скрипт в последствии запросит включение уже предзагруженного скрипта, то он будет
выполнен, но сущности пересоздаваться не будут. Использование выражения <function>include_once</function> не предотвратит повторное
включение файла. Может потребоваться загрузить файл снова,
чтобы включить в него определённые глобальные константы, поскольку
они не обрабатываются предварительной загрузкой.</simpara></listitem>
</itemizedlist>
Какой подход использовать — зависит от желаемого поведения. Для кода, который использует автозагрузчик, подход с
вызовом функции <function>opcache_compile_file</function> даст больше гибкости. С кодом, который будет загружаться вручную,
вариант с выражением <function>include</function> может быть более надёжным.
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->