Открытие фаила и исключительная блокировка.

REMO

Guest
Открытие фаила и исключительная блокировка.

Есть скрипт, который достаточно часто запускается в сутки (около 60к раз, причем в пиковые часы до 10к раз)... Он дергает БД, причем в запросе используется ORDER BY RAND() LIMIT 8. Как я понимаю, это не есть хорошо.

Поэтому решил сделать скрипт, который будет как бы кэшировть данные минут на 5, записывая результат запроса в фаил. А сам скрипт, к которому часто обращаются, будет читать эти данные из фаила и не дергать БД.

Как сделать, чтобы не возникло путаницы с чтением-письмом в фаил? Можно ставить исключительную блокироку, но прочитав на форуме, про ужасы, которые описывают люди, используя ее (фаил залочивается и не разлочивается, сбои в работе и т.д.), решил от нее отказаться.

Выход: создаю два фаила. Когда есть первый читаем из первого, когда есть второй, читаем из второго.

Соответственно есть скрипт, который генерит эти два фаила. Если первый фаил уже есть, то генерим второй и удаляем первый.

Допустим есть первый фаил, когда мы будем создавать второй фаил, то возникнет момент, когда будет существовать 2 фаила, что недопустимо. Как это разрешить?

Может есть иные пути решения проблемы?

P.s. сорри, что так длинно
 

Winer

Мимо проходил
ммм, например, перед началом создания второго файла делаем файл-флаг, типа creating, после генерации второго файла файл-флаг удаляется :) это так, навскидку
более умных мыслей не пришло - болею
 

lucas

Guest
Можно ставить исключительную блокироку, но прочитав на форуме, про ужасы, которые описывают люди, используя ее (фаил залочивается и не разлочивается, сбои в работе и т.д.), решил от нее отказаться.
А зря.

Если функция (может быть?) не работает -- пишется багрепорт, а не следует отказ от ее использования.

Создавай файл, блокируя LOCK_EX.
Читай, блокируя LOCK_SH.
 

REMO

Guest
Нашел другое решение:

Разделил час на 6 частей.

PHP:
if(($time >= 0 && $time <10) || ($time >= 20 && $time <30) || ($time >= 40 && $time <50)) $massiv = file("file1"); 
else $massiv = file("file2");
Это для чтения. Соответсвенно для записи, наоборот.
 
Сверху