statement sentencias prepared preparadas example ejemplos php mysql pdo prepared-statement

php - sentencias - Liberación de declaraciones preparadas por PDO(DESARROLLO PREPARATORIO)



sentencias preparadas php mysqli (2)

Sí. Cuando haya terminado con la instrucción de preparación, puede establecerla en NULL o usar unset() .

Para una secuencia de comandos con múltiples consultas y grandes bases de datos, esto hace la diferencia. Puedes probar con:

$before = memory_get_usage(); $stmt = NULL; die(memory_get_usage() - before);

Para mí, esto ahorró 20 MB de memoria, que estaba bloqueando el script más tarde.

¿Deberían las declaraciones preparadas por PDO liberarse después del uso? Y si es así, ¿cómo? Específicamente, pregunto sobre MySQL. ¿Cómo puede, y debería, llamar a DEALLOCATE PREPARE través de PDO? (Editar: para aclarar, esta pregunta no se refiere a preparaciones emuladas, sino a preparaciones reales).

Además, ¿esto liberará los resultados establecidos (cuando sean grandes)?

Explicación:

He visto código a lo largo de las líneas de

$stmnt = $db->prepare($sql); $stmnt->execute($aParams); $stmnt = null;

lo que me llevó a preguntarme qué hace esto, cuándo y si f unset($stmnt); sería diferente?

El manual indica que

Cuando se prepara la consulta, la base de datos analizará, compilará y optimizará su plan para ejecutar la consulta. [...] Al usar una declaración preparada, la aplicación evita repetir el ciclo analizar / compilar / optimizar.

lo que tiende a sugerir que debe desasignar la declaración, y MySQL tiene la capacidad. Asi que,

  1. ¿Puedes llamar a DEALLOCATE PREPARE , y cómo
  2. ¿Deberías hacerlo?
  3. ¿Y puede alguien confirmar que establecer declaración en nulo (o deshacer la declaración) hará lo mismo que "free_result" para mysql_ y mysqli_?
  4. ¿Sucede de inmediato o espera a que el recolector de basura lo active?

Para completar, otra pregunta de SO que hace referencia a las funciones "free_result" y "close" para mysqli_() sugiere que liberar el enunciado en realidad agrega tiempo (a menos que tenga un gran uso de memoria y necesite espacio). Pero "free_result" es diferente de liberar al servidor SQL de tener la declaración preparada en caché.


¿Deberían las declaraciones preparadas por PDO liberarse después del uso? Y si es así, ¿cómo?

En el contexto de MySQL? ¿No porque?

PDO emula las declaraciones preparadas por defecto . Esto significa que la propia PDO reemplaza los parámetros, escapa, etc., y envía trozos de SQL a lo largo de la línea en lugar de utilizar declaraciones nativas preparadas.

Aunque puede activarlo, aún no necesita cerrar expresamente el identificador a menos que también esté utilizando consultas sin búfer . Simplemente dejar que el identificador de instrucción salga del ámbito o establecerlo como nulo no cerrará el cursor. De nuevo, esto solo importa si usa consultas sin búferes. Si no lo está, entonces dejarlo fuera del alcance o establecerlo como nulo es suficiente para cerrar el asa limpiamente.

También se ha vinculado a DEALLOCATE PREPARE . Esa sintaxis solo es necesaria cuando se llama manualmente a PREPARE con una cadena de SQL. Esta es una acción completamente independiente de las declaraciones preparadas basadas en API de nivel C de MySQL , que es lo que PDO_MYSQL está usando. (De acuerdo, tal vez estés usando mysqlnd , pero efectivamente es lo mismo).