致命错误:第15行的C:\xampp\htdocs\main.php中允许的134217728字节内存已耗尽(尝试分配8192字节)

致命错误:第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

我的递归函数有问题。我想等到文本文件输入更改后再重定向到新页面

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

    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()。上面代码中的回音必须是调试跟踪程序;用户不希望文件的无休止副本充斥其浏览器