IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Тот кто работал с текстовыми файлами. (https://www.imho.ws/showthread.php?t=61344)

Drualex 10.06.2004 10:10

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

Sheryld 10.06.2004 12:26

а что ОС не обеспечивает блокировку? в этом случае ОС - это твоя СУБД:)

V0iD 10.06.2004 12:34

Drualex
Несомненно стоит. Конечно, такая ситуация с почти одновременным голосованием двух или более пользователей очень редка, но это не значит, что такое никогда не случится...

Drualex 10.06.2004 13:33

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

EvroStandart 10.06.2004 15:23

По ходу проще писАть в MySQL, чем в файл. Он для этого и придуман...

_ARMAGEDDON_ 10.06.2004 16:07

не проще а нужно!
кто щас в файлы то пишет?

ReapeR 10.06.2004 16:14

_ARMAGEDDON_
и что из-за одного файла подымать мускл чтоль? думаю не слишком правильная идея

lanix 10.06.2004 16:28

может использовать темповые файлы ... :confused:

Goryn 10.06.2004 18:23

Мучить для голосования MySQL я смысла не вижу.

Лично я все пишу на Perl. Там есть замечательный стандартный модуль DB_File, позволяющий работать с текстовыми файлами как с массивами со всеми вытекающими отсюда возможностями по изменению / вставке / удалению строк. Ни о каких блокировках запариваться не надо, поскольку по сути текстовый файл рассматривается с точки зрения скрипта как БД.

Аналогов этому на PHP нет.

---------------------------
Можно (опять же для Perl) для стандартной работы с файлами использовать следующие функции блокировки и разблокировки:

Обратите внимание: в связи с отсутсвием на форуме тега для обозначения Perl кода, я использовал тег PHP. Но код написан именно для Perl!!!


PHP код:

