|
|
|
| Скажите, можно ли вывести 5 строк с конца файла?
И как отразится на системе, если файл занимает 300мб? | |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 19:27)
| | 5 строк очень просто, считать содержимое в массив, посчитать количество элементов в массиве и в цикле вывести
$array = file("file.txt");
$t = count($array) - 1;
$i = 1;
while($i <= 5)
{
if($t === 0) break;
echo $array[(--$t)];
++$i;
}
... 300мб - это много... Php вообще тормознутый... | |
|
|
|
|
|
|
|
для: Вот случайно зашел
(25.08.2009 в 19:40)
| | Как именно считать 5 строк? | |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 19:42)
| | В чём причина столь странной выборки?
Что содержится в этом файле?
И уж точно я бы не стал "отжирать" 300 мб оперативки.
уж лучше как вариант сделать буфер на 5 строк и читать в него построчно от начала файла, по достижении конца файла у вас в буфере останется как раз пять последних строк. | |
|
|
|
|
|
|
|
для: Valick
(25.08.2009 в 19:55)
| | да что ж сегодня за вечер-то такой...
Была охота Вам просматривать Все 300 Мб, когда можно отсчитать от конца 5*MaxLineLength! | |
|
|
|
|
|
|
|
для: Trianon
(25.08.2009 в 20:05)
| | :)
да погодите Вы, ключевое слово в моём ответе уж лучше
пусть сначала, девушка ответит на мой вопрос) | |
|
|
|
|
|
|
|
для: Valick
(25.08.2009 в 20:06)
| | ну-ну. | |
|
|
|
|
|
|
|
для: Valick
(25.08.2009 в 19:55)
| | Есть filesize и seek можно установить указатель на конец файла... | |
|
|
|
|
|
|
|
для: Вот случайно зашел
(25.08.2009 в 20:07)
| | не я ведь предложил плюнуть 300 мегов (!) в оперативку | |
|
|
|
|
|
|
|
для: Вот случайно зашел
(25.08.2009 в 20:07)
| | не нужен здесь filesize ни разу. | |
|
|
|
|
|
|
|
для: Trianon
(25.08.2009 в 20:12)
| | fsееk($handler, SEEK_END) | |
|
|
|
|
|
|
|
для: Trianon
(25.08.2009 в 20:12)
| | Дуглас Адамс, "Автостопом по Галактике"... Тонкий английский юмор в научной фантастике(?)... Надо будет как-нибудь еще почитать... | |
|
|
|
|
|
|
|
для: Вот случайно зашел
(25.08.2009 в 20:07)
| | в файл записываются запросы юзеров
<?
$base = join('',file("base.txt"));
$base = ereg("".strip_tags($q)."", "$base");
if($base == false)
{
$zapros = fopen("base.txt","a");
fwrite($zapros,"".strip_tags($q)."\r\n");
fclose($zapros);
}
?>
|
И нужно просто вывести 5 последних запросов | |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 20:13)
| | на сколько часто записываются? и насколько часто читаются 5 последних строк?
а вообще тут БД напрашивается | |
|
|
|
|
|
|
|
для: Valick
(25.08.2009 в 20:15)
| | БД не хочется... как часто, ну примерно раз в 5 минут | |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 20:24)
| | Кроме этого ничего в голову не пришло. Не привык я много думать...
$base = "base.txt";
$f = fopen($base, r);
$limit = filesize($base);
$len = 10000;
fseek($f, $limit - $len);
$string = fread($f, $len);
$array = explode("\r\n", $string);
$array = array_reverse($array);
foreach($array as $v)
{
if($i == 5) break;
echo $v."<br />";
} | |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 20:24)
| | Кроме этого ничего в голову не пришло. Не привык я много думать...
$base = "base.txt";
$f = fopen($base, "r");
$limit = filesize($base);
$len = 10000;
fseek($f, $limit - $len);
$string = fread($f, $len);
$array = explode("\r\n", $string);
$array = array_reverse($array);
$i = 0;
foreach($array as $v)
{
if($i == 5) break;
echo $v."<br />";
++$i;
}
|
| |
|
|
|
|
|
|
|
для: Лена Смирнова
(25.08.2009 в 20:24)
| | БД не хочется...
это очень зря, ну да ладно
Я вам предлагаю, использовать два файла
В первый (рабочий) вы пишите запрос, и как только количество запросов в файле равно пяти, то переносите первую строку во второй файл (архив). В итоге рабочий файл содержит 5 последних запросов.. читайте сколько угодно и как угодно. | |
|
|
|
|
автор: Юлька (25.08.2009 в 22:15) |
|
|
для: Valick
(25.08.2009 в 21:43)
| | А как сделать с аналогичной задачей, только мне надо хранить не все, как Лене, а только 5 запросов. Как сделать, так чтобы в файле они просто заменялись? | |
|
|
|
|
|
|
|
для: Юлька
(25.08.2009 в 22:15)
| | А вот тут проще всего считать файл в массив, сделать с ним всё что хочется (удалить заменить нужные строки) и перезаписать в файл. И раз уж вы все тут на файлах помешались, то не забывайте про блокировку, а не то будет вам несчастье. | |
|
|
|
|
автор: Юлька (25.08.2009 в 22:50) |
|
|
для: Valick
(25.08.2009 в 22:32)
| | Покажите пожалуйста кодом с блокировкой | |
|
|
|
|
автор: Юлька (25.08.2009 в 22:51) |
|
|
для: Valick
(25.08.2009 в 22:32)
| | Покажите пожалуйста кодом с блокировкой | |
|
|
|
|
|
|
|
для: Юлька
(25.08.2009 в 22:51)
| |
<?php
// Функция чтения файла
function read_file_func($file)
{
// Открываем файл если он существует
if(file_exists($file))
{
$f=fopen($file, "r+t") or die("Невозможно открыть файл");
// Блокируем файл (разделяемая блокировка)
flock($f, LOCK_SH); // ждём завершения процесса записи
// В файл теперь никто не пишет, можно читать
$cont=explode("\n",fread($f,filesize($file))); // считываем файл
fclose($f); // закрываем файл
}
else
{
$cont="Файл не существует";
}
// Возвращаем значение
return $cont;
}
?>
|
Вот так можно читать файлы небольшого размера
____
упс... забыл проверить пустой файл или нет | |
|
|
|
|
|
|
|
для: Юлька
(25.08.2009 в 22:51)
| | вот так, но возможно где-то что-то упустил.
работас файлами на самом деле большой геморрой, зря вы и Лена не хотите юзать БД
<?php
// Функция чтения файла
function read_file_func($file){
// Открываем файл если он существует
if(file_exists($file))
{
$f=fopen($file, "r+t") or die("Невозможно открыть файл");
// Блокируем файл (разделяемая блокировка)
flock($f, LOCK_SH); // ждём завершения процесса записи
// В файл теперь никто не пишет, можно читать
if(filesize($file)>0){
$cont=explode("\n",fread($f,filesize($file))); // считываем файл
}
fclose($f); // закрываем файл
}
else
{
$cont="Файл не существует";
}
// Возвращаем значение
return $cont;
}
// Функция записи в файл
function count_write($filename,$peremennaya) {
// Создаём файл если он не существует
// ни в коем случае не используем w или w+
if(!file_exists($filename))
{
fclose(fopen($filename, "a+t"));
}
// Открываем файл для чтения и записи в режиме r+t
// некоторые версии FreeBSD имеют проблемы с режимом а+
// и не могут установить указатель на начало файла при помощи fseek
$f=fopen($filename, "r+t") or die("Невозможно открыть файл");
// Блокируем файл (блокировка с запретом "подвисания")
while(!flock($f, LOCK_EX+LOCK_NB))
{
sleep(1); // ждём одну секунду
}
// Файл заблокирован, можно производить запись
$cont=array();
if(filesize($filename)>0){
$cont=explode("\n",fread($f,filesize($filename))); // считываем файл
}
array_unshift($cont,$peremennaya);
ftruncate($f,0); // очищаем файл
fseek($f,0,SEEK_SET); // переводим указатель в начало файла
$k=0;
foreach($cont as $value){
if($k>4) break;
if($value != ""){
fwrite($f,$value."\n"); // записываем новое значение
$k++;
}
}
fclose($f); // закрываем файл
}
count_write("text.txt",rand(200,500));
print_r (read_file_func("text.txt"));
?>
|
| |
|
|
|