За последние 24 часа нас посетили 18023 программиста и 1651 робот. Сейчас ищут 1709 программистов ...

Помогите разобраться с пожиранием памяти.

Тема в разделе "PHP для новичков", создана пользователем HDMan, 16 дек 2008.

  1. HDMan

    HDMan Активный пользователь

    С нами с:
    28 ноя 2008
    Сообщения:
    6
    Симпатии:
    0
    Есть такой код который пожирает память
    привожу часть
    Код (Text):
    1.  
    2. $tmpfname = DIR_DOCUMENT_ROOT . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt";
    3. $fp = fopen( $tmpfname, "w+");
    4. $filestring ='';
    5. $fileline=0;
    6. $row = mysql_fetch_array($result);
    7.  
    8. while ($row){
    9.     $row = ep_row($row);
    10.     $therow = '';
    11.     foreach( $filelayout as $key => $value ){
    12.         $thetext = $row[$key];
    13.         $thetext = str_replace("\r",' ',$thetext);
    14.         $thetext = str_replace("\n",' ',$thetext);
    15.         $thetext = str_replace("\t",' ',$thetext);
    16.         $therow .= $thetext . $separator;
    17.     }
    18.     $therow = substr($therow,0,strlen($therow)-1) . $endofrow;
    19.     $filestring .= $therow;
    20.     $fileline++;
    21.     if ($fileline==800){
    22.         //*******************************
    23.         // PUT FILE IN TEMP DIR
    24.         //*******************************
    25.         fwrite($fp, $filestring);
    26.         fclose($fp);
    27. echo "memory_get_usage()=".memory_get_usage()."<br>";
    28.         echo "You can get your file in the Tools/Files under " . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt<br>";
    29.         $filenum++;
    30.         $tmpfname = DIR_DOCUMENT_ROOT . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt";
    31.         $fp = fopen( $tmpfname, "w+");
    32.         $filestring ='';
    33.         $fileline=0;
    34.     }
    35.     $row = mysql_fetch_array($result);
    36. }
    функция ep_row() довольна большая поэтому не привожу. но она перебирает и модифицирует элементы массива $row в своей работе использует некоторые global переменные (не изменяет их) и обращается к базе данных.

    результат работы этого скрипта получается вот такой
    line 723 это
    Код (Text):
    1. $filestring .= $therow;
    подскажите как мне отследить куда девается память.
    я уже в функции убрал почти что всё что возможно. память же должна освобождаться по завершении функции.
     
  2. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Ну, собственно, в цикле while каждый раз вызывается функция ep_row.
    А посмотреть, что, собственно, это за ф-я, или хотя бы рассказ - что она делает?
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я не знаю, что делает этот скрипт и для чего он, но что-то мне подсказывает, что алгоритм у него ой какой фиговый.
    1. Я не знаю, что такое $filelayout, и почему в нем меняются спецсимволы функцией, которая повторяется 3 раза.
    2. Догадsваюсь, для чего это $therow = substr($therow,0,strlen($therow)-1) . $endofrow; но предполагаю, что есть способ лучше.
    3. "$row в своей работе использует некоторые global переменные (не изменяет их) и обращается к базе данных." Обращаться в БД в цикле -- крайний вариант.

    Что предлагаю:
    1. Записывать в файл не все 800 строк через fwrite, а по 1 строке в цикле (обрабатывать соответственно тоже)
    2. Воспользоваться встроенной в Mysql функцией записи в файл.
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    HDMan
    Память не высвобождается и после завершения работы скрипта?
    Если да - только обновлять версию PHP.
    Ну и как тупейший обходной путь - попробовать вместо $a.=$b - $a=$a.$b;