PHP读取9MB CSV文件时内存耗尽问题求助
PHP读取9MB CSV文件时内存耗尽问题求助
嘿,我来帮你捋捋这个问题哈~
首先得给你澄清一个关键误区:你修改的upload_max_filesize和post_max_size这俩配置,管的是文件上传阶段的大小限制,和PHP运行过程中能使用的内存完全不是一回事!你看到的错误提示里,Allowed memory size of 134217728 bytes exhausted其实是说PHP默认的运行内存限制是128MB,而你一次性把4万条CSV记录全读到内存里(比如都存到$linhas数组里),到渲染视图的时候就把内存撑爆了。
给你几个实用的解决办法:
临时调高内存限制(快速应急):
你可以在PHP代码的最开头加一行,临时把内存限制调大:ini_set('memory_limit', '256M');或者直接去php.ini文件里修改
memory_limit = 256M,改完记得重启你的Web服务器(比如Apache、Nginx)。不过这只是临时救急的办法,不是长期最优解。流式处理CSV(根源解决):
别一次性把整个CSV都塞进内存,改用逐行读取的方式,这样不管CSV有多少行,内存里只会保留当前一行的数据,占用极低。给你贴个适配你视图逻辑的代码示例:// 打开目标CSV文件 $csvHandle = fopen('你的文件路径.csv', 'r'); if ($csvHandle !== false) { // 先读取表头(如果你的CSV带表头的话) $header = fgetcsv($csvHandle); // 逐行读取并渲染单条记录 while (($row = fgetcsv($csvHandle)) !== false) { echo '<div class="m-3">'; foreach ($header as $index => $colName) { echo "<p>{$colName}: {$row[$index]}</p>"; } echo '</div>'; } fclose($csvHandle); }这种方法从根本上解决内存压力,就算以后CSV涨到几十MB也能轻松处理。
分批传递数据到视图:
如果你一定要把数据整理好再传给视图,那可以把4万条记录拆成小批次(比如每次1000条),分多次处理和渲染,这样每个批次占用的内存就不会超标了。
总结一下:你之前改的两个配置和这个内存错误完全不相关,要么临时扩容内存应急,要么换流式处理(强烈推荐后者)~
备注:内容来源于stack exchange,提问作者gustavo gabry
相关产品推荐
相关产品推荐

