内存节省PhpOffice \ PhpSpreadsheet

时间:2018-05-30 07:36:22

标签: php redis phpspreadsheet phpoffice

我想阅读一个大的(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: *致命错误:未捕获的PhpOffice \ PhpSpreadsheet \例外:缓存中不再存在单元格条目A2。这可能意味着   缓存被其他人清除。在   D:*** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php:433堆栈跟踪:#0   d:*** \ phpoffice \ phpspreadsheet \ SRC \ PhpSpreadsheet \工作表\ Worksheet.php(1239):   PhpOffice \ PhpSpreadsheet \ Collection \ Cells-> get(' A2')#1   d:*** \ phpoffice \ phpspreadsheet \ SRC \ PhpSpreadsheet \工作表\ RowCellIterator.php(128):   PhpOffice \ PhpSpreadsheet \工作表\ Worksheet-> getCellByColumnAndRow(1,   2)#2 D:*** \ Eclipse \ WebShopUpdate \ run.php(358):   PhpOffice \ PhpSpreadsheet \ Worksheet \ RowCellIterator-> current()#3   抛出了{main}   d:*** \ phpoffice \ phpspreadsheet的\ src \ PhpSpreadsheet \收藏\ Cells.php   在第433行*

     

Redis: *致命错误:未捕获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;我:......')#1

     

d:*** \缓存\适配器共用\ AbstractCachePool.php(240):   缓存\适配器\ Redis的\ RedisCachePool-> storeItemInCache(对象(缓存\适配器\共同\ CacheItem),   NULL)#2 D:*** \ cache \ simple-cache-bridge \ SimpleCacheBridge.php(72):   缓存\适配器\共同\ AbstractCachePool->保存(对象(缓存\适配器\共同\ CacheItem))

     

3 D:*** \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php(372):

     

缓存\桥\ SimpleCache \ SimpleCacheBridge->设置(' phpspreadsheet ....&#39 ;,   对象(PhpOffice \ PhpSpreadsheet \ Cell \ Cell))#4   d:*** \ phpoffice \ phpspreadsheet的\ src \ PhpSpreadsheet \收藏\ Cells.php(398):   D:*** \ cache \ adapter-common \ AbstractCachePool.php中的PhpOffice \ PhpSpr   在线337 *

环境:

  • PHP Version 7.1.3
  • Apache / 2.4.25(Win32)
  • APCu版本5.1.11
  • Redis版本4.0.2

环境2:

  • PHP Version 5.6.30
  • Apache / 2.4.25(Win32)
  • APCu版本4.0.10
  • Redis版本2.2.7

在所有情况下我都遇到了同样的错误。

0 个答案:

没有答案