为啥 PHP 循环在 250 次循环后会导致禁止页面?

Posted

技术标签:

【中文标题】为啥 PHP 循环在 250 次循环后会导致禁止页面?【英文标题】:Why is PHP loop causing a forbidden page after 250 loops?为什么 PHP 循环在 250 次循环后会导致禁止页面? 【发布时间】:2013-10-17 23:39:19 【问题描述】:

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

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


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

发送数据

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

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

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

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

编辑 3 - 好的,已经取得了一些重大进展。我不再收到禁止页面,但是当循环高于 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 );

【问题讨论】:

Too Many Post Data variables? 的可能重复项“有一个名为 max_input_vars 的 PHP 设置,默认为 1000。” 你能分享你的代码吗? 你能把你的php循环的代码贴出来吗? 我尝试将 max_input_vars 行添加到我的 php.ini 中,因为它不存在并将其设置为 5000,但它不起作用。我现在将代码添加到我的原始帖子中。 @JacinTattersall 您可能需要在编辑配置文件后重新启动服务器。太巧合了,249 * 4 + 其他一些字段 1000。 【参考方案1】:

你存储了很多变量,也许你到达了你的 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 时)。

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

【讨论】:

已经尝试增加 memory_limit 但它没有解决问题。我现在正在与我的托管公司进行实时支持聊天,该人说他已经确定了问题的原因,但需要看看他是否可以解决它。必须是服务器设置,而不是代码问题。【参考方案2】:

已解决:该问题与 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”或任何会限制您的最大变量的内容相关。

【讨论】:

以上是关于为啥 PHP 循环在 250 次循环后会导致禁止页面?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这会导致无限请求循环?

java在循环语句的执行语句赋予变量值循环结束后会释放吗?

为啥python 3在while循环之后禁止if-condition? [关闭]

为啥for循环在c中无限进行

在 R 的 for 循环中计算均值

为啥在循环开始时调用 requestAnimationFrame 不会导致无限递归?