致命错误:第15行的C:\xampp\htdocs\main.php中允许的134217728字节内存已耗尽(尝试分配8192字节)
我的递归函数有问题。我想等到文本文件输入更改后再重定向到新页面 15号线是致命错误:第15行的C:\xampp\htdocs\main.php中允许的134217728字节内存已耗尽(尝试分配8192字节),php,Php,我的递归函数有问题。我想等到文本文件输入更改后再重定向到新页面 15号线是 $readedData = fread($myfile,filesize("my1.txt")); 这是我的职责 first(); function first() { $myfile = fopen("my1.txt", "r") or die("Unable to open file!"); $number = fread($myfile,filesize("my1.txt")); fc
$readedData = fread($myfile,filesize("my1.txt"));
这是我的职责
first();
function first() {
$myfile = fopen("my1.txt", "r") or die("Unable to open file!");
$number = fread($myfile,filesize("my1.txt"));
fclose($myfile);
recursion($number);
}
function recursion($number2) {
$myfile = fopen("my1.txt", "r") or die("Unable to open file!");
$readedData = fread($myfile,filesize("my1.txt"));
echo ($readedData );
fclose($myfile);
if($number2 != $readedData){
return (recursion($readedData));
}
else if($number2 == $readedData){
return(first());
}
}
是的,您的递归是没有边界的,它不断地调用越来越深。等待条件通常由条件循环处理,而不是自递归 first()总是调用recursion() 递归()调用自身,或调用first()。它总是调用递归() 你看到问题了——这些调用永远不会结束,它们总是调用递归()。每次调用都会分配堆栈空间以便能够运行,直到达到最大配置限制(默认情况下为130MB,这也是您报告的错误) 编辑:php没有像javascript那样的setInterval(),在php中,递归调用是真正的递归调用,它们不只是排队等待一个可连续的对象。要等待文件在循环中更改,可以执行以下操作:
function waitAndRedirect( $filename ) {
waitForchange(file_get_contents($filename));
handleRedirect();
}
function waitForChange( $oldData ) {
while (true) {
$currentData = file_get_contents($filename);
if ($currentData !== $oldData) return;
else usleep(200);
}
}
我将使用该函数而不是fread
,echo
,fclose
至于实际的递归逻辑,看起来您正在经历一个无限循环first()
调用recursion()
它再次调用first()
。所以它会一直循环直到你达到内存限制
尝试替换
return(first())代码>带有返回()代码>您所说的“等待文本文件输入更改”是什么意思?谁正在更改输入文件
在代码中,您没有设置任何停止条件
first()
将在任何情况下调用recursion()
,而recursion()
将调用recursion()
或first()
。这两个函数在调用任何一个函数时都不会停止。在每个函数中,您必须分配$readedData
,$number
,$number2
,但没有任何内容被释放。
这就是为什么你的记忆力会耗尽
请定义“等待文本文件输入更改”,并提供输入文件的内容,以便我们进一步讨论或帮助改进代码。脚本中是否有可能使用1.3 GB的内容?它看起来不像在这里。它是134 MB而不是1.3 GB。检查你的php.ini设置。谢谢Ben,看起来好多了(格式化)。ini设置很可能是默认的128MB(134m),1.3GB是一个错误解析,我想等到文本文件更改。这可以做到,但上面的错误出现了。java脚本中是否有类似于setintervel
的关键字?请参见上面的编辑。在php中,必须使用阻塞调用进行编程,递归总是进行即时调用,而不像javascriptyou所说的get_file_contents()。上面代码中的回音必须是调试跟踪程序;用户不希望文件的无休止副本充斥其浏览器