ФорумПрограммированиеPHP для идиотов → удаление первой строки из файла

удаление первой строки из файла

  • webmonstor

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 8 апреля 2012 г. 13:14

    имеется скрипт-пишет инфу построчно в фаил,крайняя запись записывается в нижнюю часть.
    необходимо удалять старые записи оставляя скажем 100 строк в файле
    имеется скрипт удаляющий крайнюю запись в txt , как раз ту которая у меня самая свежая.
    как решить данную проблему:
    -записывать строки так же в нижнюю часть файла и переписать скрипт для удаления верхней,первой строки
    -переписать скрипт и записывать строки в верхнюю часть файла а удаляющий скрипт оставить без изменения?
    ?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 8 апреля 2012 г. 13:43, спустя 28 минут 40 секунд

    как делается ротация логов
    1.log
    2.log
    3.log

    старые файлы архивируются или удаляются
    не всё полезно, что в swap полезло
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 8 апреля 2012 г. 16:19, спустя 2 часа 36 минут 24 секунды

    Самый простой вариант -
    $f = file('my.log');
    $f[] = 'olololololol';
    if (count($f) > 100) unset($f[0]);
    file_put_contents('my.log', join("\n", $f));


    А вообще я вот таким пользуюсь:

    class Log
    {
    /**
    * @static
    * @param string $message
    * @param bool|string $filename
    * @return bool
    */
    public static function write($message, $filename = false)
    {
    if (is_array($message)) $message = serialize($message);
    $filename = APPLICATION_PATH . 'logs/' . (($filename) ? $filename : date("m.d.y")) . '.log';
    $maxSize = Config::get('application', 'log_file_max_size_mb');

    if ($maxSize) {
    $maxSize *= (1024 * 1024);
    if (file_exists($filename) && filesize($filename) > $maxSize) {
    return false;
    }
    }

    $message = date("F j, Y, g:i a") . "::: " .
    str_replace(array("\r", "\n", "\t"), '', trim($message)) . ".\r\n";

    $log = fopen($filename, "ab");
    fseek($log, 0);
    fwrite($log, $message);
    fclose($log);
    return true;
    }

    /**
    * @static
    * @param \Exception $e
    * @return void
    */
    public static function writeException(\Exception $e)
    {
    self::write("Exception: {$e->getMessage()}, at {$e->getFile()}:{$e->getLine()}", 'errors');
    }
    }
  • webmonstor

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 9 апреля 2012 г. 6:48, спустя 14 часов 28 минут 25 секунд

    спасибо за подсказку,буду пробывать
  • webmonstor

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 9 апреля 2012 г. 6:57, спустя 9 минут 40 секунд

    вчера пост не дописал,засыпал =) вот как я пытался решить
    1
    # удаление нужной строки
    $fileName = "1EE.txt";
    $lineToKill = 20;
    $stringsArray = file($fileName);
    if($lineToKill <= count($stringsArray)) {
    $fileHandle = fopen($fileName, "w");
    $lineToKill–;
    foreach($stringsArray as $key => $value) {
    if($key != $lineToKill) fwrite($fileHandle, $value);
    else echo "Строка ".$lineToKill." удалена.";
    }
    fclose($fileHandle);
    }

    вот скрипт удаляет 19-ю строку-меняю на $lineToKill = 0; и делаю break если количество строк менее скажем 100

    ——————
    2
    вот кусочек скрипта записывающий строку в фаил
    file_put_contents("file.txt",$f.':'.$date.':'.$s.':'.$t.':'.$id.':'.$try.':'.$ber.':'.$s.':'.$on."\n",FILE_APPEND);
    установить каретку в начало строки изменив на
    file_put_contents("file.txt",$f.':'.$date.':'.$s.':'.$t.':'.$id.':'.$try.':'.$ber.':'.$s.':'.$on."\r\n",FILE_APPEND);

    но ничего не вышло,если в мыслях проглядывается хоть капля здравого ума прозьба не смеяться =)

  • webmonstor

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 9 апреля 2012 г. 8:54, спустя 1 час 56 минут 14 секунд

    спасибо получилось сделал )

Пожалуйста, авторизуйтесь, чтобы написать комментарий!