PHPExcel内存问题

PHPExcel内存问题,php,memory,phpexcel,Php,Memory,Phpexcel,我正在尝试循环浏览一个3mb Excel文档,以获取所有需要插入数据库的数据。我正在使用的工作表有6500行,但将来可能会有所不同。我注意到,即使我使用了推荐的内存保存技术,它仍然会出错 $reader = PHPExcel_IOFactory::createReaderForFile($file_path); $reader->setReadDataOnly(true); //$sheets = $this->getWorksheetNames($file['tmp_name']

我正在尝试循环浏览一个3mb Excel文档,以获取所有需要插入数据库的数据。我正在使用的工作表有6500行,但将来可能会有所不同。我注意到,即使我使用了推荐的内存保存技术,它仍然会出错

$reader = PHPExcel_IOFactory::createReaderForFile($file_path);
$reader->setReadDataOnly(true);

//$sheets = $this->getWorksheetNames($file['tmp_name'], 0);
$reader->setLoadSheetsOnly('spreadsheetname');

$chunkFilter = new IPO_Reader(); 
$reader->setReadFilter($chunkFilter); 

$highestRow    = 10000; //$this->objWorksheet->getHighestRow();
$chunkSize     = 1; 
$highestColumn = "Y";

for ($startRow = 2; $startRow <= $highestRow; $startRow += $chunkSize) 
{ 

    $chunkFilter->setRows($startRow, $chunkSize); 
    $objPHPExcel  = $reader->load($file_path); 

    for($row = $startRow ; $row <= $startRow + $chunkSize; $row++)
    {
        $this->read_row = $objPHPExcel->getActiveSheet()->rangeToArray('A'.$row.':'.$highestColumn.$row, null, true, true, true);

        $this->read_row = end($this->read_row);         

        foreach($this->read_row as $column => $value)
        {
            $db_column_name = $this->_getDbColumnMap($column);
            if(!empty($db_column_name))
            {
                $this->new_data_row[$db_column_name] = $this->_getRowData($value, $column);
            }   

        }

        $this->read_row = null;
        $this->new_data_row['date_uploaded']    = date("Y-m-d H:i:s");
        $this->new_data_row['source_file_name'] = $file_name;
        $ipo_row  = new Model_UploadData_IPO();
        $ipo_row->create($this->new_data_row);
        $this->new_data_row = null;
        unset($ipo_row);

        gc_collect_cycles();

    }
    $objPHPExcel->disconnectWorksheets(); 
    unset($objPHPExcel);    
    gc_collect_cycles();
$reader=PHPExcel\u IOFactory::createReaderForFile($file\u path);
$reader->setReadDataOnly(true);
//$sheets=$this->getWorksheetNames($file['tmp\u name',0);
$reader->setLoadSheetsOnly('spreadsheetname');
$chunkFilter=新的IPO_阅读器();
$reader->setReadFilter($chunkFilter);
$highestRow=10000//$此->objWorksheet->getHighestRow();
$chunkSize=1;
$highestColumn=“Y”;
对于($startRow=2;$startRow setRows($startRow,$chunkSize);
$objPHPExcel=$reader->load($file\u路径);
对于($row=$startRow;$row read\u row=$objPHPExcel->getActiveSheet()->RangeTarray('A'.$row'.:'。$highestColumn.$row,null,true,true),true);
$this->read\u row=end($this->read\u row);
foreach($this->read_row as$column=>$value)
{
$db\u column\u name=$this->\u getDbColumnMap($column);
如果(!empty($db\u column\u name))
{
$this->new\u data\u row[$db\u column\u name]=$this->\u getRowData($value,$column);
}   
}
$this->read_row=null;
$this->new_data_row['date_upload']=date(“Y-m-dh:i:s”);
$this->new_data_行['source_file_name']=$file_name;
$ipo_row=新车型_上传数据_ipo();
$ipo\u行->创建($this->新建数据\u行);
$this->new_data_row=null;
未结算(首次公开募股行);
gc_collect_cycles();
}
$objPHPExcel->disconnectWorksheets();
未设置($objPHPExcel);
gc_collect_cycles();
当我在取消设置objPHPExcel之前和之后测试内存使用情况时,没有内存增益,我真的很困惑,因为分割成块似乎不允许我在每个块之后清除内存,使用情况逐渐增加,限制设置为250MB,它只允许我在PHP excel库中添加约500条记录我也有这个问题。对我有用的是这个建议(从上面的链接,试试看,有一些关于如何减少内存使用的好建议):


但无论如何,内存需求很大,因为他们为每个单元格分配了大量内存(用于格式化等,即使不需要)。恐怕我们无能为力,直到他们发布新版本的库。

好的,每个人都知道trwtf是Excel,所以我想问一下,您是否可以将其转换为CSV

我在PHP中有自己的CSV到表函数,这些函数用于导入非常大的文件,CSV处理起来容易得多,也不太容易出现随机库问题

如果您确实需要一次性处理,或者可以很容易地从XLS转换为CSV,请这样做,因为这将使您的生活更加轻松(因为每次您都坚持使用更简单、更标准的替代方案;)

因此,对于一个将转换非常邪恶和可怕的XLS格式的API,您可以使用以下一种o/s转换器-我每次都推荐python,但是,嘿,这是您的选择:

基本上想法是一样的,你使用一个外部工具来获得一个可用的文件格式,然后你从那里开始

我想这里没有我的csvtotable.php脚本,但是它很容易复制,您只需要有一些基本工具,比如csvtoarray和arraytointertstatements


GL;)

这不是最后一个问题=)请看一下(吃500MB)抱歉,漏掉了半个句子。只允许我添加500条记录亚洲:如果你犯了错误,你可以编辑你的问题。我似乎不是唯一一个有这个问题的人:有完全相同的问题!我还遇到PHPExcel在大文件上失败的问题。我最终决定使用COM接口直接与Excel对话。这很棘手,需要您在Windows上运行脚本并安装Excel。。。但至少它是有效的。我希望只是上传CSV文件,但不幸的是,这不是客户想要的。好吧,我也有一个解决方案。。。巴士呢不用开玩笑,使用OpenOffice API,它可以很容易地做到这一点。在我的上一份工作中,我还遇到了PHPExcel问题和大型Excel文件的内存问题。虽然我只是在阅读它们,但我仍然有问题,因为我们的一些供应商正在上传20MB+的文件。如果我没记错的话,我也使用OpenOffice API打开文件并将其转换为CSV,然后使用新文件迭代并将记录插入数据库。我已经为我们的用户提供了OpenOffice Calc文件的上传功能,所以我已经有了代码。如果您使用OpenOffice实现这一点,我们希望看到您的解决方案。
$objReader = new PHPExcel_Reader_Excel5();
$objReader->setReadDataOnly(true); /* this */