为什么 PHP 循环导致 250 次循环后出现禁止页面


Why is PHP loop causing a forbidden page after 250 loops?

已解决:该问题与max_input_vars有关。我使用的服务器有一个名为"Suhosin"的安全框架。有两个值的功能与设置为 1,000 的max_input_vars非常相似。值是"suhosin.post.max_vars"和"suhosin.request.max_vars"。我将它们设置为 5,000,现在一切正常!

---------------


我目前有一个页面使用 PHP 显示一堆图像,它们下面有打印排序选项,并且"while"循环直到显示每个图像。它工作正常,显示每个图像。用户应该选择他们想要打印的内容,然后单击"提交"。这将通过页面提交.php发送表单。提交.php 生成他们通过将数据存储在数组中来选择的内容的列表。然后,该数组被内爆并以文本形式通过电子邮件发送到地址。为每个图像提交四个数组条目。数据使用 $_POST 发送

现在,如果在第一页上选择的图像少于 250 张,则此功能完美。如果选择了 250 个或更多,则"提交.php"页面将变为"禁止"错误页面,并且不会发送电子邮件。

我认为这是因为服务器将其视为无限循环,或者可能与它处理如此多的数组条目有关。我真的需要解决这个问题。有谁知道任何解决方案?

编辑 - 这是提交.php的循环。我知道这可能不是最好的代码,我还在学习。

编辑 2 - 我尝试将max_input_vars更改为 5000,但没有用。我将其添加到我的 PHP.ini 文件中,该行以前不存在。我无法重新启动服务器,因为它是共享主机。还有其他想法吗?

编辑 3 - 好的,已经取得了一些很大的进展。我不再收到禁止页面,但是当循环高于 250 时,电子邮件不会发送。它仍然在 250 <成功发送。>

$imgcount = $_SESSION['imgcount'];
$usercode = $_SESSION['usercode'];
// echo $imgcount . "<br><br>";
$extramessage = $_POST["message"];
$currentcount = 1;

$completeorder = array();
    while ($currentcount <= $imgcount) {
        $x = $_POST["print_amount_" . $currentcount . ""];
        // echo "<b><u>Image " . $currentcount . "</u></b><br>";
        // echo $x[0] . ", " . $x[1] . ", " . $x[2] . ", " . $x[3] . ", " . "<br><br>";
        $y = (string) "Image " . $currentcount . " - " . $x[0] . ", " . $x[1] . ", " . $x[2] . ", " . $x[3] . "
        ";
        // echo $y;
        $completeorder[] = $y;
        // echo $completeorder . "<br><br>";

        $currentcount = $currentcount + 1;
    };
$completeorder = implode( "'n", $completeorder );

你存储了很多变量,也许你达到了你的 php.ini 设置的memory_limit

尝试使用一些调试输出,如下所示:

echo "Memory: ".memory_get_usage(true) . " - PEAK: ".memory_get_peak_usage(true) . " MAX: ".ini_get("memory_limit");

但奇怪的是,你得到了一个禁止的页面......即使达到 php 或ini_settings的某些限制,您通常也会获得浏览器可见输出的Error 500 Internal Server Error(仅在启用display_errors的情况下(。

因此,也可能是,您的网络服务器对禁止页面的回答有某种限制。

已解决:该问题与max_input_vars有关。我使用的服务器有一个名为"Suhosin"的安全框架。有两个值的功能与设置为 1,000 的max_input_vars非常相似。值是"suhosin.post.max_vars"和"suhosin.request.max_vars"。我现在已经将它们设置为 5,000,现在一切正常!

max_input_vars,suhosin.post.max_vars 和 suhosin.request.max_vars 都默认为 1000。要检查它们的设置,请执行以下命令:

phpinfo((;

然后按 CTRL + F 并查找这些设置以查看它们的设置。您可能没有任何"suhosin"设置。如果简单地更改max_input_vars不起作用,请按 CTRL + F 表示"1000",看看值为 1000 的任何内容是否与"post"或"vars"或任何会限制最大变量的内容有关。