Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atingindo inesperadamente o limite de memória do PHP com uma única consulta PDO?


Ding ding ding!

Ao se conectar ao MySQL, o PHP gosta de usar consultas em buffer . Isso é verdade independentemente do método que você está usando para se conectar. Ao usar consultas em buffer, todo o conjunto de resultados é buscado imediatamente em vez de ser buscado quando você pergunta. Isso é geralmente bom para o desempenho, pois há menos viagens de ida e volta.

Mas como tudo em PHP, há uma pegadinha. Conforme observado na página de buffer:

Você está usando o PHP 5.3, o que significa que há uma boa chance de você estar usando o mysqlnd.

Você vai querer desativar as consultas em buffer aqui. É feito de forma diferente em cada interface PHP para MySQL:
  • Para PDO, você precisará definir o PDO::MYSQL_ATTR_USE_BUFFERED_QUERY atributo para false .
  • Para mysqli, você precisa passar o MYSQLI_USE_RESULT constante para a query método.
  • Para mysql, você precisa chamar mysql_unbuffered_query em vez de mysql_query .

Detalhes completos e exemplos estão na página.

Pegadinha de consulta sem buffer!


Você deve feche corretamente o handle da instrução e libere o conjunto de resultados antes de emitir outra consulta:
  • No PDO, isso significa chamar closeCursor no identificador da instrução.
  • No mysqli, isso significa chamar free_result no identificador da instrução ou free na alça de resultado, dependendo do que você está trabalhando.
  • No mysql, isso significa chamar mysql_free_result

Não fazer isso resultará em um erro.