Я хотел бы прочитать большой (40 000 строк) файл xlsx.В старой версии (PHPExcel) я использовал кэширование, и оно работало нормально.
Теперь я хотел бы перейти на новейшую версию PhpSpreadsheet, и мне нужно использовать кэширование.Без настроек кэша программа завершится с ошибкой выделения памяти.(в php.ini: memory_limit = 5000M)
* Неустранимая ошибка: недостаточно памяти (выделено 780140544) (попытка выделить 29360128 байт) в D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection\ Cells.php в строке 400 *
Я пробовал 2 пакета кеша, APCu и Redis.
$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
// $ pool = new \ Cache \ Adapter \ Apcu \ ApcuCachePool ();
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
$objReader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx");
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load(dirname(__FILE__).'/Tmpfile'.$i.'.xlsx');
$objPHPExcel->setActiveSheetIndex(0);
foreach ( $objPHPExcel->getActiveSheet()->getRowIterator() as $row ) {
etc...
Я получил фатальную ошибку в обоих случаях.
APCu: * Фатальная ошибка: Uncaught PhpOffice \ PhpSpreadsheet \ Exception: запись в ячейку A2больше не существует в кеше.Это, вероятно, означает, что кэш был очищен кем-то другим.в D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php: 433 Трассировка стека: # 0 D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Worksheet \ Worksheet.php (1239):PhpOffice \ PhpSpreadsheet \ Collection \ Cells-> get ('A2') # 1 D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Worksheet \ RowCellIterator.php (128): PhpOffice \ PhpSpreadsheet \ Worksheet \ WorksumnBolCol(1, 2) # 2 D: *** \ Eclipse \ WebShopUpdate \ run.php (358): PhpOffice \ PhpSpreadsheet \ Worksheet \ RowCellIterator-> current () # 3 {main}, брошенный в D: *** \ phpoffice\ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php в строке 433 *
Redis: * Неустранимая ошибка: Uncaught RedisException: сервер Redis исчез в D: *** \ cache \redis-adapter \ RedisCachePool.php: 82 Трассировка стека:
0 D: *** \ cache \ redis-adapter \ RedisCachePool.php (82): Redis-> set ('phpspreadsheet ....'), 'a: 4: {i: 0; b: 1; i: ...') # 1
D: *** \ cache \ adapter-common \ AbstractCachePool.php (240): кэш\ адаптер \ Redis \ RedisCachePool-> storeItemInCache(Объект (Cache \ Adapter \ Common \ CacheItem), NULL) # 2 D: *** \ cache \ simple-cache-bridge \ SimpleCacheBridge.php (72): Cache \ Adapter \ Common \ AbstractCachePool-> save (Object (Cache \ Adapter \ Common \ CacheItem))
3 D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php (372):
Cache \ Bridge \ SimpleCache\ SimpleCacheBridge-> set ('phpspreadsheet ....', Object (PhpOffice \ PhpSpreadsheet \ Cell \ Cell)) # 4 D: *** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php (398):PhpOffice \ PhpSpr в D: *** \ cache \ adapter-common \ AbstractCachePool.php в строке 337 *
Среда:
- PHPВерсия 7.1.3
- Apache / 2.4.25 (Win32)
- APCu Версия 5.1.11
- Redis Версия 4.0.2
Environment2:
- PHP версии 5.6.30
- Apache / 2.4.25 (Win32)
- APCu версии 4.0.10
- Redis версии 2.2.7
Я получил одинаковую ошибку во всех случаях.