簡體   English   中英

PHP中的內存泄漏

[英]Memory leak in php

我在理解為什么我的代碼的這一部分導致內存泄漏時遇到問題:

for($i=0; $i<count($values); $i++){
        $values[$i] = addslashes($values[$i]);
}

為了將代碼放在上下文中,我有一個先前構建的數組,稱為值,該數組具有要插入數據庫中的所有值。 所有字段都是字符串,因此我需要對它們全部進行轉義,對於此應用程序,addslashes或mysql_real_escape_string是imo的不錯選擇。

現在奇怪的是,一旦我添加了上面顯示的部分,就會收到如下消息:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes)

我知道這會導致內存泄漏,但我不知道為什么。

挖掘一下,我注釋掉了for循環中的唯一一行,僅出於好奇而保留了for語句,並且泄漏消失了。 有什么想法可能意味着什么?

PS:字符串都是UTF8編碼的,這可能是個問題嗎?

編輯:

該數組包含以下內容:

Array ( 
    [dossier] => 002A 
    [permis] => 
    [adresse] => 18, rue Bellevue
    [ville] => Ste-Anne-des-Lacs (Québec)
    [province] =>
    [code_postal] => J0R 1B0
    [numero_centrale] => N/A
    [routes] => De la Gare, droite chemin Avila jusqu'au bout et droite chemin Ste-Anne-des-lacs sur 1,8 km et droite sur Bellevue.
) 

您的數組具有字符串鍵,但是您正在檢查/分配數字鍵。 就像@nickb指出的那樣,每次添加數字鍵時, count($values)增加1,因此會有無限循環。 因此,內存耗盡。

檢查調試器,或者更好的方法是,切換到foreach循環或array_*函數之一( array_walk()array_map()等,具體取決於您要執行的操作)。

@Jeremy正確地指出您不應該使用addslashes()來轉義字符串。 查看mysqli_real_escape_string() (正如他所建議的),或者更好的是,請考慮使用PDO

嘗試改用array_walk

另外,不要指望每個循環。 在將計數放入循環條件中之前獲取計數。 由於這是針對數據庫的,因此您實際上應該使用: mysqli_real_escape_string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM