Как сделать толковый кэш на php?

sfsf

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

хотелось бы услышать что нибудь толковое про memcache+apc
как это вообще использовать
не могу же я все запихнуть в оперативку как на жесткий диск
и еще не понятно как использовать apc
если есть простенькие примеры для легкого старта буду благодарен

вообще не врубаюсь в эту тему
 

С.

Продвинутый новичок
Первый вопрос надо себе задать: "Нужно ли вообще это кешировать?"
 

Фанат

oncle terrible
Команда форума
Я прошу прощения у остальных ответивших, но мне кажется, куда-то двигаться до ответа на вопрос С. будет неправильно.

Пока мы знаем только, что человек берет из одного файла и записывает в другой. Работает на ура. Вопрос - нафига?

Любое действие всегда должно иметь какую-то причину.
При этом не секрет, что очень часто пользователи пхп путаются в средствах решения проблем.
Поэтому начинать надо с проблемы, которую надо решить.
Вполне возможно, что решение окажется гораздо проще. Один индекс к базе добавить например.
Или даже просто преодолеть базоданнобоязнь.
 

sfsf

Новичок
я не понял что "нафига"

причин может быть много

например для меня в первую очередь это обучение

хочу понять как сайт hh.ru выдерживает наплыв 500 000 пос в сутки

вполне логично что у них все вакансии напиханы по статическим файлам

но как можно применить memcache, apc в дополнении к статике например?

раньше я все брал из базы, потом сделал статику, она заняла 15 гб места, разгрузила в несколько раз сервер, во всяком случае он перестал показывать "мэни коннектс на белом листе"

знаю и другие компании которые не парятся, арендовали мощный выделеный сервер и пишут говнокод, тоже все летает

моя задача выжать из сервера максимум
 

flr

Новичок
sfsf

Чтобы ответить на твой вопрос серьёзно, нужно понимать, что у тебя за проект. «Кеширование в вакууме» обсуждать проблематично. Всё очень зависит от.

Но если ты всё же хочешь научиться в вакууме, то вот несколько тезисов:

1) Кешировать нужно почти всегда. Даже если ты не кешируешь сознательно, за тебя кеширует nginx или файловая система или даже контроллер у жесткого диска. То есть система сама себя кеширует, так как делать одни и те же операции на каждый запрос, когда можно сохранить результат и отдавать его — это не рационально.
2) Кешировать на диск — это самый дешёвый вариант для маленьких проектов, которые живут на shared хостингах. Это не поможет удержать какую-либо серьёзную нагрузку, но обычно оно и не требуется. Такое кеширование ломается или при большом количестве операций записи (ресурс жёстких дисков на запись очень ограничен) или, даже если записи не так много, проблемы возникнут при большом количестве файлов, даже если просто в основном это будет чтение (хотя, миллионы файлов при нормальном разбиении по папкам держутся вполне адекватно)
3) Если проект хостится даже на самом дешевом сервере (хотя бы за 150 рублей в месяц), то он уже может позволить себе кеширование в оперативной памяти. Это кеширование имеет на порядки более высокий ресурс записи и чтения. Причем, если у тебя 15гб данных, а сервер маленький (например 1гб оперативной памяти), кешировать надо только самую часто используемую информацию. В тех же apc/memcache это реализуется простой установкой времени жизни. То есть неиспользуемая информация отмирает из кеша сама собой.
Если у тебя один сервер, то достаточно будет пользоваться apc. Он просто сохраняет твои данные в shared memory (то есть в оперативную память, общую для всех процессов внутри твоего apache или php-fpm). Там всего несколько функций, аля apc_store($key, $value, $expire) и apc_fetch($key) (более подробно можно посмотреть на php.net); Собственно, всё как и с кешем на диске: во время чтения проверяешь, есть ли в кеше, если нет, то вычисляешь и кладёшь в кеш, при записи вычисляешь и кладёшь в кеш.
Если же web-серверов несколько, то очевидно все web-сервера будут иметь в таком случае свои раздельные данные, то есть нужно уже общее хранилище. Вот тогда используешь memcached. При этом apc всё равно нужен, так как всё-таки кеширует opcode (то есть интерпретатору не нужно каждый раз анализировать и подготавливать код, в общем бесплатное ускорение и снижение расхода процессора).
4) Крупные проекты (как тот же hh, у которого, я предполагаю, намного больше 500к посещений в сутки) могут иметь гораздо бОльший кеш в оперативной памяти, чем ты видимо себе представляешь. Сервер с 128гб кеша — это обычное явление. Он стоит очень дёшево (200 баксов при таких оборотах — это смех), а нагрузку снижает очень сильно (тот же hh скорее всего даже в такой простой сервер уместит все нужные данные, а ведь можно взять и больше RAM или несколько кеш серверов).
5) Даже с парком кеширующих серверов по 250гб оперативной памяти, проект всё равно окислится, если там будет говнокод.
 

