2010-03-26 34 views
10

Quiero usar pdo en mi aplicación, pero antes de eso quiero entender cómo internamente PDOStatement->fetch y PDOStatement->fetchAll.¿Cómo funciona PHP PDO internamente?

Para mi aplicación, deseo hacer algo como "SELECT * FROM myTable" e insertarlo en un archivo csv y tiene alrededor de 90000 filas de datos.

Mi pregunta es, si uso PDOStatement->fetch como lo estoy usando aquí:

// First, prepare the statement, using placeholders 
$query = "SELECT * FROM tableName"; 
$stmt = $this->connection->prepare($query); 

// Execute the statement 
$stmt->execute(); 
var_dump($stmt->fetch(PDO::FETCH_ASSOC)); 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
echo "Hi"; 
// Export every row to a file 
fputcsv($data, $row); 
} 

Will después de cada buscarlo a la base de datos, para dar lugar a que recuperan sería almacenarlos en la memoria?

Lo que significa que cuando hago la segunda búsqueda, la memoria tiene datos de primera búsqueda, así como datos para la segunda búsqueda.

Y si tengo 90000 filas de datos y si voy a buscar cada vez que la memoria se actualiza para tomar un nuevo resultado de búsqueda sin eliminar los resultados de la búsqueda anterior y para la última recuperación memoria ya tendría 89999 filas de datos .

  1. ¿Es así como PDOStatement::fetch obras?
  2. Rendimiento sabio cómo se apila esta pila contra PDOStatement::fetchAll?

Actualización: Algo sobre traer y fetchAll desde el punto de vista

Sólo quería añadir algo a esta pregunta el uso de memoria en fecha tan reciente encontrado algo con respecto a traer y fetchAll, espero que esto haría esta pregunta que vale la pena porque la gente visitaría esta pregunta en el futuro para entender algo sobre fetch y fetchAll parameters.

fetch no almacena información en la memoria y funciona en fila a fila, por lo que pasaría por el conjunto de resultados y la fila 1 de retorno, que volvería al conjunto de resultados y luego volvería a la fila 2 no devolverá la fila 1 ni la 2, sino que solo devolverá la fila 2, por lo que fetch no almacenará nada en la memoria, pero fetchAll almacenará los detalles en las memorias. Así que buscar es una mejor opción en comparación con fetchAll si se trata de un conjunto resultante de alrededor de 100K de tamaño.

+0

¿Está clara esta pregunta o aún requiere más información? – Rachel

Respuesta

3

PHP generalmente mantiene sus resultados en el servidor. Todo depende del controlador. MySQL se puede usar en modo "sin búfer", pero es un poco complicado de usar. fetchAll() en un gran conjunto de resultados puede causar inundaciones en la red, agotamiento de la memoria, etc.

En cada caso donde necesito procesar más de 1,000 filas, no estoy usando PHP. Considere también si su motor de base de datos ya tiene una operación de exportación CSV. Muchos hacen.

0

Te aconsejo que uses PDO::FETCH_LAZY en lugar de PDO::FETCH_ASSOC para datos grandes. Lo usé para exportar a csv fila por fila y funciona bien. Sin ningún error de "falta de memoria".

+0

Esto es más un comentario que una respuesta que diría. – hakre