我正在尝试通过在线运行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();
?>
答案 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
文件中,脚本可以使用脚本执行/内存的时间有限制。