mirror of
https://github.com/php/doc-es.git
synced 2026-03-24 15:32:36 +01:00
125 lines
6.0 KiB
XML
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
|
|
-->
|