Dimensioni di memory consentite di 67108864 byte esaurite

Devo aver letto tutti i post simili qui, ma non riesco ancora a capire perché questo sta accadendo.

Il mio codice:

$stmt = $this->db->stmt_init(); $stmt->prepare("SELECT Table1.id,Name,type,text,fname,lname FROM Table1, Table2 WHERE Table1.email = Table2.email AND type='text' AND Table1.Id=?"); $stmt->bind_param("i", $id); $stmt->bind_result($legTxtId,$legTxtName, $legTxtType, $legTxtText, $legTxtFname, $legTxtLname); $stmt->execute(); $results = arrays(); while($stmt->fetch()) { $results[] = arrays( 'legTxtId' => $legTxtId , 'legTxtName' => $legTxtName , 'legTxtType' => $legTxtType , 'legTxtText' => $legTxtText , 'legTxtFname' => $legTxtFname , 'legTxtLname' => $legTxtLname ); } $stmt->close(); return $results; 

Ora sto usando lo stesso codice esatto in una function diversa che viene chiamata prima di questa e funziona bene anche se restituisce un altro field.

Questo in particolare restituisce solo 1 row con un breve text semplice (senza foto o altro) quindi non dovrebbe fallire perché è decisamente inferiore a 64M.

Qualcuno può vedere qual è il problema?

Come discusso nell'altra domanda, sembra che le due soluzioni siano:

1) Passare al connettore mysqlnd in quanto questo non mostra lo stesso bug.

Se stai usando Yum per installare PHP (ad esempio su un server Amazon ec2), puoi farlo modificando la configuration del tuo stack LAMP da questo:

 sudo yum install php-mysql php php-xml php-mcrypt php-mbstring php-cli mysql httpd 

a:

 sudo yum install php-mysqlnd php php-xml php-mcrypt php-mbstring php-cli mysql httpd 

2) Utilizza store_result o use_result che non mostrano il problema di allocazione di memory.

Passare a mysqlnd è probabilmente una soluzione migliore a lungo termine in quanto è scritta in modo generale migliore rispetto al connettore php-mysql esistente (ad esempio i risultati non sono duplicati nella memory MySQL prima di essere copiati in memory PHP) ed è il connettore predefinito da PHP 5.4.0 poi.

Allora perché usi il ciclo while per un record?

Spostare i dati su un buffer locale può forse aiutare:

 // ... $stmt->prepare(...); $stmt->bind_param(...); $stmt->execute(); $stmt->store_result(); $stmt->bind_result(...); // ...