为什么我的 PHP 脚本不在服务器上处理,而我有其他脚本在处理?
Why doesn't my PHP script process on the server when I have others that do?
我在我的报告网站中的表格上使用 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
,但我也在测试其他的,因为我读到了它们,它们看起来可能更好。我会在完成测试后再次更新或回答问题。
我发现了我的问题。我没有正确保存原始 ajax 请求的排序和过滤条件,因此返回了服务器 table 的所有数据,而不是屏幕上显示的有限结果集。我试图设置这样的 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 秒)。
我在我的报告网站中的表格上使用 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
,但我也在测试其他的,因为我读到了它们,它们看起来可能更好。我会在完成测试后再次更新或回答问题。
我发现了我的问题。我没有正确保存原始 ajax 请求的排序和过滤条件,因此返回了服务器 table 的所有数据,而不是屏幕上显示的有限结果集。我试图设置这样的 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 秒)。