1

我一直在开发一个基于 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 包装器可以处理的单元格数量,否则我认为这是一个“无法解决但已知的问题”。

4

1 回答 1

0

在某些情况下,此行中的代码:

$thisSheet = $objPHPExcel->addSheet($myWorkSheet);

$thisSheet将为空,

将以下代码更改为:

if ($thisSheet) {
    for ($k=0;$k<count($myQueryArray);$k++){
        $thisSheet->write(0, $k, $titleList[$myQueryArray[$k]]); //Error on this line
    }
}

以避免错误。

reutuns null的原因$objPHPExcel->addSheet可能是内存使用量达到限制,您可以使用ini_set("memory_limit", -1);将内存使用量设置为无限。

于 2013-11-13T04:19:45.870 回答