1

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

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

我猜测终止是由于我的 HTTP 连接重置并且服务器不再为我的请求提供服务时引起的。

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

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

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();

?>
4

5 回答 5

2

你可以从命令行运行它......你最终会由于缺乏资源而停止。

从命令行运行将使您不必执行我的帖子之前提到的 ini_set。(见:http ://www.php.net/manual/en/info.configuration.php#ini.max-execution-time )

于 2013-02-07T15:24:46.420 回答
2

结尾永远不会打印,因为您处于while(1)循环中,因此永远不会到达之后的语句。您的脚本可能由于您php.ini对变量的设置而终止max_execution_time

编辑:尝试使用函数set_time_limit() http://de2.php.net/manual/en/function.set-time-limit.php能够增加脚本中的时间。

于 2013-02-07T15:25:35.607 回答
1

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

于 2013-02-07T15:23:41.583 回答
1

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

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

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

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

于 2013-02-07T15:48:31.690 回答
0

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

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

于 2013-02-07T15:25:39.457 回答