im bằng cách sử dụng PHPExcel để đọc các tệp .xls. Tôi khá một thời gian ngắn tôi gặpĐọc tệp .xls qua PHPExcel ném Lỗi nghiêm trọng: cho phép kích thước bộ nhớ ... ngay cả với trình đọc đoạn
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 730624 bytes) in Excel\PHPExcel\Shared\OLERead.php on line 93
sau khi một số googling, tôi đã cố gắng chunkReader để ngăn chặn điều này (được đề cập ngay cả trên trang chủ PHPExcel), nhưng vẫn bị mắc kẹt với lỗi này.
Suy nghĩ của tôi là, thông qua trình đọc đoạn, tôi sẽ đọc từng phần một phần và bộ nhớ của tôi sẽ không tràn. Nhưng phải có một số bộ nhớ nghiêm trọng? Hoặc im giải phóng một số bộ nhớ xấu? Tôi thậm chí đã cố nâng ram máy chủ lên 1GB. Kích thước tập tin, mà tôi cố gắng để đọc là khoảng 700k, mà không phải là quá nhiều (im cũng đọc ~ 20MB pdf, xlsx, docx, doc, vv tập tin mà không có vấn đề). Vì vậy, tôi giả sử có thể chỉ là một số troll nhỏ tôi bỏ qua.
Mã trông như thế này
function parseXLS($fileName){
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/IOFactory.php';
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/ChunkReadFilter.php';
$inputFileType = 'Excel5';
/** Create a new Reader of the type defined in $inputFileType **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 20;
/** Create a new Instance of our Read Filter **/
$chunkFilter = new chunkReadFilter();
/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/
$objReader->setReadFilter($chunkFilter);
/** Loop to read our worksheet in "chunk size" blocks **/
/** $startRow is set to 2 initially because we always read the headings in row #1 **/
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
/** Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow,$chunkSize);
/** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/
$objPHPExcel = $objReader->load($fileName);
// Do some processing here
// Free up some of the memory
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
}
}
Và đây là mã cho chunkReader
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
/** Set the list of rows that we want to read */
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
// Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
Tôi đã tìm thấy liên kết này một thời gian trước đây, nhưng giờ đây họ không chuyển tôi thêm nữa. Trong khi sử dụng trình đọc đoạn im vẫn nhận được lỗi tương tự, ngay cả khi getDataOnly được đặt thành true ... –