[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Почему не помогает функция flock() ?
Kuzma92
Здравствуйте, уважаемые специалисты.

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

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(), чтобы блокировать файл от одновременного доступа к нему. Но и это не помогает. И снова время от времени значение в файле обнуляется.
Пожалуйста, подскажите, почему так происходит и как этого избежать?
Valick
Цитата (Kuzma92 @ 6.02.2025 - 01:36)
Пожалуйста, подскажите, почему так происходит

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

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

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

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

да я это все понимаю. Ладно. если я сейчас буду создавать что-то новое, и уже на БД. Но вот как быть с тем, что если уже есть и работают несколько активно посещаемых (до тысячи уникальных посетителей в день) сайтов с уже имеющимися достаточно большими базами данных (контент + пользователи) на файлах? Как сейчас это все взять и перенести? Если честно, то я пока что даже представления не имею.
Michael
Чат гпт спрашивал по своему коду?
У него много версий :D .

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

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

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

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

_____________
There never was a struggle in the soul of a good man that was not hard
Valick
Michael, сброс до 0 это только часть проблемы (видимая часть), такой счётчик может например откатывать значение время от времени и это проследить практически не возможно.


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


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

_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

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