-2

我正在我的报告网站中的表格上使用 DataTables 服务器端处理。我还使用 PHPExcel 将报告导出到 Excel。我创建用于在浏览器中查看的表格的 php 脚本工作正常,但是当我尝试让 PHPExcel 脚本工作时,我得到一个内存不足错误,例如:

在此处输入图像描述

我可以看到它在同一个地方出错,并且出现同样的错误,就像我试图处理客户端报告时一样。这就是为什么我试图在服务器上做这件事。我四处寻找,但我没有看到任何关于这种情况的信息。

有什么想法我可以尝试吗?

编辑

当我将内存增加到 512 时,我得到了同样的错误,但在不同的地方:

在此处输入图像描述

编辑 2

这不是重复下面提到的问题。我知道我的服务器具有所需的内存,它在将数据呈现给浏览器时使用它。只有当我将相同的数据发送到 PHPExcel 文件时,我才会遇到这个问题。有人提到尝试使用单元缓存,但我不知道 PHPExcel 是什么。这是我第一次尝试使用它。我什至尝试将发送的行数减少到 11 而不是 12,000+,但我仍然收到错误。

更新

经过多次测试,我想我现在知道一些问题所在。

填充浏览器屏幕的初始绘制只是拉回屏幕所需的内容,从 25 开始到 150。当我尝试导出时,它试图拉出所有内容。我目前拥有的最大报告是 65000+ 行和 35 列,尽管我还有更大的报告即将发布。我更新了内存限制,ini_set('memory_limit', '-1');以便它可以使用它需要的任何东西,并且确实如此。

现在它在 300 秒(5 分钟)后超时。我尝试用 修复此问题ini_set('MAX_EXECUTION_TIME', 10);,但这似乎没有做任何事情(我可能设置错误会对此进行更多研究)。

现在虽然我需要找到 PHPExcel 库的哪种缓存方法最有效。我目前正在使用cache_in_memory_gzip,但我也在测试其他人,因为我读到了它们,它们看起来可能更好。完成测试后,我将进行另一次更新或回答问题。

4

1 回答 1

0

我发现了我的问题。我没有正确保存原始 ajax 请求中的排序和过滤条件,因此服务器表中的所有数据都被返回,而不是屏幕上显示的有限结果集。我试图设置这样的cookie setcookie("KeepPost",$PostKept,time() + (60*60*24*7));。但是发现浏览器的 cookie 中可以存储的内容是有限制的(4097mb)。我超过了它,我正在测试的那个有 7800mb +,所以我无法设置 cookie。这导致我的 php 文件使用原始 ajax 请求,该请求在没有任何过滤器的情况下提取所有数据。一旦我意识到这一点,我就更新了我的代码以将我需要的信息发送到服务器,那里的限制要高得多。然后,当我准备好使用时,我就把它拉回来,其他一切正常。这是我的KeepPost.php文件现在看起来像:

<?php

if( isset($_POST['draw']))
{
    include 'DBConn.php';
    //echo "Here";
    //print_r($_POST);
    $KeepPost = $_POST;    
    $KeepPost['length'] = -1;
    $PostKept = serialize($KeepPost);
    $TSQL = "UPDATE PostKept set Value = '" .$PostKept. "'";
    $sth = $conn->prepare($TSQL);
    //print_r($sth);
    $sth->execute();
}

function Convert_From_Array($array)
{
    echo serialize($array);
}
?>

现在我不想拉回 150k + 行,我可以创建 Excel 文件并将其下载到客户端而不会出现问题(只需要大约 30 秒)。

于 2017-01-25T13:11:48.640 回答