sub lockfile {
 
my $lcount=0;
 
my $handle=shift;
 
my $lflag=1;
 
until (flock($handle2)) {
  
sleep .10;
  if (++
$lcount>50) {$lflag=0}
 }
 return 
$lflag;
}
sub unlockfile {
 
my $handle=shift;
 
flock($handle8); 


пример вызова:

PHP код:

open (RON,"+<filename") || die;
   &
lockfile(RON) || die;

...

   &
unlockfile(RON);
  
close(RON); 

Функция lockfile пытается 50 раз с интервалом обратиться к файлу. Если за этот период он остается заблокирован другим процессом, то возвращается флаг ошибки (нулевой результат на выходе).

Drualex 10.06.2004 18:36

А вот пример того что я сделал с блокировкой:
$file_name='file.txt';
$data=file($file_name);
$file=fopen($file_name,'a+');
flock($file,LOCK_EX);
ftruncate($file,0);
fputs($file,trim($data[0])."\n");
for($i=1;$i<count($data);$i++):
list($count,$text)=explode(':|||:',$data[$i]);
if($_GET['vote']==$i) $count++;
$vote_text=trim("$count:|||:$text");
fputs($file,"$vote_text\n");
endfor;
fflush($file);
flock($file,LOCK_UN);
fclose($file); ;
$data=file($file_name);
echo'
<table border="0"><tr><td height="6px"></td></tr></table>
<TABLE class="vote" border="0" width="140px" cellpadding="0" cellspacing="0">
<TR><TD colspan="2" style="BORDER-BOTTOM:#FF9900 2px solid;" bgcolor=3B95D1 align="center"><p class="nav">Ãîëîñîâàíèå</p></TD></TR>
<TR><TD colspan="2" class="vote_top">',$data[0],'</TD></TR>';
for($y=1;$y<count($data);$y++):
list($count,$text)=explode(':|||:',$data[$y]);
@$count_all+=$count;
endfor;
for($i=1;$i<count($data);$i++):
list($count,$text)=explode(':|||:',$data[$i]);
@$count_percent=($count/$count_all)*100;
echo'
<TR><TD class="vote">',$text,'</TD><TD class="vote_counter">',$count,'/',(int)$count_percent,'%</TD></TR>';
endfor;
echo'
<TR><TD class="vote_down">Голосование.:</TD><TD class="vote_counter_all">',$count_all,'</TD></TR>
<TR><TD colspan="2" style="BORDER-TOP:#FF9900 2px solid;" height="3px" bgcolor=3B95D1><p style="font-size:3px;">&nbsp;</p></TD></TR>
</TABLE>';

Извините, плиз за столь огромное колличество кода, но по моему мнению тут можно увидеть картину наиболее полно. :beer:
ЗЫ. А что касается мускула, то я его просто еще не знаю:( (но работы ведуться), но так же я согласен и с тем что его использовать для такого маленького скриптика будет лишним(он у меня всего 3 кб).

EvroStandart 10.06.2004 20:35

Цитата:

Drualex:
А что касается мускула, то я его просто еще не знаю (но работы ведуться), но так же я согласен и с тем что его использовать для такого маленького скриптика будет лишним(он у меня всего 3 кб).
Ты, по ходу, в принцыпе не понимаеш, зачем нужен MySQL. Все скрипты останутся, только работать будут не с файлами, а с базой. Только, если как ты писАл : "к вам заходит большое кол-во челов" и каждый из них оставит комментарий, то база в любом случае быстрее и удобнее, чем файл.

Hubbitus 10.06.2004 21:24

Цитата:

Drualex:
ЗЫ. А что касается мускула, то я его просто еще не знаю (но работы ведуться), но так же я согласен и с тем что его использовать для такого маленького скриптика будет лишним(он у меня всего 3 кб).
IMHO, неможет быть лишним использование более мощного инструмента, превосходящего по всем параметрам текущий (в.т.ч. и по скорости), да еще и более удобный в работе!!!

Sheryld 10.06.2004 23:59

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

Hubbitus 11.06.2004 00:47

Цитата:

Sheryld:
кстати не сказал бы что использование любой бд проще, чем обычного файла.
Возможно, но обсуждаемой здесь MySQL нисколько не сложнее, а на мой взгляд намного проще и удобнее!

Sheryld 11.06.2004 01:05

текстовый файл. что может быть проще. придумал простенький формат и все.

а для базы данных надо, по меньшей мере:

знать ее особенности.
знать язык SQL(плюс диалект - расширения sql, пример: Ms Sql Server/T-SQL).

пример. чтобы задействовать в mysql "транзакции", надо работать с таблицами InnoDB, а это само по себе уже проблемно, т.к. при больших объемах данных эти таблицы ведут себя не лучшим образом. плюс надо знать транзакционную модель mysql, методы оптимизации и т.д.

а если ваша база состоит из 1 мегабайта текстовых данных и простенького формата, то опять же - никакого смысла в sql нету, т.к. это все равно, что стерлять из пушки по воробьям.

в 5-ой версии php должно появится новое расширение: SqlLite. вот это будет самое оно для таких задач.

кстати ещё один вариант - использовать xml в качестве хранилища данных небольшого размера. но это уже ближе к текстовому файлу опять же, нежели к базе данных.

Saruman 11.06.2004 01:07

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

Hubbitus 11.06.2004 01:20

Цитата:

Sheryld:
текстовый файл. что может быть проще. придумал простенький формат и все.
А в БД уже не нужно никаких форматов придумывать вообще, просто задал структуру нужную, и не думай в каком формате СУБД это все будет хранить!
Цитата:

Sheryld:
а для базы данных надо, по меньшей мере:

знать ее особенности.
знать язык SQL(плюс диалект - расширения sql, пример: Ms Sql Server/T-SQL).

пример. чтобы задействовать в mysql "транзакции", надо работать с таблицами InnoDB, а это само по себе уже проблемно, т.к. при больших объемах данных эти таблицы ведут себя не лучшим образом. плюс надо знать транзакционную модель mysql, методы оптимизации и т.д.

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

Sheryld:
кстати ещё один вариант - использовать xml в качестве хранилища данных небольшого размера. но это уже ближе к текстовому файлу опять же, нежели к базе данных.
Да, XML - это вариант. По методам работы с ним (API парсеров) больше на базу данных он похож, хотя есть к этому два подхода... не буду в это углубляться, все в курсе...
И вообще, в 99% случаев БД будет работать быстрее чем написанные самим функции работы с файлом (за счет индексов, кеширования, алгоритмов и т.д...).

EvroStandart 11.06.2004 13:34

Цитата:

Hubbitus:
Именно, если всего 1 мегабайт текстовых данных, то все приведенное выше знать абсолютно не обязательно!
Даже если 10 мегабайт. В данном случае нужна одна таблица с одним (если я правильно понял) полем. Знать нужны две команды: выборки (чтения) и добавления. Больше ничего не нужно.

Saruman 11.06.2004 13:39

SamJa
Хм, а сортировка, поиск по подстроке и/или регэкспу, группировка, удаление, изменение? Не все задачи можно свести ко вставке и чтению.

Goryn 11.06.2004 14:50

Цитата:

Сообщение от Saruman
Хм, а сортировка, поиск по подстроке и/или регэкспу, группировка, удаление, изменение? Не все задачи можно свести ко вставке и чтению.

А при чем здесь вообще голосование, с которого все началось. Что-то нас увело совершенно в другую сторону...

Кстати, если речь об 1 мегабайте данных, то в таких случаях и следует использовать MySQL. А когда речь идет о каком-то простеньком голосовании, то какой смысл.

И вообще, может у человека хост, на котором MySQL не предусмотрено.

EvroStandart 11.06.2004 18:15

Цитата:

Сообщение от Saruman
SamJa
Хм, а сортировка, поиск по подстроке и/или регэкспу, группировка, удаление, изменение? Не все задачи можно свести ко вставке и чтению.

Сортировку, поиск и группировку обеспечивает таже команда выборки/просмотра: SELECT. Может ты другую команду для просмотра знаеш? Поделись тайной. :)

Если я правильно понял автора топика (Drualex), ему удаление и изменение ненужно.

Drualex 12.06.2004 09:21

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

EvroStandart 12.06.2004 13:55

На английском есть издание SAMS в pdf формате.

Sheryld 12.06.2004 14:54

2drualex

а я так и не понял, почему необходимо использовать блокировку?

Hubbitus 12.06.2004 14:55

http://www.mysql.ru/ Много документации на русском, с описаниями и примерами. А также перевод официального МАНа.

Drualex 13.06.2004 11:02

2Sheryld Смотри, допустим у тебя часто голосуют, и может сложиться такая ситуация, что в тот момент, когда чем проголосовал, то файл стирается(для того что бы потом что то увеличить на 1 голос), но в этот момент, может другой пользователь посмотреть результаты и файл будет открыт на чтение, но так как в этот момент проводилась запись, может оказаться что файл открыт, но он был подчистую удален процессом-писателем, и тут сразу появятся ошибки.
И что бы этого не происходило, делаются блокировки, которые блокируют, т.е. пока процесс-писатель не станет единственным действующем в данный момент, он не начнет писать, а будет ждать своего времени.
Обычно на процессы-писатели ставят исключительную блокировку, а на процесс-чтения перекрестную, что бы читать могли все, не ждя когда же они будут единственными.
ЗЫ. Похоже на перекресток со светофором.
ЗЫы Вот такое краткое описание, конечно тут возможно я некоторые вещи сам не понимаю, но в общем виде это так, надеюсь я рассказал весьма доходчиво.


Часовой пояс GMT +4, время: 11:56.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.