Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Почему не помогает функция flock() ?
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




Здравствуйте, уважаемые специалисты.

У меня есть следующий код, который записывает количество просмотров страницы в файл:

if(filesize("control/view/index")==0) {
$f=fopen("control/view/index","w");
flock($f, LOCK_EX);
fwrite($f,"1");
$count_view=1;
}else{
$count_view=file("control/view/index");
$count_view[0]++;
$f=fopen("control/view/index","w");
flock($f, LOCK_EX);
fwrite($f,$count_view[0]);
$count_view=$count_view[0];
} flock($f, LOCK_UN);
fclose($f);


Ситуация складывается таким образом, что время от времени значение в файле обнуляется и снова отсчет начинается с нуля. Поначалу я думал, что такое происходит из-за одновременной записи в файл. Дописал функцию flock(), чтобы блокировать файл от одновременного доступа к нему. Но и это не помогает. И снова время от времени значение в файле обнуляется.
Пожалуйста, подскажите, почему так происходит и как этого избежать?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 6460
Пользователь №: 35718
На форуме: 12 лет, 4 месяца
Карма: 208




Цитата (Kuzma92 @ 6.02.2025 - 01:36)
Пожалуйста, подскажите, почему так происходит

Потому что нет понимания происходящих процессов. Сначала должна быть блокировка, а уже потом чтение и запись. Никаких file() быть не должно, работа с файлом только через fopen(). Нельзя просто так написать LOCK_EX и получить желаемое. Это эксклюзивная блокировка. Для того что бы её получить, необходимо дождаться отсутвиия других блокировок. При работе с файлами много тонкостей и нюансов. Вы потрптите 100 лет (в одну каску) и в итоге получите жалкое подобие базы данных.
В 100500 раз говорю используйте базу данных (в тысячный раз говорю, что под капотом БД те же самые файлы, только огромня куча народа решает эти проблемы в том числе и с блокировками).

Цитата (Kuzma92 @ 6.02.2025 - 01:36)
как этого избежать?

Перестаньте носить воду в решете (файлы), возьмите наконец ведро (база данных)!


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




Valick, здравствуйте.
Цитата (Valick @ 6.02.2025 - 10:17)
Перестаньте носить воду в решете (файлы), возьмите наконец ведро (база данных)!

да я это все понимаю. Ладно. если я сейчас буду создавать что-то новое, и уже на БД. Но вот как быть с тем, что если уже есть и работают несколько активно посещаемых (до тысячи уникальных посетителей в день) сайтов с уже имеющимися достаточно большими базами данных (контент + пользователи) на файлах? Как сейчас это все взять и перенести? Если честно, то я пока что даже представления не имею.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6347
Пользователь №: 18498
На форуме: 15 лет, 7 месяцев, 22 дня
Карма: 269




Чат гпт спрашивал по своему коду?
У него много версий :D .

Ты ничего не логируешь, не проверяешь корректность по ходу.

Например что мешает тут проверить

$count_view=file("control/view/index");

, что если пустое что то вернулось, которое потом в ноль превратится, то не записывать это в файл


--------------------
There never was a struggle in the soul of a good man that was not hard
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 6460
Пользователь №: 35718
На форуме: 12 лет, 4 месяца
Карма: 208




Michael, сброс до 0 это только часть проблемы (видимая часть), такой счётчик может например откатывать значение время от времени и это проследить практически не возможно.


Цитата (Kuzma92 @ 6.02.2025 - 15:21)
Как сейчас это все взять и перенести?


А зачем всё? Вот есть конкретный пример, счётчик. Даже его можно переносить точечно. Постепенно переходя от файлов к БД.
Кодовую базу на файлах можно даже не трогать. Дописать функционал счётчика для БД и после полного перехода просто выпилить функционал счётчика на файлах.
Главное преодолеть боязнь БД. Попробовать с ней работать, можно даже не на реальном проекте. Для начала вообще потренироваться в написании SQL запросов либо на онлайн площадках, либо в PhpMyAdmin (надеюсь он ещё жив) например.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса