para - mysqli_result in php
mysqli_store_result() vs. mysqli_use_result() (3)
Creo que esta elaboración podría ayudar a las personas a llegar desde lenguajes que soportan la recuperación, ya sea a través de matrices o enumeradores. Porque es solo esa diferencia. Para .NET, sería la misma diferencia que GetDirectories (store_results) vs EnumerateDirectories (use_results) (y los equivalentes File / DbResult / CSV parsing / XMl Parsing).
La variante de enumerador usa menos memoria de cliente (PHP) y puede buscar la fila siguiente asynchronoulsy en el fondo mientras se procesa la fila actual, lo que hace que la memoria y el tiempo de procesamiento sean más eficaces en el lado del cliente. A costa de utilizar los recursos del servidor (SQL) durante más tiempo (ya que el conjunto de resultados no se ha transmitido por completo).
A su vez, la forma get / array recuperará los datos en una operación de bloqueo, ocupando más memoria del lado del cliente para liberar la memoria DB antes.
Personalmente, utilizaría la forma predeterminada para el modo no enumerador, a menos que realmente tuviera problemas de memoria (del cliente). En .NET debe usar el modo Enumerator, si se encuentra con el límite de 2/3 GiB para procesos x32. Particular EnumerateLines para archivos es importante aquí. Con los resultados DB, no debería comenzar. Un resultado de 2 GiB DB no está bien filtrado (realiza más filtrado en Query) o contiene un montón de Blobs (que debes cargar poco a poco o incluso dejar que el navegador lo retome mediante un manejador http si es posible).
La pregunta
¿Cuál es la diferencia entre mysqli::store_result()
y mysqli::use_result()
?
La historia
Documentación vaga
La documentación en PHP.net parece muy vaga sobre la diferencia entre los dos. La página mysqli::use_result()
no ofrece ejemplos de código, y lo vincula a la página mysqli::multi_query()
para buscarlos. En esa página se proporciona la siguiente muestra de código (consulte la página para obtener el código completo):
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s/n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------/n");
}
La página mysqli::store_result()
usa exactamente la misma muestra de código, con una excepción:
/* store first result set */
if ($result = $mysqli->use_result()) {
Sí ... store_result
convirtió en use_result
. Tenga en cuenta que incluso el comentario anterior todavía dice "almacenar".
Aún más confuso
Después de haber visto las muestras del código, pensé; "Está bien, entonces es un alias". ¡Pero espera! La documentación brinda las siguientes descripciones:
- mysqli::store_result() - Transfiere un conjunto de resultados de la última consulta
- mysqli::use_result() - Iniciar una recuperación del conjunto de resultados
Parecen dos cosas diferentes, y no se traen como alias en absoluto. Mirando más de cerca, descubrí que había otra excepción en la muestra de código de mysqli::use_result()
-page: $result->free();
se convirtió en $result->close();
. Sin embargo, mis esperanzas de descubrir la verdad se desvanecieron poco después, cuando lo encontré en esa misma página en la segunda muestra de código (el equivalente de procedimiento), mysqli_free_result($result);
se usó, y no el esperado mysqli_close_result($result);
.
mysqli::store_result()
obtendrá el conjunto de resultados completo del servidor MySQL, mientras que mysqli::use_result()
buscará las filas una por una.
Esto también se menciona en los documentos mysqli::use_result
que se ha vinculado:
La función mysqli_use_result () no transfiere todo el conjunto de resultados de la base de datos y, por lo tanto, no se pueden usar funciones como mysqli_data_seek () para moverse a una fila particular dentro del conjunto. Para usar esta funcionalidad, el conjunto de resultados se debe almacenar usando mysqli_store_result (). No se debe usar mysqli_use_result () si se realiza una gran cantidad de procesamiento en el lado del cliente, ya que esto atará el servidor y evitará que otros subprocesos actualicen las tablas desde las cuales se están obteniendo los datos.
Por lo general, siempre puedes usar mysqli::store_result()
menos que tengas una buena razón para no leer todas las filas del servidor a la vez.
use_result
devuelve un resultado sin búfer .
store_result
devuelve un resultado almacenado .