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的盾,又一次进入了解决问题之战争中。

Laravel是业界比较出色的PHP框架之一,其强大的功能和易于使用的API使得其深受开发者的喜爱。在实际开发中,我们经常需要进行数据的导入和导出工作,而CSV作为一种广泛应用的数据格式,也成为了常用的导入和导出格式之一。本文就将介绍如何使用LaravelExcel扩展来进行CSV文件的导入和导出操作。一、安装LaravelExcel首先,我们需

php中json字符串转csv格式的方法:1、创建一个php示例文件;2、将JSON字符串转换为PHP数组或对象;3、创建一个文件句柄并打开一个CSV文件进行写入;4、在CSV文件中编写标题行和数据行;5、将数据行写入CSV文件,并在字段之间使用逗号分隔符,关闭文件句柄并完成转换即可。

这篇文章将为大家详细讲解有关PHP将行格式化为CSV并写入文件指针,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将行格式化为CSV并写入文件指针步骤1:打开文件指针$file=fopen("path/to/file.csv","w");步骤2:将行转换为CSV字符串使用fputcsv()函数将行转换为CSV字符串。该函数接受以下参数:$file:文件指针$fields:作为数组的CSV字段$delimiter:字段分隔符(可选)$enclosure:字段引号(

php导入csv乱码问题的解决办法:1、构造一个解析函数“function tb_str_getcsv($string, $delimiter=',', $enclosure='"') {...}”;2、读取文件到变量;3、通过“substr($s,2)”去掉BOM头即可。

Python中的XML数据转换为CSV格式XML(ExtensibleMarkupLanguage)是一种可扩展标记语言,常用于数据的存储和传输。而CSV(CommaSeparatedValues)则是一种以逗号分隔的文本文件格式,常用于数据的导入和导出。在处理数据时,有时需要将XML数据转换为CSV格式以便于分析和处理。Python作为一种功能强大

Java是一种广泛使用的编程语言,开发者们常常需要处理各种数据格式。CSV(Comma-SeparatedValues,逗号分隔值)是一种常见的数据格式,广泛应用于数据交换和存储。在Java中,我们可以使用OpenCSV库来读写CSV文件。OpenCSV是一个简单易用的开源库,提供了方便的API来处理CSV数据。本文将介绍如何在

概述主要知识点a.SwingNode类:把Javaswing组件封装成一个JavaFX的Node,使得JavaSwing可以和JavaFX嵌套在一起使用,JavaSwing贼丑,但操作简单,JavaFX的表格组件(TableView等)有点复杂,所以选择嵌套JavaSwing来使用,丑就丑吧b.javacsv-2.0.jar:用于通过文件地址读取csv文件,并可以进行一系列操作.尽管2008年之后就不再更新,但操作个csv文件也够用了。c.FileChoose类:JavaFX的一个文件选择器,可

csv通过打开CSV文件、格式化CSV文件、导出CSV文件、调整VCF文件格式和保存VCF文件的步骤转vcf。详细介绍:1、打开CSV文件,可以使用Microsoft Excel、Google Sheets或任何其他电子表格程序打开CSV文件;2、格式化CSV文件,确保CSV文件的列标题清晰明确;3、导出CSV文件等等。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器