Есть такой код который пожирает память привожу часть Код (Text): $tmpfname = DIR_DOCUMENT_ROOT . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt"; $fp = fopen( $tmpfname, "w+"); $filestring =''; $fileline=0; $row = mysql_fetch_array($result); while ($row){ $row = ep_row($row); $therow = ''; foreach( $filelayout as $key => $value ){ $thetext = $row[$key]; $thetext = str_replace("\r",' ',$thetext); $thetext = str_replace("\n",' ',$thetext); $thetext = str_replace("\t",' ',$thetext); $therow .= $thetext . $separator; } $therow = substr($therow,0,strlen($therow)-1) . $endofrow; $filestring .= $therow; $fileline++; if ($fileline==800){ //******************************* // PUT FILE IN TEMP DIR //******************************* fwrite($fp, $filestring); fclose($fp); echo "memory_get_usage()=".memory_get_usage()."<br>"; echo "You can get your file in the Tools/Files under " . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt<br>"; $filenum++; $tmpfname = DIR_DOCUMENT_ROOT . TEMP_DIR . EXPORT_TIME."_".$filenum.".txt"; $fp = fopen( $tmpfname, "w+"); $filestring =''; $fileline=0; } $row = mysql_fetch_array($result); } функция ep_row() довольна большая поэтому не привожу. но она перебирает и модифицирует элементы массива $row в своей работе использует некоторые global переменные (не изменяет их) и обращается к базе данных. результат работы этого скрипта получается вот такой line 723 это Код (Text): $filestring .= $therow; подскажите как мне отследить куда девается память. я уже в функции убрал почти что всё что возможно. память же должна освобождаться по завершении функции.
Ну, собственно, в цикле while каждый раз вызывается функция ep_row. А посмотреть, что, собственно, это за ф-я, или хотя бы рассказ - что она делает?
Я не знаю, что делает этот скрипт и для чего он, но что-то мне подсказывает, что алгоритм у него ой какой фиговый. 1. Я не знаю, что такое $filelayout, и почему в нем меняются спецсимволы функцией, которая повторяется 3 раза. 2. Догадsваюсь, для чего это $therow = substr($therow,0,strlen($therow)-1) . $endofrow; но предполагаю, что есть способ лучше. 3. "$row в своей работе использует некоторые global переменные (не изменяет их) и обращается к базе данных." Обращаться в БД в цикле -- крайний вариант. Что предлагаю: 1. Записывать в файл не все 800 строк через fwrite, а по 1 строке в цикле (обрабатывать соответственно тоже) 2. Воспользоваться встроенной в Mysql функцией записи в файл.
HDMan Память не высвобождается и после завершения работы скрипта? Если да - только обновлять версию PHP. Ну и как тупейший обходной путь - попробовать вместо $a.=$b - $a=$a.$b;