flr

Новичок
fixxxer, фраза двусмысленная.

Если это не юмор, а намёк, то буду рад более предметному комментарию с конкретными цитатами и опровержениями.
 

DiMA

php.spb.ru
Команда форума
вот те чуток опровержений

> Сервер с 128гб кеша — это обычное явление. Он стоит очень дёшево (200 баксов при таких оборотах — это смех)

Где ты такое видел? Арендовать 4 дешевых сервера по 16 гигов выгоднее, чем 1 навороченный сервер на 64 гига. По ценам аренды выделенных серверов нашего хостера - оба варианта почти одинаковы по стоимости. Но 4 сервера дадут в 4 раза большую нагрузку! К сожалению, профессор не знает, что в реальности (на тех самых упомянутых крупных проектах) кеширующие сервера все равно пишут свои данные на диск .-) Так выгоднее, чем вообще ничего на диск не писать. Поэтому супер навороченный сервер под кеш, сколько бы Гб у него не было, усрется записывать все данные на 4 своих HDD, против 16-ти HDD у 4х слабых 16-ти гиговых тачек.

Да, бывает кеш без записи на диск, но таких данных значительно меньше.

Какие нафиг 200 баксов? У нашего, очень дешевого хостера, 64 Гб сервер стоит 20 000 рублей в месяц. И даже не думай давать советы, что мы на дорогом хостере сидим .-)

> 5) Даже с парком кеширующих серверов по 250гб оперативной памяти, проект всё равно окислится, если там будет говнокод.

Бред. Проект на пхп говнокоде, типа накидали на коленке быстро, но с правильной архитектурой, включающий кеш и масштабирование, работает изумительно хорошо. Проект на идеальном пхп (т.н. преждевременные оптимизации), но без архитектуры, никакой нагрузки не выдерживает, т.к. не масштабируется. А в совсем упрощенном виде, можно даже без масштабирования и архитектуры обойтись и в говнокодистом проекте нормально хранилища с данными (включая кеш) на разные тачки разнести - полетит под любой нагрузкой в достаточно больших пределах.

> хочу понять как сайт hh.ru выдерживает наплыв 500 000 пос в сутки
> как тот же hh, у которого, я предполагаю, намного больше 500к посещений в сутки

ХХ- мелкий сайтец. Не, ну все в мире относительно, просто подобные сравнения не корректны. Один сервер, выдающий баннеры, может обслужить десятки млн уников в сутки. И чё, он крупнее, чем хх? .-) ХХ - выдает статичные кешированные странички. Никакой проблемы загнать хоть лям уников нет.
 

sfsf

Новичок
С memcache все понял, достойная замена кэширования на диске
Все пихаем в оперативку
Тоже самое что виртуальный диск в оперативке

Но как быть с apc

Я так и не понял зачем он нужен
В каком месте его можно применять и как применять (вроде как все основные функции кэширования можно перевалить на memcache.)?

Вот в чем вопрос...

В гугле прочитал

apc - это кеш для байт-кода php, чтоб интерпретатор не интерпретировал каждый раз заново, а выполнял уже интерпретированный код из кеша, работает как модуль для php.

memcache - это хранилище ключ/значение в оперативной памяти, вешается на порт или unix-сокет.


но все равно не понял...
 

DiMA

php.spb.ru
Команда форума
apc - тоже самое, что мемкеш, умеет хранить ключи в оперативной памяти
его второе и главное назначение - кеш опкода пхп, оно к данной теме кеширования данных не относится
где хранить - разницы нет, но проще и универсальнее в мемкеше
 

sfsf

Новичок
правильно ли я понял что после установки apc в конфиге прописываем apc.stat=1 исобственно на этом все заканчивается
никакой php код для apc писать не нужно (php код в данном случае пишется для memcache)

я так понял что у apc 2 функции - это кэширование в оперативке как в memcache а также функция кэширования самого php байт кода - собственно это главное его предназначение
 

flr

