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

Методы решения проблемы исчерпания памяти при запросе большого объема данных PHP

При запросе большого объема данных из базы данных可能出现 сообщение о нехватке места:

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

Эта проблема на официальном сайте PHP называется буферизированные и небуферизированные запросы (Buffered and Unbuffered queries). По умолчанию в PHP используется буферизированный режим запросов. Это означает, что результаты запроса автоматически извлекаются все сразу в память для обработки PHP-программой. Это предоставляет PHP-программе дополнительные возможности, такие как вычисление количества строк, установка указателя на строку и т.д. Более того, программа может повторно выполнять запросы и фильтровать данные. Но недостатком буферизированного режима запросов является потребление памяти, то есть обмен быстродействием на пространство.

С другой стороны,还存在另一种PHP-режим запросов — небуферизированные запросы, при которых сервер данных возвращает данные по одной, а не все сразу. В результате PHP-программа потребляет меньше памяти, но это создает дополнительную нагрузку на сервер данных, так как база данных будет ждать, пока PHP не заберет все данные.

显然,буферизированные запросы подходят для малых объемов данных, а небуферизированные — для больших.

Все знают, что в PHP есть буферизированные запросы, а вот примеры выполнения небуферизированных запросов API.

 Метод одного буферизированного запроса: 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(); 
?> 

Метод двух буферизированных запросов: 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; 
  } 
} 
?> 

Метод не буферизации запроса три: 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; 
  } 
} 
?> 

Вот и все, что есть в этой статье, надеюсь, это поможет вам в изучении, также希望大家多多支持呐喊教程。

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не был обработан вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для сообщения о нарушении,并提供相关证据. Если факт будет подтвержден, сайт немедленно удалят涉嫌侵权的内容。

Рекомендуется для вас