Шаблоны для очистки дискового кэша / ограничение размера в PHP? - PullRequest
2 голосов
/ 25 августа 2011

Мой скрипт извлекает много файлов JPEG по медленному соединению.Я сохраняю загруженные файлы в локальном кеше и использую их до тех пор, пока они не будут изменены.

Вопрос: Как мне убедиться, что этот кеш никогда не превышает 16 Мб (скажем)?

Я могу очистить его, когда захочу:

  1. Рассчитать общий размер всех файлов в кэше.
  2. Удалите некоторые файлы, пока они не станут меньше 16 МБ, минус какмне нужно.

Но что, если два экземпляра сценария сделают это?Обе убедитесь, что 1 МБ свободна, затем используйте 1 МБ каждый, а кэш-память теперь составляет 17 МБ.Правило 16Mb нарушено.

Я знаю, что могу сделать «ленивый кеш» : просто время от времени очищать его.Но злонамеренный пользователь может вызвать много кеширования и исчерпать место на диске.Это общий хостинг, поэтому никто не может сделать.

Единственное решение, которое мне пришло в голову (плохо):

Перед сохранением чего-либо, заблокируйте весь кеш, очиститедо необходимого места, сохранить файл, разблокировать кеш.Почему плохо: я кеширую много файлов, поэтому много блокировки и много очистки.Медленный.(Также как вы блокируете / ждете блокировок в PHP?)

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Мэйби, я неправильно тебя понял - это выглядит слишком просто.Если у вас нет доступной базы данных - прочитайте базу данных = какой-то файл с некоторым форматом данных.

Создайте таблицу в базе данных со столбцами: имя файла, размер файла, отметка, если файл все еще загружается (true / false).

Когда вы получите новый запрос на скачивание файла - заблокируйте эту таблицу.Рассчитать SUM (размер файла).

  1. Если оно меньше 16 МБ минус новый размер файла, добавьте новую запись в таблицу.Изменить флаг (конечно, с блокировкой / разблокировкой до / после) после загрузки файла.
  2. Если это больше: посмотрите, есть ли у вас загруженные файлы, которые вы можете удалить и удалить их, пока у вас недостаточно свободногопробел, затем добавьте запись в таблицу.
  3. Если вам не удается освободить достаточно памяти - отклоните этот запрос / подождите, пока загрузятся некоторые файлы.

Разблокируйте таблицу сразу после каждого случая -он должен быть заблокирован только на несколько мс каждый раз, поэтому никто не должен ждать.

0 голосов
/ 25 августа 2011

Вы можете использовать протекающее ведро.Вам нужно хранить lasttime (метка времени unix) и bucket (целое число).Каждый раз, когда вы сохраняете что-то, вы вычисляете промежуток времени с момента последнего сохранения в кеш, уменьшаете его в секундах от сегмента, затем на сегмент на x байтов.Если объем памяти превышает вашу емкость за вычетом размеров jpeg-файла, вы удаляете самые старые объекты, чтобы освободить необходимое пространство.

0 голосов
/ 25 августа 2011

Я бы не пошел так далеко, как вы с правилами, но вы можете использовать следующее:

file_put_contents -

LOCK_EX - получить эксклюзивную блокировку файла при переходе к письменная форма.

Создайте файл .txt где-нибудь, пусть ваш скрипт попытается получить его содержимое. Если сценарий уже запущен, он заблокирует файл, поэтому новый сценарий не сможет получить доступ к файлу. Если вы не можете получить доступ к файлу, не выполняйте код для кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...