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,
- ¿Puedes llamar a
DEALLOCATE PREPARE
, y cómo - ¿Deberías hacerlo?
- ¿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_?
- ¿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).