1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 15:32:36 +01:00
Files
archived-doc-es/reference/opcache/preload.xml
2026-01-18 19:38:32 +00:00

125 lines
6.0 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 87d6bb1bbd5f118f5b0cf0160438f06c0f91ea45 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="opcache.preloading">
<title>Precarga</title>
<simpara>
A partir de PHP 7.4.0, PHP puede ser configurado para precargar scripts en el opcache cuando el motor
se inicia. Todas las funciones, clases, interfaces o traits (pero no las constantes) de estos ficheros se volverán
entonces disponibles globalmente para todas las peticiones sin necesidad de ser explícitamente incluidas. Esto intercambia
la comodidad y el rendimiento (ya que el código está siempre disponible) por el uso de la memoria base. Asimismo,
requiere reiniciar el proceso PHP para eliminar los scripts precargados, lo que significa que esta funcionalidad
solo es práctica en producción, no en un entorno de desarrollo.
</simpara>
<simpara>
Tenga en cuenta que el compromiso óptimo entre rendimiento y memoria puede variar según la aplicación.
"Precargar todo" puede ser la estrategia más simple, pero no necesariamente la mejor. Además,
la precarga solo es útil cuando hay un proceso persistente de una petición a otra. Esto significa
que aunque pueda funcionar en un script CLI si el opcache está activado, generalmente es inútil. La excepción
es al utilizar la precarga en las <link linkend="ffi.examples-complete">bibliotecas FFI</link>.
</simpara>
<note>
<simpara>
La precarga no está soportada en Windows.
</simpara>
</note>
<simpara>
La configuración de la precarga implica dos pasos, y requiere que el opcache esté activado.
En primer lugar, defina el valor <link linkend="ini.opcache.preload">opcache.preload</link>
en &php.ini;:
</simpara>
<informalexample>
<programlisting role="ini">
<![CDATA[
opcache.preload=preload.php
]]>
</programlisting>
</informalexample>
<simpara>
<filename>preload.php</filename> es un fichero arbitrario que se ejecutará una vez al inicio del servidor
(PHP-FPM, mod_php, etc.) y cargará código en memoria persistente. En los servidores que se inician como
root antes de cambiar a un usuario del sistema no privilegiado, o si PHP se ejecuta como root
(no recomendado), el valor <link linkend="ini.opcache.preload-user">opcache.preload_user</link>
puede especificar el usuario del sistema para ejecutar la precarga. La ejecución de la precarga como root no está permitida
por defecto. Defina <literal>opcache.preload_user=root</literal> para permitirlo explícitamente.
</simpara>
<simpara>
En el script <filename>preload.php</filename>, cualquier fichero referenciado por <function>include</function>,
<function>include_once</function>, <function>require</function>, <function>require_once</function>, o
<function>opcache_compile_file</function> serán analizados en la memoria persistente. En el siguiente ejemplo,
todos los ficheros <filename class="extension">.php</filename> del directorio <filename>src</filename> serán precargados, excepto si son
un fichero <literal>Test</literal>.
</simpara>
<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> y <function>opcache_compile_file</function> funcionarán ambos, pero tienen
implicaciones diferentes en la forma en que el código es gestionado.
<itemizedlist>
<listitem><simpara><function>include</function> ejecutará el código del fichero,
mientras que <function>opcache_compile_file</function> no lo hará. Esto significa que solo el primero soporta
la declaración condicional (las funciones declaradas dentro de un bloque if).</simpara></listitem>
<listitem><simpara>Debido a que <function>include</function> ejecutará el código, los ficheros incluidos de manera
anidada también serán analizados y sus declaraciones precargadas.</simpara></listitem>
<listitem><simpara><function>opcache_compile_file</function> puede cargar ficheros en cualquier orden. Es decir, si
<filename>a.php</filename> define la clase <literal>A</literal> y <filename>b.php</filename> define la clase
<literal>B</literal> que extiende <literal>A</literal>, entonces <function>opcache_compile_file</function> puede
cargar estos dos ficheros en cualquier orden. Al utilizar <function>include</function>, sin embargo,
<filename>a.php</filename> <emphasis>debe</emphasis> ser incluido primero.</simpara></listitem>
<listitem><simpara>En ambos casos, si un script posterior incluye un fichero que ya ha sido precargado, entonces
su contenido siempre se ejecutará, pero los símbolos que define no se volverán a definir. El uso de
<function>include_once</function> no evitará que el fichero sea incluido una segunda vez. Puede ser necesario
cargar un fichero nuevamente para incluir las constantes globales definidas en él, ya que no son
gestionadas por la precarga.</simpara></listitem>
</itemizedlist>
Cuál enfoque es el mejor depende, por lo tanto, del comportamiento deseado. Con código que utilizaría de otro modo un
cargador automático, <function>opcache_compile_file</function> permite una mayor flexibilidad. Con código que sería
cargado manualmente de otro modo, <function>include</function> será más robusto.
</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
-->