2016-04-07 42 views
1

我試圖在我的網站上使用PHP創建一個加密器。我在使用Lua之前創建了同樣的東西,所以我目前正試圖移植它,但是它錯誤地聲稱我耗盡了太多內存,但我不確定可能會導致這種情況:在遞歸函數中分配內存錯誤

function offsetASCII($OrigByte, $Offset) { 
    $OrigByte = $OrigByte + $Offset; 
    if ($OrigByte > $MaxASCII) { 
     return offsetASCII($MinASCII, $OrigByte-$MaxASCII); 
    } else { 
     return $OrigByte; 
    } 
} 

這個想法是它保持數字OrigByte由數字Offset抵銷。如果OrigByte的新值大於最大允許值,則它重複使OrigByte成爲最小允許值的函數,並使偏移量達到最大值的「剩餘」量。這個重複直到它在最大值內,然後它返回它。

錯誤是:

Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 130968 bytes) in [PageDirectoryHere] on line 49

49行是:

return offsetASCII($MinASCII, $OrigByte-$MaxASCII); 

OrigByte可以轉化爲它的ASCII值的任何字母。 MinASCII和MaxASCII是ASCII(65和90)中大寫字母的最小值和最大值。偏移最初是rand($ MinASCII,$ MinASCII + 25)。

我無法理解爲什麼發生這種情況,所以先感謝您的幫助!

+0

在php.ini中增加內存限制 –

+0

爲什麼你要創建一個加密器?它是爲了什麼?因爲你永遠不應該推出你自己的加密。 – st2erw2od

+1

由於我們不知道您使用最佳答案的實際數據的任何信息,我們可以給您的是「因爲PHP已經耗盡了所有可用內存」。 – h2ooooooo

回答

1

解決方案:

function offsetASCII($OrigByte, $Offset, $MinASCII, $MaxASCII) { 
    $OrigByte = $OrigByte + $Offset; 
    if ($OrigByte > $MaxASCII) { 
     return offsetASCII($MinASCII, $OrigByte-$MaxASCII, $MinASCII, $MaxASCII); 
    } else { 
     return $OrigByte; 
    } 
} 

$EncryptedChar = chr(offsetASCII($NowByte, $NewKeyNums[$Iter], 65, 90)); 

我做錯的第一件事就是試圖用$ MinASCII和$ MaxASCII功能的範圍之外(我將其添加爲參數解決)。

我做錯的第二件事是在我調用該函數的範圍之外定義$ MinASCII和$ MaxASCII(我通過輸入它們表示的數字而不是爲它們設置變量來解決)。