Кэширование переменных в PHP - PullRequest
2 голосов
/ 13 декабря 2010

Короче говоря, я ищу лучший способ для быстрого и эффективного хранения, в основном, логических переменных, таких как:

  • Текущий пользователь просматривал эту страницу? (Boolean)
  • Текущий пользователь проголосовал за эту страницу? (Снова логическое значение)
  • Сколько раз сегодня этот пользователь получил очки за голосование? (Целое число)

Эти переменные будут храниться только в течение ОДНОГО дня, то есть в полночь каждый день, когда они будут удалены.

Я могу придумать пять способов сделать это, но я не знаю, как правильно их протестировать, поэтому я, безусловно, мог бы помочь с этим.

1. Один файл - одна переменная

Первая идея - сохранить некоторую переменную в файле, подобном этому <?php $___XYZ = true;, затем включить его и вернуть $___XYZ. Проблема в том, что, скорее всего, будут сотни таких переменных, и это может занять потенциально много места (поскольку, поправьте меня, если я ошибаюсь, каждый файл занимает минимум ~ 4 КБ пространства, в зависимости от формата раздела). Большим плюсом является простота доступа, простота работы и простота очистки всего в начале дня (просто удалите всю папку с содержимым). Есть проблемы со скоростью доступа?

2. Один файл - много переменных

Я могу хранить группы переменных в одном файле, таким образом:

0:1
1:1
14:0
154:0

Затем используйте fgets, чтобы найти и прочитать переменную, но как насчет записи промежуточного файла? Можно ли эффективно использовать fwrite? Я не совсем уверен, что этот способ намного лучше, чем 1., но как вы думаете?

3. APC

Используйте apc_store и другие для хранения, изменения и доступа к данным. У меня есть три проблемы: я где-то читал, что включение APC может серьезно замедлить работу вашего сайта, что иногда возникают странные проблемы с кэшированием, и мне интересно узнать, как эффективно удалить только «ежедневный» кэш и оставить все, что у меня может быть кэшируются? И как хорошо с сотнями тысяч переменных, хранящихся в нем?

4. База данных MySQL

Я мог бы создать таблицу с двумя строками (имя и переменная), но ... У меня такое ощущение, что это будет мучительно медленно по сравнению с любым из вышеперечисленных вариантов.


Подводя итог - какой из этих способов хранения переменных в PHP является лучшим? А может, есть что-то еще лучше?

Ответы [ 5 ]

2 голосов
/ 13 декабря 2010

Как насчет memcached? Это действительно быстро, и когда вы просто храните bools, все это помещается в память без проблем. Это, безусловно, самый быстрый вариант из всех. В полночь вы можете легко прочитать всю статистику, собранную за день, и очистить кеш.

2 голосов
/ 13 декабря 2010

Для профилирования вы можете использовать Xdebug , который хранит информацию о профилировании в определенной папке, и использовать webgrind для просмотра данных профилирования.

Мои настройки в php.ini для xdebug:

zend_extension=C:/WEB/PHP-ts/php_xdebug-2.1.0-5.3-vc6.dll
xdebug.collect_params=4
xdebug.show_local_vars=on
xdebug.scream=1
xdebug.collect_vars=on
xdebug.dump_globals=on
xdebug.profiler_enable=1
xdebug.profiler_output_dir=C:/WEB/_profiler/
xdebug.profiler_output_name=cachegrind.%s.out
xdebug.collect_return=1
xdebug.collect_assignments=1
xdebug.show_mem_delta=1

И я нашел сообщение в блоге о сравнении производительности кэша (но это с 2006 года!):

Cache Type                Cache Gets/sec

Array Cache                       365000
APC Cache                          98000
File Cache                         27000
Memcached Cache (TCP/IP)           12200
MySQL Query Cache (TCP/IP)          9900
MySQL Query Cache (Unix Socket)    13500
Selecting from table (TCP/IP)       5100
Selecting from table (Unix Socket)  7400
1 голос
/ 13 декабря 2010

Я бы выбрал mySQL и / или кэш в памяти, такой как APC или memcache.

Честно говоря, правильно проиндексированная таблица базы данных, вероятно, будет достаточно быстрой для большинства операций.И вы можете легко очистить все записи с помощью оператора DELETE, сравнивающего временные метки.Это определенно будет быстрее, чем домашнее решение для файловой системы.И если вы уже используете mySQL для остальной части своего сайта, вам не нужно беспокоиться о дополнительном слое хранилища.

РЕДАКТИРОВАТЬ: Я также хотел бы отметитьэта память изменчива.Если ваш сервер потеряет питание, ваши данные исчезнут, если они не будут сохранены где-либо (например, в базе данных).

1 голос
/ 13 декабря 2010

Мой любимый способ сделать это - вариант # 2, где я делаю массив из пар чисел.Затем легко сериализовать массив и сохранить его в файл.

Для вашего приложения это имеет недостаток, если нескольким посетителям / процессам необходим доступ к массиву одновременно.Возможно, есть способ обойти это, используя отдельный файл для каждого пользователя.

1 голос
/ 13 декабря 2010

Используйте memcached , вы можете хранить переменные в памяти и устанавливать время их истечения, чтобы их можно было вращать как каждый день.

Memcached намного быстрее, чем любой другой метод, который вы перечислили, есливы новичок в этом, попробуйте этот класс я сделал.

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