mirror of
https://github.com/php/doc-ru.git
synced 2026-03-25 16:22:18 +01:00
127 lines
8.4 KiB
XML
127 lines
8.4 KiB
XML
<?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
|
||
-->
|