运行我的php脚本时为什么一直出现内存分配错误?

时间:2017-04-11 20:11:03

标签: php

我正在迭代一些csv文件(没有超过320MB)以使用以下脚本清理和格式化文件的方式:

while($row = mysqli_fetch_array($rsSelect)){        

    $fileName = $row["file_name"];

    if(strpos($fileName,'DATA') == true){

        $file = $dir.$row["manifest_files"]."";
        echobr($file);
        $file1 = file_get_contents($file, null);

        unset($file);
        $file2 = str_replace('","','    ', $file1);

        unset($file1);
        $file3 = str_replace('"','', $file2);

        file_put_contents($dir.$row["file_name"].".txt",$file3,FILE_USE_INCLUDE_PATH);
        unset($file2);
        unset($file3);

}

我收到以下错误,无论我在php.ini中设置内存限制有多高,或者在我可以释放内存的情况下取消设置varbeles。我已经尝试在脚本中设置限制但仍然没有去。我的机器不缺RAM,足以在我需要时操作文件时轻松存储。

  

错误:(!)致命错误:内存不足(已分配683147264)(尝试分配364322204字节)

1 个答案:

答案 0 :(得分:3)

使用file_get_contents()需要将整个文件读入一个大块的内存中。您最好在fopen()周围使用fgets()$fp = fopen('file.csv', 'r'); while (($line = fgets($fp)) !== false) { // $line is the whole line } 。这将一次只读一行:

fgetcsv()

或者,您可以使用$fp = fopen('file.csv', 'r'); while (($row = fgetcsv($fp)) !== false) { // $row is an array of values from the line } 并根据需要处理单个字段:

 var True = "True";
 var False = "False";
 var x = @Model.validNumber;
 if( x != False){
   $('#ticketResults').toggleClass('hidden');
  };