Обработка файлов на денвере

Тема в разделе "Администрирование серверов", создана пользователем rock2, 31 окт 2010.

Статус темы:
Закрыта.
Модераторы: mefish, stooper
  1. rock2

    rock2 Писатель

    Регистр.:
    6 окт 2010
    Сообщения:
    6
    Симпатии:
    0
    Не могу понять, почему при обработке текстовых файлов денвер отказывается обрабатывать больше 30 метров. Те есть файл размером 100мб, обрабатываю его скриптом (любым) где он пересохраняется в другой файл, и он не превышает 30 метров вместо ожидаемых 100. В php.ini максимальный размер памяти 2гига и время 100000 сек. В чем причина такого поведения?
     
  2. alfaexpert

    alfaexpert

    Регистр.:
    23 июл 2008
    Сообщения:
    183
    Симпатии:
    27
    Код в студию.
    Все зависит от скрипта.
    Память очень легко сожрать на сервере
    PHP:
    <?php
    /// file.txt - 100 метров
    $A=file_get_contnts('file.txt'); /// 100 метров оперативки используется
    $A=$b/// 200 метров используется
    $A=$c/// 300 метров используется
    $A=$d/// 400 метров используется
    ?>
     
  3. rock2

    rock2 Писатель

    Регистр.:
    6 окт 2010
    Сообщения:
    6
    Симпатии:
    0
    А как можно очистить оперативку во время выполнения скрипта?
    Например
    PHP:
    $A=file_get_contnts('file.txt'); /// 100 метров оперативки используется
    $A=$b;
    //дальше $A уже не нужен, очищаем буффер
    только вот ошибок переполнения памяти почемуто не выводится, те скрипты даже не останавливаютя, но пишут не более 30мб
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    во-первых включите error_reporintg(E_ALL)
    во-вторых, код в студию, как вас уже просили.
    Лучше бы если бы свой неработающий код урезали до минимально неработающего(только получение файла, и только запись нового).
    Ведь прочитать файл, и его записать можно далеко не одним способом, и без телепатов трудно сказать, какую вы ошибку допустили

    До версии 5.3 точно никак.
    в версии 5.3 вроде есть функции для высвобождения циклических ссылок. может и для остального также есть
     
  5. rock2

    rock2 Писатель

    Регистр.:
    6 окт 2010
    Сообщения:
    6
    Симпатии:
    0
    PHP:
    $text file_get_contents("d:\txt\1.txt");

    $replace = array(

    "--" => "",
    "---" => ""

    );
    $text strip_tags($text);

    $text strtr($text$replace);

    $text preg_replace("#[\.]{2,5}#isU""."$text);

    $text preg_replace("#[ ]{2,5}#isU"" "$text);

    $text_exp explode("."$text);
      
      foreach (
    $text_exp as $value=>$index)
         {


         if (
    strlen($index)>30)
          {
       
          
    $index ucfirst(trim($index)).".";

          
    $handle fopen("d:\txt\2.txt""a+");
          
    fwrite($handle$index);
          
    fclose($handle);
          }
         }
    error_reporting = E_ALL & E_NOTICE & E_STRICT - ошибок не выдает
     
  6. peter1970

    peter1970 Создатель

    Регистр.:
    28 авг 2008
    Сообщения:
    29
    Симпатии:
    6
    Первая идея - после
    PHP:
    $text file_get_contents("d:\txt\1.txt");
    сделать
    PHP:
    echo strlen($text);
    чтобы посмотреть какой размер у этой переменной.
    Ваша главная ошибка - php не предназначен для работы с такими большими строками и массивами, скорость работы падает на несколько порядков. Правильное решение - открывать файл по частям (fopen - потом в цикле fgets), в каждой части делать разбивку на строки (или какие-то другие завершенные фрагменты) и обрабатывать их по отдельности.
     
  7. dfcbkbq1

    dfcbkbq1 Постоялец

    Регистр.:
    4 май 2009
    Сообщения:
    88
    Симпатии:
    9
    На моем денвере все пучком. исходный файл 1.txt - 90 Мб, конечные файлы 2.txt и 3.txt - такие же.
    Скрипт:
    PHP:
    <?
    $file_in fopen ("1.txt","r");
    $file_out fopen ("2.txt","w");

    while (!
    feof($file_in)) {
       
    $i fgets ($file_in);
        
    fputs ($file_out,$i);
    }
    fclose ($file_in);
    fclose ($file_out);
    //все что выще работает корректно
    //все что ниже тоже

    $file_test_out =  fopen ("3.txt","w");

    $text file_get_contents ("1.txt");
    fputs ($file_test_out,$text);
    ?>
    Как видно из первой части скрипта, размер переменной $i всегда маленький.
    Во второй части скрипта переменная
    $text равна 90 Мб и тже все норм. работает

    P.S. На всякий случай мой php.ini (Денвер базовый + доп модули)
     

    Вложения:

    • php.zip
      Размер файла:
      15,9 КБ
      Просмотров:
      3
Статус темы:
Закрыта.