fputcsv不适用于大型数组

时间:2014-06-09 14:43:47

标签: php csv

我使用fputcsv(显然)在应用程序中创建表的csv文件。我只是将一个2d数据数据发布到:

function formatoutput(&$vals, $key){
    foreach($vals AS $row=>&$cell){
        $cell = str_replace('"', '""', $cell); 
        $cell = str_replace(array("\n",','), '', $cell); 
    }
}

function outputCSV($array) {
    $outstream = fopen("php://output", "w");
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals);
    }
    array_walk($array, "formatoutput");
    array_walk($array, "__outputCSV", $outstream);
    fclose($outstream);
}

outputCSV(unserialize($_POST['data']));

因此,对于数组中的每一行,它会将其附加到csv文件。好吧,这个工作正常,直到我传入一个大约500或更多行的数组。

使用此功能时是否有尺寸限制?文档没有提到任何内容。或者是否有限制大小的PHP设置?

这里有一个问题:is there a file size limit when creating a csv file using php and mysql?

这基本上要求同样的事情,但即使有明确的答案,它也没有真正解释任何可能的解决方案。它只是声明:

"听起来像您的环境设置有问题 - 不是代码或技术限制。"

1 个答案:

答案 0 :(得分:1)

PHP将这些变量加载到内存中。根据您的php.ini设置,每个脚本都有允许使用的最大内存量。

此外,复制变量时,它们占用内存空间的两倍。源内存和目标内存。我不确定fputcsv的内部结构,但是整个数组可能在内部转换为csv“对象”,然后写入文件。

所以,请记住,每次复制时,你的内存使用量都可能翻倍。

至少,请检查php.ini中的“memory_limit”。如果您需要特别为一个脚本增加它,那么您可以使用以下命令在脚本中设置它:

ini_set('memory_limit','16M');