![]() |
Тот кто работал с текстовыми файлами.
Товарищи, кто-нить юзал блокировку на файлах? Т.е. flock()?
Просто вот думаю делать ли ее на голование, оно у меня использует файлы, и так вот...представьте себе такую ситуацию...к вам заходит большое кол-во челов, и многие голосуют...и так вот один проголовал, файл стерся, но в этот же момент другой просматривает результаты, файл пытается начать чтение....но он не находит вообще ничего, потому что все было стерто тем пользователем который проголосовал...И сразу же посыпались ошибки...Конечно я понимаю, что это надо что бы в 1 милисек такие действия провелись...Но можете мне сказать, мне вообще этим стоит забивать голову? |
а что ОС не обеспечивает блокировку? в этом случае ОС - это твоя СУБД:)
|
Drualex
Несомненно стоит. Конечно, такая ситуация с почти одновременным голосованием двух или более пользователей очень редка, но это не значит, что такое никогда не случится... |
Просто знаете, я еще что не видел что бы кто то юзал блокировки...т.е. на форумах, правда бесплатных, поэтому у меня и сложилось впечатление что это не обязательно.
|
По ходу проще писАть в MySQL, чем в файл. Он для этого и придуман...
|
не проще а нужно!
кто щас в файлы то пишет? |
_ARMAGEDDON_
и что из-за одного файла подымать мускл чтоль? думаю не слишком правильная идея |
может использовать темповые файлы ... :confused:
|
Мучить для голосования MySQL я смысла не вижу.
Лично я все пишу на Perl. Там есть замечательный стандартный модуль DB_File, позволяющий работать с текстовыми файлами как с массивами со всеми вытекающими отсюда возможностями по изменению / вставке / удалению строк. Ни о каких блокировках запариваться не надо, поскольку по сути текстовый файл рассматривается с точки зрения скрипта как БД. Аналогов этому на PHP нет. --------------------------- Можно (опять же для Perl) для стандартной работы с файлами использовать следующие функции блокировки и разблокировки: Обратите внимание: в связи с отсутсвием на форуме тега для обозначения Perl кода, я использовал тег PHP. Но код написан именно для Perl!!! PHP код:
PHP код:
|
А вот пример того что я сделал с блокировкой:
$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;"> </p></TD></TR> </TABLE>'; Извините, плиз за столь огромное колличество кода, но по моему мнению тут можно увидеть картину наиболее полно. :beer: ЗЫ. А что касается мускула, то я его просто еще не знаю:( (но работы ведуться), но так же я согласен и с тем что его использовать для такого маленького скриптика будет лишним(он у меня всего 3 кб). |
Цитата:
|
Цитата:
|
кстати не сказал бы что использование любой бд проще, чем обычного файла.
|
Цитата:
|
текстовый файл. что может быть проще. придумал простенький формат и все.
а для базы данных надо, по меньшей мере: знать ее особенности. знать язык SQL(плюс диалект - расширения sql, пример: Ms Sql Server/T-SQL). пример. чтобы задействовать в mysql "транзакции", надо работать с таблицами InnoDB, а это само по себе уже проблемно, т.к. при больших объемах данных эти таблицы ведут себя не лучшим образом. плюс надо знать транзакционную модель mysql, методы оптимизации и т.д. а если ваша база состоит из 1 мегабайта текстовых данных и простенького формата, то опять же - никакого смысла в sql нету, т.к. это все равно, что стерлять из пушки по воробьям. в 5-ой версии php должно появится новое расширение: SqlLite. вот это будет самое оно для таких задач. кстати ещё один вариант - использовать xml в качестве хранилища данных небольшого размера. но это уже ближе к текстовому файлу опять же, нежели к базе данных. |
SQLite уже есть и его можно использовать прямо сейчас, а не ждать PHP5. Тем более, что это на самом деле быстрая и удобная альтернатива и файлам, и MySQL для мелких задач.
|
Цитата:
Цитата:
Часто дотаточно ехать на велосипеде, но подовляющее большинство ездят на машинах потому что это удобнее, это же не называется "стерлять из пушки по воробьям"!!!??? Цитата:
И вообще, в 99% случаев БД будет работать быстрее чем написанные самим функции работы с файлом (за счет индексов, кеширования, алгоритмов и т.д...). |
Цитата:
|
SamJa
Хм, а сортировка, поиск по подстроке и/или регэкспу, группировка, удаление, изменение? Не все задачи можно свести ко вставке и чтению. |
Цитата:
Кстати, если речь об 1 мегабайте данных, то в таких случаях и следует использовать MySQL. А когда речь идет о каком-то простеньком голосовании, то какой смысл. И вообще, может у человека хост, на котором MySQL не предусмотрено. |
Цитата:
Если я правильно понял автора топика (Drualex), ему удаление и изменение ненужно. |
2All Спасибо, вообщем я понял что использолвать блокировку при применении файлов необходимо. А вот насчет мускула, то я буду изучать, как только появится книга, которую я заказал...Но если у кого есть полезные для совсем начинающего статеички, то плиз в студию.
|
На английском есть издание SAMS в pdf формате.
|
2drualex
а я так и не понял, почему необходимо использовать блокировку? |
http://www.mysql.ru/ Много документации на русском, с описаниями и примерами. А также перевод официального МАНа.
|
2Sheryld Смотри, допустим у тебя часто голосуют, и может сложиться такая ситуация, что в тот момент, когда чем проголосовал, то файл стирается(для того что бы потом что то увеличить на 1 голос), но в этот момент, может другой пользователь посмотреть результаты и файл будет открыт на чтение, но так как в этот момент проводилась запись, может оказаться что файл открыт, но он был подчистую удален процессом-писателем, и тут сразу появятся ошибки.
И что бы этого не происходило, делаются блокировки, которые блокируют, т.е. пока процесс-писатель не станет единственным действующем в данный момент, он не начнет писать, а будет ждать своего времени. Обычно на процессы-писатели ставят исключительную блокировку, а на процесс-чтения перекрестную, что бы читать могли все, не ждя когда же они будут единственными. ЗЫ. Похоже на перекресток со светофором. ЗЫы Вот такое краткое описание, конечно тут возможно я некоторые вещи сам не понимаю, но в общем виде это так, надеюсь я рассказал весьма доходчиво. |
| Часовой пояс GMT +4, время: 11:56. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.