[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сохранение строчьки в верх файла.
Гость_Dima85
Возможно я плохо искал. Но я не нашел ответа с помощью поиска на этом сайте.
Помогите пожалуйста разобраться как сохранить строчку в верх файла.

Тоесть таким образом у меня сохраняется новая запись(строчка) в конец файла:

$fd = fopen ($api_file, "a+"); 
fwrite ($fd, $config_text);
fclose ($fd);



А каким образом можно сохранять строчку в верх файла?
Покажите пожалуйста на примере.


Сам файл такого содержимого:
Имя,Ник,Пароль,Телефон
Имя,Ник,Пароль,Телефон
Имя,Ник,Пароль,Телефон
Имя,Ник,Пароль,Телефон




Спустя 2 минуты, 9 секунд (2.09.2010 - 01:39) Guest написал(а):
Извиняюсь за повторное сообщение, в файле не более 1000 строк. Тоесть размер достаточно маленький...

Спустя 5 часов, 39 минут, 43 секунды (2.09.2010 - 07:19) Basili4 написал(а):
Читаешь файл в массив добовляешь в начало массива эл. и сбрасываешь его на диск

Спустя 2 часа, 25 минут, 21 секунда (2.09.2010 - 09:44) Гость_Dima85 написал(а):
Покажите пожалуйста на примере.

Спустя 1 час, 4 минуты, 8 секунд (2.09.2010 - 10:48) Basili4 написал(а):
<?php
$filename='dadad';
$file=file($filename);

array_unshift($file,'qdqwdqwdqw');


if (is_writable($filename))
{

if (!$handle = fopen($filename, 'a')) {
echo "Не могу открыть файл ($filename)";
exit;
}


foreach ($file as $val)
{
if (fwrite($handle, $val) === FALSE) {
echo "Не могу произвести запись в файл ($filename)";
exit;
}
}



fclose($handle);

} else {
echo "Файл $filename недоступен для записи";
}
?>


Как то так но проверить надо не проверял

Спустя 45 минут, 15 секунд (2.09.2010 - 11:33) Гость_Dima85 написал(а):
Добавляя новую запись, скрипт дублирует старые записи. Тоесть добавляет целиком тоже самое еще в конец файла (Но в этот дубликат вверх добавляет новую строку)
Надеюсь понятно о чем я.
Тоесть насколько я понял, нужно опустошить переменную перед записью от старых записей. Подскажите пожалуйста как это сделать в данном случае.

Спустя 43 минуты, 50 секунд (2.09.2010 - 12:17) demonichka написал(а):
Можно просто перед записью очистить содержимое файла.

Спустя 27 минут, 31 секунда (2.09.2010 - 12:45) Семён написал(а):
С одного из сайтов: (научитесь искать ответы на свои вопросы в гугле)
$file_gb="gb.txt"; // файл гостевой книги
$file_tmp="gb_tmp.txt"; // временный файл
$str="новая строка текста";

// проверяем, не было ли сбоя в предыдущем запуске скрипта
if(file_exists($file_tmp)) die("fatal error, call administrator!");

// копируем содержимое файла в tmp
if(copy($file_gb, $file_tmp))
{
// удачно скопировался, можно перезаписывать основной файл
if($w=fopen($file_gb,"w"))
{
flock($w,2); // локируем файл
fwrite($w,$str."\n"); // записываем первую строку

if(!$r=fopen($file_tmp,"r")) die("can't open file");
flock($r,1);
while($str=fgets($r,10240)) // читаем построчно
{
fputs($w,$str); // пишем построчно
}
flock($r,3);
fclose($r);
flock($w,3);
fclose($w);
unlink($file_tmp);
}
}


Спустя 8 минут (2.09.2010 - 12:53) linker написал(а):
$filename = 'file.txt';
$file = file($filename);
array_unshift($file, 'qdqwdqwdqw');
file_put_contents($filename, $file);

Спустя 13 минут, 58 секунд (2.09.2010 - 13:07) Nikitian написал(а):

$filename = 'file.txt';
$str="qdqwdqwdqw";
file_put_contents($filename, $str."\r\n".file_get_contents($file));

Спустя 11 минут, 25 секунд (2.09.2010 - 13:18) Семён написал(а):
довольно популярный вопрос среди начинающих программистов: "А как записать данные не в конец, а в начало файла?".

Вопрос хороший. Подобная задача рано или поздно встает перед каждым web-программистом. Обычно — раньше.

Надо сказать, что ответов на этот вопрос довольно много. Каждый программист решает эту популярную задачу по-разному. Я бы даже на месте разработчиков PHP ввел отдельную функцию, дописывающую строку с начало файла, чтобы избавить людей от этого вопроса. Даже не от вопроса, а от неграмотных его решений.

Не смотря на разнообразные подходы к решению этой задачи, сам алгоритм решения, как правило, общий для всех: прочесть файл, дописать к нему новые данные, сохранить файл. Но, не смотря на кажущуюся простоту, в таком решении заложен огромный подводный камень, на который натыкается, чуть ли не 99% малоопытных программистов.

Суть ошибки заключается в том, что программист использует для временного сохранения данных оперативную память: читает файл в память, дописывает к нему новые данные, благо оперативка позволяет дописывать данные куда угодно, после чего сохранят данные в старый файл. "Чем же плох такой метод?", -- спросит любой из вас. А вот чем. Попробуйте мысленно растянуть во времени всю эту процедуру: вот данные прочтены в оперативную память... вот вы закрыли файл для чтения... вновь открыли его, но уже для перезаписи... [fatal error] ...вот тут у вас по какой-то причине оборвалось выполнение скрипта. Сбой в питании, перезагрузка, не хватило квоты на диске или случилась любая другая ошибка. Экземпляр скрипта уничтожается вместе с прочтенными в оперативку данными, а открытый для перезаписи файл автоматически закрывается девственно чистым или с некоторой частью данных, которые успели записаться. Все, данные теперь можно вытащить только из backup. Хорошо, если он у вас окажется актуальным.

Что же произошло, неужели ошибка в алгоритме? Нет, никакой ошибки в алгоритме нет. Но давайте все по порядку...

Предположим, что аварийного завершения работы скрипта у вас никогда не произойдет, хотя я в это и не верю, но пройдет какое-то время и файл с данными (предположим, что это гостевая книга) раздуется до такого размера, что просто перестанет влезать в отведенную для данного скрипта оперативную память. Вы полагаете, что можете распоряжаетесь всей свободной оперативной памятью сервера? Ничего подобного! Каждому скрипту обычно выделяется какой-то фиксированный объем памяти, которым он может распоряжаться. Как правило, это несколько мегабайт. Надеюсь, дальше эту проблему можно не описывать.

"Ну хорошо", -- скажете вы, -- "а если я обеспечу своевременное дробление файла на куски, чтобы не вылезать, скажем, за пределы 1 мегабайта в каждом куске?". Что ж, это ход, но я бы его тоже назвал полумерой. А если к скрипту обратится сразу много запросов, что тогда произойдет? А произойдет вполне очевидное — запустится такое количество экземпляров скрипта, какое может разместиться в оперативной памяти. И если каждый экземпляр скрипта будет читать в память хотя бы по мегабайту, то не трудно посчитать, сколько человек одновременно смогут одновременно прочесть вашу гостевую.

Все дело в том, что описанные проблемы возникают далеко не сразу. Они могут вообще не возникнуть, но где гарантия, что это будет именно так, как вы хотите?

Полагаю, я достаточно привел аргументов в пользу того, что нельзя использовать оперативную базу в качестве временного хранилища файлов.

"Как же так", — продолжите удивляться вы, — "а зачем тогда в PHP существуют операторы, позволяющие прочесть файл в массив строк и т.п.? Зачем они тогда существуют?". А я вам с удовольствием отвечу на этот вопрос. Существуют они для работы с файлами более-менее фиксированного объема. Самым удобным примером тут может быть файл настроек вашей программы. Конфигурационные файлы обычно имеют более-менее фиксированный размер, и сроки в них представляют собой или директивы или комментарии. Такой файл очень удобно читать в строковый массив, производить над ним действия и записывать данные обратно в файл. Вот так.

см. выше код.

Вот так. А теперь попробуйте представить себе ситуацию, когда данные могут быть испорчены работой этого скрипта. И не пытайтесь! На каком этапе работы не произошел бы сбой, всегда сохранится актуальная информация: или в основном файле, или во временном. Причем, если информация осталась во временном файле, то следующий экземпляр скрипта не станет работать, чтобы не затереть данные в tmp-файле.

Теперь вы можете быть спокойны за свою гостевую книгу, форум, сбор подписей, хранилище заказов и т.п. — в худшем случае программа просто перестанет принимать новые данные, надежно сохранив существующие.

Надеюсь, мне удалось доказать, что работать с файлами надо как с файлами, а не как с переменными, которые на то и переменные, чтобы часто рождаться и часто умирать.

Только не надо думать, что "от этих предосторожностей" скрипт раздуется в размерах. Просто оформите этот код в виде отдельной функции, назовите его удобным словосочетанием и используйте в своих программах наряду с другими функциями PHP.

Желаю удачи!

Спустя 3 минуты, 39 секунд (2.09.2010 - 13:22) twin написал(а):
"\r" зачем?

Спустя 3 минуты, 9 секунд (2.09.2010 - 13:25) Nikitian написал(а):
Цитата (twin @ 2.09.2010 - 10:22)
"\r" зачем?

мы не знаем что с этим файлом будет происходить дальше. Вполне вероятно (файлы с расширением txt как правило используются для человеческой обработки), что он будет скачиваться для обработки на персональном пк. Большинство персональных пк - winOS.

Спустя 5 минут, 58 секунд (2.09.2010 - 13:31) twin написал(а):
Цитата
Вполне вероятно (файлы с расширением txt как правило используются для человеческой обработки), что он будет скачиваться для обработки на персональном пк.
гораздо более вероятно, что с ним будут работать скрипты. А там это может помешать.

тут я как то писал про большие файлы... недописал.

Спустя 2 минуты, 12 секунд (2.09.2010 - 13:33) Nikitian написал(а):
Цитата (twin @ 2.09.2010 - 10:31)
гораздо более вероятно, что с ним будут работать скрипты. А там это может помешать.

Может помешать, если программист ни разу не работал с текстовыми файлами, т.к. в ином случае каждый сталкивался с \r и должен на уровне автоматизма удалять ненужное.

Спустя 7 минут, 24 секунды (2.09.2010 - 13:40) linker написал(а):
Де-факто, используется только "\n". Банальный вьюер в Total Commander'e воспринимает это абсолютно нормально. Лишние операции по автоматизации мусора не нужны вовсе.

Спустя 8 минут, 38 секунд (2.09.2010 - 13:49) Nikitian написал(а):
Банальный Блокнот, который по умолчанию является просмотрщиком файлов с расширением txt открывает их в одну строчку если нет \r
Давайте будем думать о пользователях, а не говорить, что так и задумано, а не нравится - используйте правильный софт.

Спустя 9 минут, 51 секунда (2.09.2010 - 13:59) linker написал(а):
Какой пользователь будет смотреть служебную инфу в этом файле, да еще и блокнотом?

Спустя 20 минут, 49 секунд (2.09.2010 - 14:20) Nikitian написал(а):
А кто говорит про служебную инфу? Тс хочет так хранить Имя,Ник,Пароль,Телефон - это вполне человекочитаемая форма записи. А смотреть будут тем, чем откроется. По умолчанию открывается блокнотом.

Спустя 1 минута, 49 секунд (2.09.2010 - 14:22) linker написал(а):
А кто сказал, что у него винда? Откроешь такой файлик в *nix и обматеришься. А то, что блокнот не понимает одиночного "\n", так это его проблемы и не пристало нам из-за одной виндовой какашки, парить себе мозг.

Спустя 4 минуты, 8 секунд (2.09.2010 - 14:26) Семён написал(а):
Holywar. ставлю что победит Билгейтс

Спустя 5 минут, 28 секунд (2.09.2010 - 14:31) Basili4 написал(а):
Семён
Однозначно победит а если не победит сделает для вашего линукса блокнот который будет только \r\n видеть

Спустя 1 минута, 39 секунд (2.09.2010 - 14:33) twin написал(а):
Фигня конечно. Никогда не ставится эта хрень в скриптах. Если следовать такой логике, нужно и \f ставить. Мало ли каклой блокнот там как сработает...

Спустя 2 минуты, 24 секунды (2.09.2010 - 14:35) Basili4 написал(а):
ИМХО ставим \n если блокноту что то не нравится мы ему галочку поставим переносить по словам он и успокоится

Спустя 8 минут, 48 секунд (2.09.2010 - 14:44) Семён написал(а):
А что если у меня нет блокнота и других текстовых редакторов, но есть программа для просмотра изображений, мож будем и рисуночки рядом складывать, чтоб удобнее. rolleyes.gif

Спустя 7 минут, 1 секунда (2.09.2010 - 14:51) Гость_Dima85 написал(а):
Спасибо всем большое. Разобрался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.