Heim Backend-Entwicklung PHP-Tutorial PHP的惰性加载跟Iterator的使用

PHP的惰性加载跟Iterator的使用

Jun 13, 2016 pm 01:08 PM
csv iterator key php

PHP的惰性加载和Iterator的使用

最近换了工作,改做建站软件了,我们公司建站软件的模板系统出了问题,提示内存超出最大值。内存的问题最简单的方法是修改php.ini提高memory_limit,但是随着模板数的不断增加,需要的内存又超出了上限,于是老大把这个问题让我看看,看我有什么好办法。

我拿到这个问题,首先是看懂原有的代码思路,分析问题产生的主要原因,出问题的页面很简单,就是一个模板显示页面,每页显示16个模板,做分页处理,而后台的处理却不简单,首先模板数据不是从数据库读取,而是从服务器端获取一个序列化字符串,取出的是所有的模板的信息数组,然后将信息缓存下来(以后先读缓存),然后数组中做过滤和分页操作,取出16个模板显示。

然后分析问题,很明显这里的问题是出在取出的是所有的模板的信息数组这个问题上,模板的数量是庞大的,但是其实每页需要的只有16个而已,可是这里却实现全部加入了内存。

问题时找到了,那怎么解决呢?于是我问了以前的员工,听他们的意见。他们提供了很多意见,有把模板放到数据库处理,有将分页等操作全部放到我们的服务器处理等,但是方案都需要对我们后台服务器做大的处理改进,而且改动的东西太大,引入的问题就多了,怎么办?

1. 惰性加载

后来我想,既然问题出在序列化取出了所有的数据,如果我们能在文件中,只取出我们需要的数据就好了,由于我有java的经验,我首先想到的是XML SAX 处理方式,但是我对PHP中XML处理不熟,不得要领。

不过却给了我正确的思路,很多的PHP内存过大的问题,是由于PHP开发者为了方便,将所有需要的数据预先加载到内存(array),然后通过处理,这样导致的问题是所需的内存远远超过了其实际的所需,导致了内存过量的问题。解决方法就是惰性加载,让数据在使用时才加载到内存中处理。

这里的问题很明显是序列化的问题,PHP的serialize机制是一个预先加载的策略,不支持惰性加载。需要找一个支持惰性加载的序列化方式,能够每次只读取一个模板的内容处理,很快CSV格式就出现了,CSV就支持这种以行为单位的读取方式,而对于原有的系统机制不需要有大的改动,于是就要对原有的系统进行csv序列化改变。

2.Iterator接口使用

csv读取使用while来遍历,而原来的系统使用数组来遍历,由于系统代码过滤的条件多,涉及很多代码的修改,而以前的数组使用key=>value对实现,而csv只能使用0,1,2数字访问。为了尽可能减少原有的代码修改,我们首先对csv做了处理,让它的第一行array的key值,从第二行开始显示模板实际数值value,位置和key一一对应,这样也满足了以后的扩展性。

为了和原代码的foreach风格尽量吻合,我们使用了Iterator封装了csv的操作,并在里面完成了csv的key->value的合并。这样,对于代码的迁移几乎可以忽略不计了,更大的好处是csv文件的大小比序列化后的文件大小下了很多,可能有人担心性能问题。

经过测试我们现有模板2000条,速度没有超过1秒,未来模板数要增加到20000条,遍历速度没有超过2s,也在可以接受的范围。于是这个问题就解决了。

最近,我们的自制简单的ORM框架出现了内存超过最大值,原因也是将所有数据库的值放入内存数组,于是我一手拿着惰性加载的矛,一手拿着Iterator的盾,又一次进入了解决问题之战争中。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

CakePHP-Protokollierung CakePHP-Protokollierung Sep 10, 2024 pm 05:26 PM

Die Anmeldung bei CakePHP ist eine sehr einfache Aufgabe. Sie müssen nur eine Funktion verwenden. Sie können Fehler, Ausnahmen, Benutzeraktivitäten und von Benutzern durchgeführte Aktionen für jeden Hintergrundprozess wie Cronjob protokollieren. Das Protokollieren von Daten in CakePHP ist einfach. Die Funktion log() wird bereitgestellt

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

See all articles