2014-12-03 26 views
0

我有問題,我的遞歸函數。我想等到文本文件輸入更改後重定向到新頁面。致命錯誤:用盡134217728個字節允許存儲器大小(試圖分配8192個字節)在C: XAMPP htdocs中 main.php第15行

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()); 
    } 
} 
+0

腳本中是否有可能使用1.3 GB的地方?它看起來不像在這裏。 – wallyk 2014-12-03 06:05:06

+0

它是134 MB而不是1.3GB – saada 2014-12-03 06:08:18

+0

檢查您的php.ini設置。 – 2014-12-03 06:21:34

回答

2

是的,你做什麼,你的遞歸是無界,它不斷給你打電話越陷越深。等待條件通常使用條件循環來處理,而不是自遞歸。

第()總是調用遞歸()

遞歸()調用自身,或者首先調用()。它總是調用遞歸()。

你看到的問題 - 這些電話永遠不會結束,他們總是調用遞歸()。每個調用分配堆棧空間以便能夠運行,直到達到最大配置的限制(默認情況下爲130MB,這也是您的錯誤報告)

編輯:php沒有setInterval()類似javascript,並在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); 
    } 
} 
+0

我想等到文本文件更改。這可以做到這一點,但以上錯誤出來。在java腳本中是否有像'setintervel'這樣的關鍵字? – 2014-12-03 06:17:16

+0

請參閱上面的編輯。在PHP中,必須使用阻塞調用進行編程,並且遞歸總是會立即調用,而不是像在JavaScript中指定get_file_contents()那樣使用 – Andras 2014-12-03 06:29:30

0

我會用readfile()函數,而不是freadechofclose

至於實際的遞歸的邏輯,好像你正在經歷一個無限循環。 first()調用recursion(),再次調用first()。所以它會永遠循環直到你達到內存限制。

嘗試return();

+0

。上面代碼中的回顯必須是一個調試跟蹤器;用戶不希望文件的無休止的拷貝洪泛他們的瀏覽器 – Andras 2014-12-03 06:33:17

0

更換return(first());你說的「等到文本文件輸入變化」是什麼意思?誰在更改輸入文件?

在您的代碼,您沒有設置任何停止條件。

first()將調用在任何情況下recursion()recursion()要麼調用recursion()first()。一旦你打電話給他們中的任何一個,這兩個功能都不會停下來。並且在每個函數中,您必須分配$readedData,$number,$number2,但沒有任何內容會被釋放。 這就是爲什麼你的記憶會被耗盡。

請定義「等到文本文件輸入變化」,並提供輸入文件的內容,因此我們可以進一步討論或有助於改善代碼。

相關問題