Экономия памяти PhpOffice \ PhpSpreadsheet - PullRequest
0 голосов
/ 30 мая 2018

Я хотел бы прочитать большой (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

Я получил одинаковую ошибку во всех случаях.

...