PHP APC Кешировать или не кешировать? - PullRequest
8 голосов
/ 02 февраля 2011

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

Я, скорее всего, буду использовать APC.Есть ли у кого-нибудь примеры того, какой объем данных будет наименьшим для того, чтобы его кэшировать?Например, допустим, у вас есть массив из 100 элементов, и вы используете цикл foreach для него и выполняете некоторые простые манипуляции с массивом, должны ли вы кэшировать результат?Как насчет того, чтобы в нем было 1000 элементов, 10000 элементов и т. Д.?

Следует ли кэшировать результаты запроса к базе данных?Какие типы запросов вы должны кэшировать?Я предполагаю, что простой выбор, и, возможно, пара соединений присоединяется к MySQL базы данных не требует кэширования, или это?Предполагая, что кеш запросов mysql включен, означает ли это, что вам не нужно кэшировать на уровне приложения, или вы все равно должны это делать?

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

Ответы [ 2 ]

10 голосов
/ 02 февраля 2011

Когда вы смотрите на данные кэширования, которые были прочитаны из базы данных в APC / memcache / WinCache / redis / etc, вы должны знать, что они не будут обновляться при обновлении базы данных, если вы явно не сохраните код для сохранения.база данных и кэш синхронизированы.Следовательно, кэширование наиболее эффективно, когда данные из базы данных не часто меняются, но также требуется более сложный и / или дорогостоящий запрос для извлечения этих данных из базы данных (в противном случае вы можете также прочитать их из базы данных, когда выэто нужно) ... такие дорогие запросы на соединение, которые возвращают одни и те же записи данных при каждом запуске, являются первыми кандидатами.И всегда проверяйте, быстрее ли читаются запросы из базы данных, чем из кэша.Правильная индексация базы данных может значительно сократить время доступа к базе данных, тем более что большинство баз данных также поддерживают свой собственный внутренний кэш, поэтому не используйте APC или эквивалентный кеш для данных, если это не оправдано накладными расходами базы данных.

Вам также необходимознать об использовании пространства в кеше.Большинство кэшей имеют фиксированный размер, и вы не хотите их переполнять ... поэтому не используйте их для хранения больших объемов данных.Используйте сценарий apc.php, доступный в APC, для мониторинга использования кэша (хотя убедитесь, что он не является общедоступным для всех и каждого, кто получает доступ к вашему сайту .... плохая безопасность).

При хранении объектов в кэшеобъект будет сериализован (), когда он сохранен, и не сериализован (), когда он получен, так что есть издержки.Объекты с атрибутами ресурса потеряют этот ресурс;так что не храните объекты доступа к базе данных.

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

0 голосов
/ 15 марта 2011

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

Затем вы должны определить, что именно является причиной замедления.Вы предполагали, что код вашего приложения был источником, но его стоит изучить, если есть другие внешние факторы, такие как большой размер файла подкачки, чрезмерные запросы, отсутствие gzip и т. Д. Используйте сайт типа http://tools.pingdom.com/ или расширение типа yslow asначало для этого.(быстрый совет, убедитесь, что keepalive и gzip работают).

Предполагая, что проблема заключается в продолжительности выполнения кода вашего приложения, вы захотите профилировать свой код с помощью чего-то вроде xdebug (http://www.xdebug.org/) и просмотравывод с помощью kcachegrind или wincachegrind. Это позволит вам узнать, какие части вашего кода требуют много времени для запуска. Оттуда вы будете принимать решения о том, что кэшировать и как его кэшировать (или вносить улучшения в логику вашего кода).

Существует так много возможностей для решения проблемы и связанных с ней решений, что не стоит догадываться. Поэтому, как только вы определите проблему, вы можете захотеть опубликовать новый вопрос, связанный с решением этой конкретной проблемы.Я скажу, что при неправильном использовании кеш запросов mysql может быть неэффективным. Кроме того, я обычно избегаю кеша пользователей APC в пользу memcached.

...