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/mysqlnd/memory.xml
2026-01-19 03:26:36 +00:00

164 lines
9.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 9598935f21bc472f22383fb989625f0b22785331 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="mysqlnd.memory">
<title>Gestión de la memoria</title>
<simpara>
<emphasis role="bold">Introducción</emphasis>
</simpara>
<simpara>
El driver nativo MySQL gestiona la memoria de forma diferente a la biblioteca
cliente MySQL. Las bibliotecas difieren en la forma en que la memoria
es asignada y liberada, en la forma en que la memoria es asignada por
fragmentos durante la lectura de los resultados desde MySQL, qué opciones
de depuración y desarrollo existen, y cómo los resultados leídos
desde MySQL son vinculados a las variables de usuario PHP.
</simpara>
<simpara>
Las notas siguientes son una introducción y un resumen destinados a los usuarios
interesados en comprender el driver nativo MySQL desde el punto de vista
del código C.
</simpara>
<simpara>
<emphasis role="bold">Funciones utilizadas en la gestión de memoria</emphasis>
</simpara>
<simpara>
Todas las asignaciones y desasignaciones se realizan utilizando las funciones
de gestión de memoria de PHP. Sin embargo, el consumo de memoria
de mysqlnd puede ser monitoreado utilizando llamadas a APIs de PHP, como
<function>memory_get_usage</function>. Debido a que la memoria
es asignada y liberada utilizando la gestión de memoria de PHP, las modificaciones
pueden no ser inmediatamente visibles a nivel del sistema operativo.
El gestor de memoria de PHP funciona como un proxy que puede tener un poco
de retraso en la liberación de memoria del sistema. Además, la comparación del uso
de memoria del driver nativo MySQL y de la biblioteca cliente MySQL se vuelve
difícil. La biblioteca cliente MySQL llama directamente al gestor de memoria
del sistema operativo, y por lo tanto, los efectos pueden ser vistos inmediatamente
a nivel del sistema operativo.
</simpara>
<simpara>
Todas las limitaciones de memoria realizadas por PHP afectan también al driver
nativo MySQL. Esto puede causar errores de excedente de memoria al recuperar
juegos de resultados demasiado grandes, excediendo el tamaño de la memoria restante
disponible para PHP. Debido a que la biblioteca cliente MySQL no utiliza las funciones
de gestión de memoria de PHP, no tiene en cuenta ninguna limitación de memoria
definida por PHP. Si se utiliza la biblioteca cliente MySQL, según el modelo de despliegue,
la huella de memoria del proceso PHP puede aumentar y superar el límite de memoria
impuesto por PHP. Además, los scripts PHP pueden analizar juegos de resultados más grandes,
asignando así más memoria para el juego de resultados de la que el control del motor PHP permite.
</simpara>
<simpara>
Las funciones de gestión de memoria de PHP son llamadas por el driver nativo MySQL
a través de un gestor ligero. Entre otras cosas, este gestor facilita el depuración.
</simpara>
<simpara>
<emphasis role="bold">Gestión de los juegos de resultados</emphasis>
</simpara>
<simpara>
Los diferentes servidores MySQL y las diferentes APIs de clientes se diferencian
según el <link linkend="mysqli.quickstart.statements">buffering o no</link> de los juegos de resultados. Los juegos de resultados que no son bufferizados son transferidos línea por línea desde MySQL hacia el cliente, y el cliente recorrerá los resultados. Los resultados que son bufferizados son recuperados en su totalidad por la biblioteca cliente antes de pasarlos al cliente.
</simpara>
<simpara>
El driver nativo MySQL utiliza flujos PHP para la comunicación en red con
el servidor MySQL. Los resultados enviados por MySQL son recuperados desde la memoria
buffer de los flujos de red PHP hacia la memoria buffer de resultados de mysqlnd.
La memoria buffer de resultados está compuesta por zvals. En una etapa siguiente,
los resultados son puestos a disposición del script PHP. La transferencia final desde la
memoria buffer de resultados hacia las variables PHP impacta el consumo de memoria
y esto se vuelve muy visible al utilizar juegos de resultados bufferizados.
</simpara>
<simpara>
Por omisión, el driver nativo MySQL intenta no conservar en memoria
dos veces los resultados bufferizados. Los resultados son conservados
una sola vez en la memoria buffer interna de resultados, así como en sus
zvals. Cuando los resultados son recuperados en las variables PHP por el script
PHP, las variables referenciarán la memoria buffer interna de resultados.
Los resultados de consultas de base de datos no son copiados y
son conservados en memoria solo una vez. Cuando un usuario modifica
el contenido de una variable que contiene un resultado de base de datos, una operación
de copia-al-escritura debe ser realizada para evitar modificar la memoria buffer
interna de resultado referenciada. El contenido de la memoria buffer no debe ser modificado
porque el usuario puede decidir leer el juego de resultados una segunda vez.
La operación de copia-al-escritura está implementada utilizando un gestor de lista
de referencia adicional, así como el uso de los contadores de referencia zvals estándar.
La operación de copia-al-escritura también debe ser realizada si el usuario
lee un juego de resultados en las variables PHP y libera un juego de resultado antes
de que las variables sean eliminadas.
</simpara>
<simpara>
En general, este mecanismo funciona bien para los scripts que leen
un juego de resultados una sola vez, y no modifican las variables que contienen
los resultados. Su principal desventaja es la sobrecarga de memoria causada por
el gestor de referencia adicional, que proviene principalmente del hecho
de que las variables de usuario que contienen los resultados no pueden ser liberadas
completamente mientras el gestor de referencia mysqlnd las siga referenciando.
El driver nativo MySQL elimina la referencia a las variables de usuario cuando
el juego de resultados es liberado o cuando se realiza una operación de copia-al-escritura.
Un observador puede ver que el consumo total de memoria aumenta
mientras el juego de resultados no sea liberado. Utilice las
<link linkend="mysqlnd.stats">estadísticas</link> para verificar si un script
libera el juego de resultados explícitamente, o si el driver lo libera implícitamente,
haciendo que la memoria sea utilizada más tiempo del necesario.
Las estadísticas también pueden ayudar a ver las operaciones de copia-al-escritura.
</simpara>
<simpara>
Un script PHP que lee muchas pequeñas líneas de un juego de resultados bufferizado
utilizando líneas de código como <literal>while ($row = $res-&gt;fetch_assoc()) { ... }</literal>
puede optimizar el consumo de memoria solicitando una copia en lugar de
referencias. Aunque solicitar copias significa conservar dos veces el resultado en memoria,
esto permite a PHP liberar la copia contenida en
<literal>$row</literal> sabiendo que el juego de resultados está siendo recorrido
y antes de liberar el juego de resultados en sí. En un servidor cargado,
la optimización del uso de memoria puede mejorar el rendimiento del sistema
en general, aunque para un script individual, el enfoque de la copia puede ser más lento
debido a las operaciones adicionales de asignación y copia de memoria.
</simpara>
<simpara>
<emphasis role="bold">Supervisión y depuración</emphasis>
</simpara>
<simpara>
Existen varias formas de supervisar el uso de memoria del driver nativo MySQL.
Si el objetivo es obtener una vista rápida de alto nivel, o verificar la eficiencia
de memoria de los scripts PHP, entonces revise las <link linkend="mysqlnd.stats">estadísticas</link>
recopiladas por la biblioteca. Estas le permiten, por ejemplo,
ver las consultas SQL que generan más resultados de los analizados por un script PHP.
</simpara>
<simpara>
El rastreo de <link linkend="ini.mysqlnd.debug">depuración</link> en el historial
puede ser configurado para registrar las llamadas al gestor de memoria. Esto puede ayudar
a ver cuándo la memoria es asignada o liberada. Sin embargo, el tamaño de los
fragmentos de memoria solicitados puede no estar listado.
</simpara>
<simpara>
Las versiones recientes del driver nativo MySQL intentan emular situaciones
de excedente de memoria aleatorio. Esto es útil únicamente para los desarrolladores C
de la biblioteca, o para los desarrolladores del <link linkend="mysqlnd.plugin">complemento</link>
mysqlnd. Consulte el código fuente para las opciones de configuración de PHP correspondientes,
así como para obtener más detalles sobre este mecanismo.
Esta funcionalidad se considera privada, y puede ser modificada en cualquier momento
sin previo aviso.
</simpara>
</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
-->