我想阅读一个大的(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 *
环境:
环境2:
在所有情况下我都遇到了同样的错误。