1

我想阅读一个大(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

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

4

0 回答 0