>  기사  >  데이터 베이스  >  PHP에서 매우 큰 결과 세트를 쿼리하기 위해 mysql_query를 사용할 때 발생하는 과도한 메모리 문제를 해결하는 방법

PHP에서 매우 큰 결과 세트를 쿼리하기 위해 mysql_query를 사용할 때 발생하는 과도한 메모리 문제를 해결하는 방법

黄舟
黄舟원래의
2016-12-13 17:56:391050검색

다음은 캐시를 사용할 때와 사용하지 않을 때를 비교한 것입니다(쿼리한 테이블에 천만 행이 넘는 데이터가 있습니다).

function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo->prepare('select * from test');
$sth->execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth->fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i > 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
위는 모든 결과를 캐시합니다. 설정 모드에서 이 기능을 실행하면 아래와 같이 과도한 메모리 오류가 보고됩니다.


치명적 오류: 허용된 메모리 크기 134217728바이트가 소진되었습니다(204800000바이트 할당 시도). E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest .php 57행

콜 스택:


0.0005 135392 1. {main}() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:0

0.0005 135568 2. test-> selecttest() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:86
0.0055 142528 3. PDOStatement->execute() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:57

$sth->execute 실행 시 초과됨 ();


주석을 제거하면 // $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 이 줄은 결과 집합을 캐시하지 않는 방법을 사용합니다. 이 함수는 다음 내용을 출력합니다:


초기 점유 메모리 크기: 144808

Array
(
[id] => 1
[a] => v
[b] => w
[c] => i
)
점유 메모리 크기: 145544

Array
(
[id] => 2
[a] => b
[b] => l
[c] => q
)
점유 메모리 크기: 145544

Array
(
[id] => 3
[a] => m
[b] => p
[c] => h
)
점유 메모리 크기: 145536

Array
(
[id] => 4
[a] => j
[b] => i
[c] => b
)
메모리 점유 크기: 145536

Array
(
[id] => 5
[a] => q
[b] => g
[c] => g
)
메모리 점유 크기: 145536

당신 결과 세트를 캐싱하여 결과 행을 얻는 데 사용되는 메모리가 매우 작다는 것을 알 수 있습니다. 이렇게 하면 메모리 제한을 초과하는 문제가 해결됩니다.

읽어주셔서 감사합니다. 더 많은 관련 내용을 알고 싶으시다면 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.