2010-03-26 3 views
10

Voglio usare pdo nella mia applicazione, ma prima voglio capire come internamente PDOStatement->fetch e PDOStatement->fetchAll.Come funziona PHP PDO internamente?

Per la mia applicazione, voglio fare qualcosa come "SELECT * FROM myTable" e inserirla nel file csv e ha circa 90000 righe di dati.

La mia domanda è, se uso PDOStatement->fetch come io sto usando qui:

// 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 dopo ogni prelevare dal database, comporteranno per che recuperano gli sarebbe conservare in memoria?

Significato quando faccio il secondo recupero, la memoria avrebbe i dati del primo recupero oltre ai dati per il secondo recupero.

E così se ho 90000 righe di dati e se sto facendo fetch ogni volta che la memoria viene aggiornata per prendere nuovi risultati di recupero senza rimuovere risultati dal precedente recupero e quindi per l'ultima memoria di recupero avrebbe già 89999 righe di dati .

  1. È così che funziona PDOStatement::fetch ?
  2. Prestazioni saggio come si accumula lo contro PDOStatement::fetchAll?

Aggiornamento: Qualcosa su di prendere e fetchAll dal punto di utilizzo della memoria di vista

Volevo solo aggiungere qualche cosa a questa domanda come recentemente trovato qualcosa per quanto riguarda prendere e fetchAll, spero che questo renderebbe questa domanda vale la pena per le persone vorrebbe visitare questa domanda in futuro per avere un po 'di comprensione sui parametri fetch e fetchTutti.

fetch non memorizza le informazioni in memoria e funziona su una base riga per riga, quindi passerebbe attraverso il set di risultati e restituirà la riga 1, che di nuovo andrebbe al set di risultati e di nuovo restituirà riga 2 non restituirà la riga 1 e 2 ma restituirà solo la riga 2, quindi fetch non memorizzerà nulla in memoria ma fetchAll memorizzerà i dettagli nelle memorie. Quindi fetch è l'opzione migliore rispetto a fetchAll se abbiamo a che fare con un set risultante di circa 100K di dimensione.

+0

Questa domanda è chiara o richiede ancora ulteriori informazioni? – Rachel

risposta

3

PHP generalmente mantiene i suoi risultati sul server. Tutto dipende dall'autista. MySQL può essere utilizzato in modalità "unbuffered", ma è un po 'difficile da usare. fetchAll() su un set di risultati di grandi dimensioni può causare flooding della rete, esaurimento della memoria, ecc.

In ogni caso in cui devo elaborare più di 1.000 righe, non sto utilizzando PHP. Prendi in considerazione anche se il tuo motore di database ha già un'operazione di esportazione CSV. Molti lo fanno

0

Consiglio di utilizzare PDO::FETCH_LAZY anziché PDO::FETCH_ASSOC per i big data. L'ho usato per l'esportazione in CSV riga per riga e funziona bene. Senza errori di "memoria insufficiente".

+0

Questo è più un commento che una risposta direi. – hakre