PHP服务器停止我的循环。为什么?

时间:2013-02-07 15:21:06

标签: php loops

我正在尝试通过在线运行PHP脚本并评估所有数字来验证3x + 1 problem

我有一个无限循环运行,但是当值达到约35,000时,服务器停止循环。

我猜测当我的HTTP连接重置并且服务器不再服务我的请求时会导致终止。

我想让它尽可能长时间运行,如果它想吃掉服务器的资源。我该怎么做? Cronjobs?

这是脚本,永远不会打印“结束”。

class Collatz_Verify
{
    public function Collatz_Verify()
    {
        // open output file
        $file = 'verified_nums.txt';
        $outFile = fopen($this->NUMBERS_FILENAME, 'a');
    }

    public function verify()
    {
        $num = 0;
        while(1)
        {
            $num += 1;
            # call collatz!!
            if($this->collatz($num) == 1)
                   fwrite($this->outFile, $num);
        }
        print "ah, crap! End!";
    }

    public function collatz($num)
    {
        if ($num == 1)
            return 1;
        if (($num % 2) == 0)
            return $this->collatz($num/2);
        else
            return $this->collatz((3*$num) + 1);
    }
}


// Fire away!
$ver = new Collatz_Verify();
$ver->verify();

?>

5 个答案:

答案 0 :(得分:2)

你可以从命令行运行它......但是你最终会因资源不足而停止。

从命令行运行将阻止您在发布之前提到的ini_set。 (见:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

答案 1 :(得分:2)

结束永远不会打印,因为您处于while(1)循环中,因此永远不会达到之后的声明。 由于您在变量php.ini

max_execution_time中进行了设置,因此您的脚本可能已停止

修改:尝试使用set_time_limit() http://de2.php.net/manual/en/function.set-time-limit.php功能来增加脚本中的时间。

答案 2 :(得分:1)

php有max_execution_time限制,如果你想让它运行更长时间,你可以试试 ini_set('max_execution_time',100); //将100替换为您希望它能够运行多少秒

答案 3 :(得分:1)

PHP停止执行循环有两个可能的原因。

首先是达到执行时间限制。 第二个是达到最大嵌套级别(由于collatz()中的递归)。

最大嵌套级别为100(我不知道改变它的方法)。默认执行时间限制为30秒。你可以增加它,正如其他答案所示。

要找出脚本停止的原因,应将显示错误设置为on和/或检查Web服务器的错误日志。您还可以检查输出文件并从上一个成功的号码开始。因此,如果输出文件中的最后一个数字是34998,则将行$num = 0;更改为$num = 34998;

答案 4 :(得分:0)

PHP.ini文件中,脚本可以使用脚本执行/内存的时间有限制。

有关详细信息,请参阅http://php.net/manual/en/info.configuration.php