Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти в PHP. Да или нет? fopen+clearstatcache+fread+fwrite 
V
    Опции темы
satrap
  Дата 29.2.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Вот такой простой код:
Код
<?php

set_time_limit(120); // на всякий случай

function test_change($filename) {
    $handle = fopen($filename, "r+");
    clearstatcache();
    $filesize = filesize($filename);
    if ($filesize)
        $data = fread($handle, $filesize);
    else $data = 0;
    ftruncate($handle, 0);
    fwrite($handle, $data);
    fclose($handle);
}

$filename = 'file.txt';
$i = 0;

file_put_contents($filename, $i);
while ($i++ < 10000 ) {
    test_change($filename);
}

echo "Done\n";

?>

вызывает у меня ошибку 
Код
Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217729 bytes) in blablabla.php on line 10


При этом самое интересное то, что если убрать из кода вызов clearstatcache(), или использовать константу вместо $filesize в fread() или константу вместо $data в fwrite() - ошибка исчезает. Может я что-то делаю неправильно?

П.С. Windows XP SP2, PHP 5.2.4

Это сообщение отредактировал(а) satrap - 29.2.2008, 11:19
PM MAIL   Вверх
solenko
Дата 29.2.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



А размер файла какой? Неужто не больше 134217728 bytes -- лимита, который выставлен в php.ini

Предугадывая следуюший вопрос -- ini_set )


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
satrap
Дата 29.2.2008, 12:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Точно! Я просто ступил: ftruncate($handle, 0) не переводит файловый указатель на начало файла и в документации об этом ни слова. Нужно использовать fseek. Так что топик можно переименовывать в "Утечка мозгов 2.0".

Спасибо solenko. ini_set тут не причем.
PM MAIL   Вверх
solenko
Дата 29.2.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



satrap, причем. Просто телепатия не сработала ) с пом. ini_set можно изменить лимит памяти.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.