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가 데이터를 가져오기를 기다리는 동안 데이터를 전송하는 것입니다.

명백하게도, 버퍼 모드 쿼리는 작은 데이터량 쿼리에 적합하며, 비버퍼 쿼리는 큰 데이터량 쿼리에 적합합니다.

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#w 이메일로 발송하여 주십시오.3codebox.com(이메일을 보내는 경우, #을 @으로 변경하십시오. 신고하고 관련 증거를 제공하시면, 사실을 확인하면 해당 사이트가 즉시 저작권 침해 내용을 삭제합니다.

추천 합니다