如何解决PHP里大量数据循环时内存耗尽的问题_PHP教程
如何解决PHP里大量数据循环时内存耗尽的问题
最近在开发一个PHP程序时遇到了下面的错误:
<ol class="dp-j"><li class="alt"><span><span>PHP Fatal error: Allowed memory size of </span><span class="number">268</span><span> </span><span class="number">435</span><span> </span><span class="number">456</span><span> bytes exhausted </span></span></li></ol>로그인 후 복사
错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach
循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。
毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。
这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。 PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将 指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。
很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。
非缓冲查询方法一: mysqli
<ol class="dp-j"><li class="alt"><span><span><?php </span></span></li><li><span>$mysqli = <span class="keyword">new</span><span> mysqli(</span><span class="string">"localhost"</span><span>, </span><span class="string">"my_user"</span><span>, </span><span class="string">"my_password"</span><span>, </span><span class="string">"world"</span><span>); </span></span></li><li class="alt"><span>$uresult = $mysqli->query(<span class="string">"SELECT Name FROM City"</span><span>, MYSQLI_USE_RESULT); </span></span></li><li><span> </span></li><li class="alt"><span><span class="keyword">if</span><span> ($uresult) { </span></span></li><li><span> <span class="keyword">while</span><span> ($row = $uresult->fetch_assoc()) { </span></span></li><li class="alt"><span> echo $row[<span class="string">'Name'</span><span>] . PHP_EOL; </span></span></li><li><span> } </span></li><li class="alt"><span>} </span></li><li><span>$uresult->close(); </span></li><li class="alt"><span>?> </span></li></ol>
非缓冲查询方法二: pdo_mysql
<ol class="dp-j"><li class="alt"><span><span><?php </span></span></li><li><span>$pdo = <span class="keyword">new</span><span> PDO(</span><span class="string">"mysql:host=localhost;dbname=world"</span><span>, </span><span class="string">'my_user'</span><span>, </span><span class="string">'my_pass'</span><span>); </span></span></li><li class="alt"><span>$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, <span class="keyword">false</span><span>); </span></span></li><li><span> </span></li><li class="alt"><span>$uresult = $pdo->query(<span class="string">"SELECT Name FROM City"</span><span>); </span></span></li><li><span><span class="keyword">if</span><span> ($uresult) { </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { </span></span></li><li><span> echo $row[<span class="string">'Name'</span><span>] . PHP_EOL; </span></span></li><li class="alt"><span> } </span></li><li><span>} </span></li><li class="alt"><span>?> </span></li></ol>
非缓冲查询方法三: mysql
<ol class="dp-j"><li class="alt"><span><span><?php </span></span></li><li><span>$conn = mysql_connect(<span class="string">"localhost"</span><span>, </span><span class="string">"my_user"</span><span>, </span><span class="string">"my_pass"</span><span>); </span></span></li><li class="alt"><span>$db = mysql_select_db(<span class="string">"world"</span><span>); </span></span></li><li><span> </span></li><li class="alt"><span>$uresult = mysql_unbuffered_query(<span class="string">"SELECT Name FROM City"</span><span>); </span></span></li><li><span><span class="keyword">if</span><span> ($uresult) { </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> ($row = mysql_fetch_assoc($uresult)) { </span></span></li><li><span> echo $row[<span class="string">'Name'</span><span>] . PHP_EOL; </span></span></li><li class="alt"><span> } </span></li><li><span>} </span></li><li class="alt"><span>?> </span></li></ol>


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다
