我一直在开发一个基于 Web 的应用程序来通过 PHP 导出数据库信息。该应用程序的原始版本最初生成单个 OpenXML 工作表,但遇到了超出一定行数(大约 9500 行),生成的工作表太大而无法导入 Excel 或 OpenOffice 的问题。
我随后重新设计了应用程序以使用 libxl 的 php_excel 包装器,该包装器在测试中工作得很好,但是当部署到实时服务器(与测试服务器相比,它的数据量更大)时,进程的内存使用量会达到略低于 2GB 然后失败,出现此错误:
Call to a member function write() on a non-object in...etc etc.
现在,有趣的是代码适用于较小的数据集,如果我限制请求的数据量,我可以从数据库收集部分数据转储。根据所有调查,当代码尝试引用未分配的对象时会发生此错误。下面是代码:
$objPHPExcel = new ExcelBook($rcn, $rcl, true);
for ($i=0;$i<$myCCount;$i++){
$myPCount = count($mySelection[$i])
for ($j=1;$j<$myPCount;$j++){
$myWorkSheet = $myAccountSelection[$i][0] . ' - ' . $myAccountSelection[$i][$j];
$thisSheet = $objPHPExcel->addSheet($myWorkSheet);
for ($k=0;$k<count($myQueryArray);$k++){
$thisSheet->write(0, $k, $titleList[$myQueryArray[$k]]); //Error on this line
}
//The rest is database queries and spreadsheet generation.
再次,我想重申,这适用于较小的数据集(相同的行数,更少的列,或相同的列数,但更少的行),并且在出错之前将运行大约 15 分钟。
根据要求,一个完整的数据转储将生成最多 924 个工作簿(减去没有实际条目的工作簿),每个工作簿中的大约 360 列包含总共 10,000 多行。
谁能帮我确定在这种情况下实际存在什么问题?
编辑更新:在对 php_excel 包装器的错误处理(例如)进行了一些记录和挖掘之后,我确定问题确实是内存分配限制被击中 - 在包装器本身内。在这种情况下,PHP 或 FastCGI 或机器其余部分可用的可用内存量无关紧要,因为一旦达到一定量(我目前正在尝试确定限制是多少) )。除非有人可以教我如何提高 phpexcel 包装器可以处理的单元格数量,否则我认为这是一个“无法解决但已知的问题”。