我想阅读一个大(40 000 行)xlsx 文件。在旧版本(PHPExcel)中,我使用了缓存,并且效果很好。
现在我想迁移到最新的 PhpSpreadsheet 版本,我需要使用缓存。如果没有缓存设置,程序将以内存分配错误结束。(在 php.ini 中memory_limit = 5000M
:)
*致命错误:第 400 行 D:***\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Collection\Cells.php 中的内存不足(已分配 780140544)(试图分配 29360128 字节)*
我尝试了 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\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\Worksheet->getCellByColumnAndRow (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: *致命错误:未捕获的 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): Cache\Adapter\Redis\RedisCachePool->storeItemInCache(Object(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
环境2:
- PHP 版本 5.6.30
- Apache/2.4.25 (Win32)
- APCu 版本 4.0.10
- Redis 版本 2.2.7
在所有情况下我都遇到了同样的错误。