sql >> Base de Datos >  >> RDS >> Mysql

¿Llegando inesperadamente al límite de memoria de PHP con una sola consulta de PDO?

¡Ding ding ding!

Cuando se conecta a MySQL, a PHP le gusta usar consultas en búfer . Esto es cierto independientemente del método que esté utilizando para conectarse. Cuando se utilizan consultas almacenadas en búfer, el conjunto de resultados completo se recupera inmediatamente en lugar de recuperarse cuando lo solicita. Esto es normalmente bueno para el rendimiento, ya que hay menos viajes de ida y vuelta.

Pero como todo en PHP, hay un truco. Como se indica en la página de almacenamiento en búfer:

Está utilizando PHP 5.3, lo que significa que es muy probable que esté utilizando mysqlnd.

Querrá desactivar las consultas almacenadas aquí. Se hace de manera diferente en cada interfaz de PHP a MySQL:

  • Para PDO, deberá configurar PDO::MYSQL_ATTR_USE_BUFFERED_QUERY atributo a false .
  • Para mysqli, debe pasar el MYSQLI_USE_RESULT constante a la query método.
  • Para mysql, debe llamar a mysql_unbuffered_query en lugar de mysql_query .

Los detalles completos y los ejemplos están en la página.

¡Te pillé una gran consulta sin búfer!

debes cierre correctamente el identificador de declaración y libere el conjunto de resultados antes de emitir otra consulta:

  • En PDO, esto significa llamar a closeCursor en el identificador de declaración.
  • En mysqli, esto significa llamar a free_result en el identificador de declaración o free en el identificador de resultados, según con lo que esté trabajando.
  • En mysql, esto significa llamar a mysql_free_result

De lo contrario, se producirá un error.