Новичок
Где ты такое видел?
Эм, Не буду выискивать все предложения, но просто чтобы не быть голословным: http://www.webhostingtalk.com/showthread.php?t=1271733
Арендовать 4 дешевых сервера по 16 гигов выгоднее, чем 1 навороченный сервер на 64 гига.
Неужели вы не замечаете, где вас обманывают?
Подсказываю: у 4-х серверов в 4 раза больше железа, на их установку надо в 4 раза больше времени, на них уходит в 4 раза больше электричества и так далее. И 64 гб оперативной памяти всё это само собой не окупят (память — довольно дешёвый компонент).
По ценам аренды выделенных серверов нашего хостера - оба варианта почти одинаковы по стоимости.
Я писал ответ для общего случая, а не для вашего хостера.
Но 4 сервера дадут в 4 раза большую нагрузку!
Кеш сервера нагрузку снижают, а не дают.
В том числе в 99% случаев остальные компоненты (процессор, диск) справляются и на одном сервере, а значит увеличение энтропии не даст никакого положительного эффекта.
К сожалению, профессор не знает, что в реальности (на тех самых упомянутых крупных проектах) кеширующие сервера все равно пишут свои данные на диск .-)
Во-первых, «профессор» работает над высоконагруженным проектом. Во-вторых, писать данные или нет на диск — это зависит от данных и от ситуации, а не от проекта. Утверждение «на крупных проектах кеширующие сервера всё пишут на диск» ошибочно.
Так выгоднее, чем вообще ничего на диск не писать.
True story. (даже не знаю как это ещё прокомментировать)
Какие нафиг 200 баксов? У нашего, очень дешевого хостера, 64 Гб сервер стоит 20 000 рублей в месяц. И даже не думай давать советы, что мы на дорогом хостере сидим
Ок, у вас отличный хостер!
Проект на пхп говнокоде, типа накидали на коленке быстро, но с правильной архитектурой
Ваше недопонимание связано с другой интерпретацией слова «говнокод». Для меня это в том числе и архитектура. И в данном контексте я имел в виду именно её, а не «читабельность» или «логичность» кода.
ХХ - выдает статичные кешированные странички. Никакой проблемы загнать хоть лям уников нет.
Поздравляю! Это ваше первое практически верное утверждение.
Не полностью оно верно, потому что помимо очевидной статики у hh есть и динамика (например, поиск). Однако действительно никакой проблемы при правильном подходе они испытывать не должны.

Но в любом случае, спасибо за уделенное время.

В каком месте его можно применять и как применять (вроде как все основные функции кэширования можно перевалить на memcache.)?
Конечно для кеширования всегда можно просто использовать memcache. Однако, если проект маленький и у него один сервер (и планируется один на долгие годы), то использование apc для кеширования будет вполне разумным, так как memcache будет создавать дополнительные накладные расходы (поддержание самого memcache, создание соединений — всё это дополнительная ram и процессорное время), а ты говорил, что хочешь выжать из сервера максимум.

Есть ситуации, когда memcache вообще не подходит, и apc просто незаменим. Если интересно, могу рассказать и про них.

правильно ли я понял что после установки apc в конфиге прописываем apc.stat=1 исобственно на этом все заканчивается
Так-то да, нужно установить расширение (в простейшем случае это apt-get install php-apc), и прописать в php.ini apc.enabled=1
А вообще, вбей в гугле «apc config» и прочти первую статью. Там не так много параметров, разобраться можно за 5 минут.

никакой php код для apc писать не нужно (php код в данном случае пишется для memcache)
Если нужен только opcode кэш, то да, достаточно просто включить его в конфиге. То есть это обычно делают всегда, так как (как уже писал в предыдущем посте) это бесплатное ускорение работы и снижение нагрузки.

я так понял что у apc 2 функции - это кэширование в оперативке как в memcache а также функция кэширования самого php байт кода - собственно это главное его предназначение
Совершенно верно.
 

sfsf

Новичок
А чем xcache лучше apc?
У него такой же функционал как у apc?
Почему вконтакте выбрал именно xcache?
 

AmdY

Пью пиво
Команда форума
А чем xcache лучше apc?
У него такой же функционал как у apc?
Почему вконтакте выбрал именно xcache?
Чтобы выбирать, нужно сразу научиться находить тонкие места, а не слушать теорию, которая в твоём конкретном случае может давать совсем другие результаты.
Для профайлинга xprof, xdebug, pinba.... Смотришь что тормозит и оптимизируешь.
 

flr

Новичок
А чем xcache лучше apc?
Ничем. Есть несколько различных opcode кешеров. На вкус и цвет каждый выбирает своё. Плюс иногда натыкаешься в них на утечки памяти или другие ошибки, тогда есть смысл просто сменить кешер на другой. То есть на разном железе и на разных ОС они просто работают с разной стабильностью. Но, по-моему, общепринятым до недавнего времени всё же был APC. Сейчас в связи с включением в состав PHP 5.5 Zend Optimizer, APC как бы подвинули.

Вы спорите о сферических конях в вакууме, а ТС нужны основы
Думаю всегда полезно знать о предмете некоторый общий план. Не документацию, а именно принцип работы. Что это, как оно работает, зачем оно?
Если просто пнуть топик стартера читать доки Zend/Cache/Storage/Adapter — это никак не поможет понять ему суть.

Если ошибаюсь, то топик стартер меня поправит.
 

fixxxer

К.О.
Партнер клуба
flr
все твои утверждения верны только в частных случаях. Если на проекте, с которым ты работаешь, все так, то на другом все совсем не так. Все очень зависит от характера нагрузки. Например, "дисковый кэш" - прекрасная вещь, если файлы с диска отдаются напрямую и весь горячий контент помещается в vfs cache. А тебя послушать так статику можно в apc начать класть. И так далее.

У человека с базовым пониманием вещей проблемы, а ты его грузишь спецификой конкретного проекта (не уточняя, какого), который, возможно, не имеет ровно никакого отношения к тому, что он делает. Ему нужны базовые знания и понимание происходящих процессов, а не memcached-apc-и-много-других-умных-слов.
 

radioheaded

PHP нуб
А чем xcache лучше apc?
У него такой же функционал как у apc?
Почему вконтакте выбрал именно xcache?
Ничем, в целом он хуже. Ткните в пруф, что вконтакте сидит на xcache.
Я недавно проводил тестирование различных shared memory хранилищ, xcache проигрывает apc довольно сильно как shm. И как опкод кешер мы их тоже сравнивали чуть раньше (но с тех пор вроде ничего не изменилось), и там xcache тоже проигрывает.
Если нужно только shm хранилище, можно использовать apcu. Скоро выйдет Zend OpCache (мы его уже тестируем потихоньку), все перейдут на него, ибо apc перестанет поддерживаться (точнее, разрабы сказали, что уже по большому счету перестали и все усилия направили на OpCache).

Как использовать shared memory storage.
Допустим, у нас есть БД, мемкеш и apc (apc_store, apc_add, apc_inc, apc_fetch). И у нас есть несколько тачек, часть — БД, часть — мемкеш, часть — фронты (на которых пых с apc). Тогда можно организовать два уровня кеширования данных из БД: на общем уровне — мемкеш, на уровне конкретной тачки — apc. Приходит запрос на тачку — в лучшем случае часть данных мы достанем сразу из shm, никуда не бегая; в хорошем случае — возьмем из мемкеша, сбегая по сети до мемкеш тачки и быстро получив их оттуда; в худшем случае — сбегаем до тачки с БД, возьмем оттуда данные и переложим в мемкеш и shm.
То есть, на каждой конкретной тачке мы держим локальный кеш каких-то очень часто используемых данных и не лезем за ними в сеть вообще. Кроме очевидного прироста производительности мы еще и снижаем сетевой трафик. Еще есть неочевидный момент синхронизации кешей на тачках, но это уже лирика.

Кроме этого, у опкешеров есть атомарные операции (apc_add, apc_inc, apc_dec), на базе которых можно организовать локи на уровне тачки. При помощи inc и dec удобно делать счетчики, не опасаясь RC.

А про опкеш — да: включил и забыл (тут еще правда отдельно надо сказать про правильный деплой, но ТС это ни к чему).
 

flr

Новичок
все твои утверждения верны только в частных случаях. Если на проекте, с которым ты работаешь, все так, то на другом все совсем не так. Все очень зависит от характера нагрузки.
Эм, само собой всё зависит ОТ. О чём я и написал в первом же своём предложении.
У человека с базовым пониманием вещей проблемы, а ты его грузишь спецификой конкретного проекта (не уточняя, какого), который, возможно, не имеет ровно никакого отношения к тому, что он делает.
Вообще-то я как раз абстрагировался от какого-либо проекта. Брал среднестатистический вакуум (аля домашний сайт, бложик, форум или что-либо такое, чем интернет заполнен на 90%). Ничего специфичного как раз не писал. В том числе ничего не связывал с проектами, над которыми я работал/работаю.
Ему нужны базовые знания и понимание происходящих процессов, а не memcached-apc-и-много-других-умных-слов.
Хм, а он спросил конкретно про apc-memcache. Вам видимо лучше знать, что ему нужно. И само собой вы ему об этом не расскажите, а пошлёте читать литературу?
 

fixxxer

К.О.
Партнер клуба
Судя по его формулировке вопроса, он еще сам не понимает, что ему нужно. А чтобы понять, что нужно, надо понять суть происходящих процессов, а не впихивать всякие технологии абы как.

Литературу бы послал читать, если бы знал таковую. :)
 
Сверху