
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
۩
Дата
|
![]() Пользователь ![]() ![]() Профиль Группа: Пользователь Сообщений: 81 Пользователь №: 46556 На форуме: Карма: ![]() |
Здравствуйте, уважаемые специалисты.
У меня есть следующий код, который записывает количество просмотров страницы в файл: if(filesize("control/view/index")==0) { Ситуация складывается таким образом, что время от времени значение в файле обнуляется и снова отсчет начинается с нуля. Поначалу я думал, что такое происходит из-за одновременной записи в файл. Дописал функцию flock(), чтобы блокировать файл от одновременного доступа к нему. Но и это не помогает. И снова время от времени значение в файле обнуляется. Пожалуйста, подскажите, почему так происходит и как этого избежать? |
![]() |
|||||
![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 6460 Пользователь №: 35718 На форуме: Карма: 208 ![]() |
Потому что нет понимания происходящих процессов. Сначала должна быть блокировка, а уже потом чтение и запись. Никаких file() быть не должно, работа с файлом только через fopen(). Нельзя просто так написать LOCK_EX и получить желаемое. Это эксклюзивная блокировка. Для того что бы её получить, необходимо дождаться отсутвиия других блокировок. При работе с файлами много тонкостей и нюансов. Вы потрптите 100 лет (в одну каску) и в итоге получите жалкое подобие базы данных. В 100500 раз говорю используйте базу данных (в тысячный раз говорю, что под капотом БД те же самые файлы, только огромня куча народа решает эти проблемы в том числе и с блокировками).
Перестаньте носить воду в решете (файлы), возьмите наконец ведро (база данных)! -------------------- |
||||
![]() |
۩
Дата
|
||
![]() Пользователь ![]() ![]() Профиль Группа: Пользователь Сообщений: 81 Пользователь №: 46556 На форуме: Карма: ![]() |
Valick, здравствуйте.
да я это все понимаю. Ладно. если я сейчас буду создавать что-то новое, и уже на БД. Но вот как быть с тем, что если уже есть и работают несколько активно посещаемых (до тысячи уникальных посетителей в день) сайтов с уже имеющимися достаточно большими базами данных (контент + пользователи) на файлах? Как сейчас это все взять и перенести? Если честно, то я пока что даже представления не имею. |
||
![]() |
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 6347 Пользователь №: 18498 На форуме: Карма: 269 ![]() |
Чат гпт спрашивал по своему коду?
У него много версий :D . Ты ничего не логируешь, не проверяешь корректность по ходу. Например что мешает тут проверить $count_view=file("control/view/index"); , что если пустое что то вернулось, которое потом в ноль превратится, то не записывать это в файл -------------------- There never was a struggle in the soul of a good man that was not hard
|
![]() |
|||
![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 6460 Пользователь №: 35718 На форуме: Карма: 208 ![]() |
Michael, сброс до 0 это только часть проблемы (видимая часть), такой счётчик может например откатывать значение время от времени и это проследить практически не возможно.
А зачем всё? Вот есть конкретный пример, счётчик. Даже его можно переносить точечно. Постепенно переходя от файлов к БД. Кодовую базу на файлах можно даже не трогать. Дописать функционал счётчика для БД и после полного перехода просто выпилить функционал счётчика на файлах. Главное преодолеть боязнь БД. Попробовать с ней работать, можно даже не на реальном проекте. Для начала вообще потренироваться в написании SQL запросов либо на онлайн площадках, либо в PhpMyAdmin (надеюсь он ещё жив) например. -------------------- |
||
![]() |
![]() ![]() ![]() |