Mysql
 sql >> Database >  >> RDS >> Mysql

Raggiungere inaspettatamente il limite di memoria PHP con una singola query PDO?

Ding ding ding!

Quando si connette a MySQL, PHP utilizza query bufferizzate . Questo è vero indipendentemente dal metodo che stai usando per connetterti. Quando si utilizzano query memorizzate nel buffer, l'intero set di risultati viene recuperato immediatamente invece di essere recuperato quando lo chiedi. Questo è solitamente buono per le prestazioni, poiché ci sono meno viaggi di andata e ritorno.

Ma come tutto in PHP, c'è un problema. Come notato nella pagina di buffering:

Stai usando PHP 5.3, il che significa che ci sono buone probabilità che tu stia usando mysqlnd.

Ti consigliamo di disattivare le query nel buffer qui. È fatto in modo diverso in ogni interfaccia PHP per MySQL:

  • Per PDO, dovrai impostare il PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attributo a false .
  • Per mysqli, devi passare il MYSQLI_USE_RESULT costante alla query metodo.
  • Per mysql, devi chiamare mysql_unbuffered_query invece di mysql_query .

Tutti i dettagli e gli esempi sono sulla pagina.

Ho capito una query senza buffer grossa!

devi chiudere correttamente l'handle dell'istruzione e liberare il set di risultati prima di eseguire un'altra query:

  • In PDO, questo significa chiamare closeCursor sull'handle dell'istruzione.
  • In mysqli, questo significa chiamare free_result sull'handle dell'istruzione o free sull'handle del risultato, a seconda di cosa stai lavorando.
  • In mysql, questo significa chiamare mysql_free_result

In caso contrario, verrà generato un errore.