2012-12-03 92 views
2

我面臨一個問題。PHP:讀取大量的excel文件導致致命錯誤

我需要讀取約10MB的.xls文件。我寫了一個php代碼,當我讀取小的.xls文件時工作正常。但當我嘗試讀取大文件,然後瀏覽器顯示「致命錯誤:允許內存大小134217728字節用盡(試圖分配1032字節)在C:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.php在線1126「

這是我的代碼。

<?php 

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

    set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/'); 

    include 'PHPExcel/IOFactory.php'; 
    $inputFileName = 'ru_unit_H_all.xls'; 
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); 
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); 


    echo $sheetData['20007'][ 'K'];   //row colomn 

?> 
+0

就我而言,'memory_limit'不能被'ini_set()'覆蓋。 –

+0

在分析文件時,內存管理會成爲PHP中的一個真正痛苦,如果可以的話,優化PHPExcel以消耗更少的內存。嘗試將memory_limit增加到256M,如果你有內存限制錯誤,那麼解析可能已經在無限循環或遞歸 – SmasherHell

回答

0

最後,我通過使用example12代碼解決了我的問題。

<?php 

set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/'); 
include 'PHPExcel/IOFactory.php'; 

$inputFileType = 'Excel5'; 
$inputFileName = 'ru_unit_H_all.xls'; 

class chunkReadFilter implements PHPExcel_Reader_IReadFilter 
{ 
    private $_startRow = 0; 
    private $_endRow = 0; 

    public function setRows($startRow) 
    { 
     $this->_startRow = $startRow; 
    } 

    public function readCell($column, $row, $worksheetName = '') 
    { 
     if (($row == 1) || ($row >= $this->_startRow)) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

$objReader = PHPExcel_IOFactory::createReader($inputFileType); 

$chunkFilter = new chunkReadFilter(); 

$objReader->setReadFilter($chunkFilter); 

$chunkFilter->setRows(22000); 
$objPHPExcel = $objReader->load($inputFileName); 

echo $objPHPExcel->getActiveSheet()->getCell('K22000')->getValue(); 

} 

?> 
2

錯誤消息應當是自解釋:

「致命錯誤:允許存儲器尺寸用盡 134217728個字節的(試圖分配1032個字節)在C:\瓦帕\ WWW \學生\ ExcelRes \ PHPExcel \ Cell.php on line 1126「

您只是簡單地用完了內存以執行一個腳本。

您可以使用ini_set()增加您的memory_limit來解決此問題。

注意:使用128MB是不夠的,因爲134217728B = ~128MB仍然會導致該錯誤。嘗試使用512MB

對於我所知的PHP,沒有記憶有效實現的Excel讀寫器。

+0

我已經使用ini_set()函數。但仍然造成問題 –

+0

仍造成問題 –

+0

@ImdadSarkar所以使用5GB或不同的實現......沒有太多的其他選項。 – Vyktor

0

該腳本的可用內存已被取消。默認情況下,我相信每個腳本都有分配給它的8MB內存的限制。您正在嘗試讀取10MB文件,因此沒有足夠的內存來處理請求,並且失敗。

通過使用memory_limit設置,您可以嘗試增加可用內存量。

這可以在php.ini設置文件或使用

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

16M是內存16兆字節每個腳本的基礎上完成全球的所有腳本。

0

除了可能增加的內存之外,您還應該查看PHPExcel爲此提供的單元緩存選項,如標題爲「單元緩存」(第4.2.1節)的開發人員文檔部分所述(

編輯

而且你指定者()是要建立你的PHP內存請求,以及在陣列的使用,增加了額外的開銷 - 考慮在同一時間通過工作表迭代行,而不是裝載它兩次進入內存(一次作爲PHPExcel對象,一次作爲你的陣列)