PhpSpreadsheet在工作表中平均每个单元格使用约1k,因此大型工作簿可以迅速用尽可用内存。
单元缓存提供了一种机制,使PhpSpreadsheet可以将单元对象维护在较小的内存或非内存中(例如:在磁盘上,在APCu中,内存缓存或Redis中)。
这使您可以减少大型工作簿的内存使用量,尽管以访问单元数据的速度为代价。
默认情况下,PhpSpreadsheet将所有单元格对象保留在内存中,但是您可以通过提供自己的
PSR-16
实现
来指定替代项
。
PhpSpreadsheet密钥会自动命名,并在使用后清除,因此单个缓存实例可在PhpSpreadsheet的几种用法之间共享,甚至与其他缓存用法共享。
为了使细胞缓存,您必须提供自己的实现,像这样的缓存:
$cache = new MyCustomPsr16Implementation();
\PhpOffice\PhpSpreadsheet\Settings::setCache($cache);
将为每个单独的工作表维护一个单独的缓存,并在根据您配置的设置实例化工作表时自动创建该缓存。一旦开始阅读工作簿或创建第一个工作表,就无法更改配置设置。
当心TTL
与常见的缓存概念相反,PhpSpreadsheet数据无法从头开始重新生成。如果存储了某些数据,但以后无法检索,则PhpSpreadsheet将引发异常。
这意味着存储在缓存中的数据不得由第三方或通过TTL机制删除。
因此,请确保TTL已停用或足够长以覆盖PhpSpreadsheet的全部用法。
PhpSpreadsheet不随备用缓存实现一起提供。您可以根据自己的环境选择最合适的实现。您可以从头开始实现PSR-16,也可以使用预先存在的库。
这样的库之一就是PHP Cache,它提供了多种选择。有关详细信息,请参阅他们的文档,但是这里有一些建议可以帮助您入门。
要求将软件包放入您的项目中:
composer require cache/simple-cache-bridge cache/apcu-adapter
用以下方式配置PhpSpreadsheet:
$pool = new \Cache\Adapter\Apcu\ApcuCachePool();
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
要求将软件包放入您的项目中:
composer require cache/simple-cache-bridge cache/redis-adapter
用以下方式配置PhpSpreadsheet:
$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
要求将软件包放入您的项目中:
composer require cache/simple-cache-bridge cache/memcache-adapter
用以下方式配置PhpSpreadsheet:
$client = new \Memcache();
$client->connect('localhost', 11211);
$pool = new \Cache\Adapter\Memcache\MemcacheCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
从PHPExcel迁移
PhpSpreadsheet通过引入名称空间和重命名某些类而引入了许多重大更改。为了帮助您迁移现有项目,编写了一个工具,将对PHPExcel类的所有引用替换为它们的新名称。但是,还需要进行手动更改。
该工具包含在PhpSpreadsheet中。它从当前目录开始递归扫描所有文件和目录。假设它是用composer安装的,则可以这样运行:
cd /project/to/migrate/src
/project/to/migrate/vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel
重要说明该工具将不可逆转地修改您的源代码,确保备份所有内容,并在提交前仔细检查结果。
除了自动更改之外,还需要手动迁移一些内容。
重命名读者和作家
当使用IOFactory::createReader(),IOFactory::createWriter()并且 IOFactory::identify(),使用的读/写短名称。更改了它们以及它们相应的类,以消除歧义:
'CSV'
'Csv'
'Excel2003XML'
'Xml'
'Excel2007'
'Xlsx'
'Excel5'
'Xls'
'Gnumeric'
'Gnumeric'
'HTML'
'Html'
'OOCalc'
'Ods'
'OpenDocument'
'Ods'
'PDF'
'Pdf'
'SYLK'
'Slk'
简化的IOFactory
下列方法:
PHPExcel_IOFactory::getSearchLocations()
PHPExcel_IOFactory::setSearchLocations()
PHPExcel_IOFactory::addSearchLocation()
被IOFactory::registerReader()和取代IOFactory::registerWriter()。这意味着IOFactory现在依赖于类的自动加载。
\PHPExcel_IOFactory::addSearchLocation($type, $location, $classname);
\PhpOffice\PhpSpreadsheet\IOFactory::registerReader($type, $classname);
删除过时的东西
工作表:: duplicateStyleArray()