问题描述
我正在使用 PHPspreadsheet 来解析 excel 文件。我每张都有 5
表和 5000
条记录。 excel 文件中的总 25000
条记录。我收到内存限制错误,500 内部错误。这是预期的还是我做错了?请在下面找到我的代码。提前致谢。
ini_set('max_execution_time',0);
ini_set("memory_limit",-1);
$logger = new Logger();
$startTime = date('Y-m-d H:i:s');
$logger->log('Import start time: ' . $startTime);
$client = new Redis();
$client->connect('127.0.0.1',6379);
$pool = new RedisCachePool($client);
$simpleCache = new SimpleCacheBridge($pool);
$options = LIBXML_COMPACT | LIBXML_PARSEHUGE;
Settings::setCache($simpleCache);
Settings::setLibXmlLoaderOptions($options);
$reader = IOFactory::createReader('Xlsx');
$worksheetNames = $reader->listWorksheetNames($fileName);
$chunkSize = 20;
$totalRow = 6000;
foreach ($worksheetNames as $worksheetName) {
$emptyRowCount = 0;
if (in_array($worksheetName,self::SHEET_BLACKLIST)) {
continue;
}
$logger->log('Processing the Sheet: ' . $worksheetName);
for ($startRow = 1; $startRow <= $totalRow; $startRow += $chunkSize) {
if ($emptyRowCount >= 10) {
$logger->log('Found continuos empty cells. Skipping to next sheet');
continue 2;
}
$chunkFilter = new ChunkReadFilter($startRow,$chunkSize);
$reader->setReadFilter($chunkFilter);
$reader->setLoadSheetsOnly($worksheetName);
$spreadsheet = $reader->load($fileName);
$objWorksheet = $spreadsheet->getActiveSheet();
$chunkSize = 20;
$logger->log('Import Started');
$i = 1;
foreach ($objWorksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
$logger->log(' RowIndex: ' . $rowIndex);
if (in_array($rowIndex,self::ROW_BLACKLIST)) {
continue;
}
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE);
$res = [];
foreach ($cellIterator as $cell) {
$column = $cell->getColumn();
if (in_array($column,self::COLUMN_BLACKLIST)) {
continue;
}
$logger->log('Cordinate: ' . $cell->getCoordinate());
$mergeRange = $cell->getMergeRange();
if ($cell->isInMergeRange()) {
$logger->log('In MERGE RANGE');
if ($cell->isMergeRangeValueCell()) {
$logger->log('it is a MergeRangeValueCell');
$logger->log('Value: ' . $cell->getCalculatedValue());
$res[] = $cell->getCalculatedValue();
} else {
$logger->log('it is not a MergeRangeValueCell');
$mergeRange = $cell->getMergeRange();
$logger->log('Merge range: ' . $mergeRange);
$mergeRange = Coordinate::splitRange($mergeRange);
$firstCellInRange = $mergeRange[0];
$val = $objWorksheet->getCell($firstCellInRange[0])->getCalculatedValue();
$logger->log('Value: ' . $val);
$res[] = $val;
}
} else {
$logger->log('Value: ' . $cell->getCalculatedValue());
$res[] = $cell->getCalculatedValue();
}
}
if (array_filter($res)) {
$emptyRowCount = 0;
$rohreRepository = new RohreRepository();
$title = 'Rohre_' . $worksheetName . '_' . $i;
$logger->log('Title: ' . $title);
$logger->log('Going to create : ' . json_encode($res));
$rohreRepository->create($res,$title);
} else {
$emptyRowCount++;
$logger->log('Empty row: Not creating a post');
}
$i++;
}
}
$sheet = $spreadsheet->getSheetByName($worksheetName);
if ($sheet) {
$sheetIndex = $spreadsheet->getIndex($sheet);
$logger->log('Removing sheet. Sheet index: ' . $sheetIndex);
$spreadsheet->removeSheetByIndex($sheetIndex);
}
}
$endTime = date('Y-m-d H:i:s');
$logger->log('Import end time: ' . $endTime);
$start = new DateTime($startTime);
$totalTiMetaken = $start->diff(new DateTime($endTime));
$minutes = $totalTiMetaken->days * 24 * 60;
$minutes += $totalTiMetaken->h * 60;
$minutes += $totalTiMetaken->i;
$logger->log('Total time: ' . $minutes . 'Minutes');
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)