English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Métodos de Solução do Problema de Consumo de Memória ao Consultar Dados em Grande Volume no PHP

Mensagem de conteúdo insuficiente ao consultar uma grande quantidade de dados do banco de dados:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

Este problema no site oficial do PHP é chamado de consulta bufferizada e não-buffereada (Buffered and Unbuffered queries). O modo padrão de consulta do PHP é bufferizado. Isso significa que os resultados da consulta serão extraídos uma vez para o espaço de memória e processados pelo programa PHP. Isso oferece ao programa PHP funcionalidades adicionais, como calcular o número de linhas, mover o ponteiro para uma linha específica, etc. O mais importante é que o programa pode realizar consultas e filtragens repetidas do conjunto de dados. Mas a deficiência deste modo de consulta bufferizada é o consumo de memória, ou seja, troca de espaço por velocidade.

Em contrapartida, outro modo de consulta do PHP é a consulta não-buffereada, onde o servidor de banco de dados retorna os dados um por um, em vez de retornar todos de uma vez. Isso resulta em o programa PHP consumindo menos memória, mas aumentando a pressão no servidor de banco de dados, pois o banco de dados continuará a esperar que o PHP recolha os dados até que todos sejam concluídos.

Claramente, o modo de consulta bufferizada é adequado para consultas de pequenas quantidades de dados, enquanto a consulta não-buffereada é adequada para consultas de grandes quantidades de dados.

Todos conhecem o modo de bufferização de consulta do PHP, a seguir, apresentamos um exemplo de como executar a API de consulta não-buffereada.

 Método de consulta não-buffereado: mysqli

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); 
if ($uresult) { 
  while ($row = $uresult->fetch_assoc()) { 
    echo $row['Name'] . PHP_EOL; 
  } 
} 
$uresult->close(); 
?> 

Método de consulta não-buffereada dois: pdo_mysql

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 
$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
  while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
    echo $row['Name'] . PHP_EOL; 
  } 
} 
?> 

Método de consulta não-buffereada três: mysql

<?php 
$conn = mysql_connect("localhost", "my_user", "my_pass"); 
$db  = mysql_select_db("world"); 
$uresult = mysql_unbuffered_query("SELECT Name FROM City"); 
if ($uresult) { 
  while ($row = mysql_fetch_assoc($uresult)) { 
    echo $row['Name'] . PHP_EOL; 
  } 
} 
?> 

Isso é tudo o que há no artigo. Esperamos que ajude no seu aprendizado e que você apóie o tutorial Grito com mais força.

Declaração: O conteúdo deste artigo é extraído da internet, pertencente ao respectivo detentor dos direitos autorais, uploaded por usuários da internet de forma voluntária. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal. Se você encontrar conteúdo suspeito de violar direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, troque # por @ para denunciar e forneça provas relevantes. Em caso de verificação, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)

Você Também Pode Gostar