2009-06-18 3 views
2

Есть ли разница между кешированием объектов PHP на диске, а не нет? Если кешировать, объекты будут создаваться только один раз для ВСЕХ посетителей сайта, а если нет, они будут созданы один раз для каждого посетителя. Есть ли разница в производительности для этого или я буду тратить время на это?Производительность кэширования объектов PHP

В основном, когда дело доходит до этого, главный вопрос:

Несколько объектов в памяти, пользователь PER (каждый пользователь имеет свой собственный набор конкретизированных объектов)

VS

Single объекты в кешированном файле для всех пользователей (все пользователи используют одни и те же объекты, например, тот же класс обработчика ошибок, тот же класс обработчика шаблона и тот же класс дескриптора базы данных)

ответ

3

Есть ли разница между кэширования PHP объектов на диске, а не не?

Как и при всей настройке производительности, вы должны измерить, что вы делаете, вместо того, чтобы просто слепо выполнять некоторые ритуалы вуду, которые вы не полностью понимаете. Когда вы сохраняете объект в $_SESSION, PHP будет захватывать состояние объектов и генерировать из него файл (сериализация). После следующего запроса PHP затем создаст новый объект и повторно заполнит его этим состоянием. Этот процесс намного дороже, чем просто создание объекта, поскольку PHP должен будет делать операции ввода-вывода с диска, а затем анализировать сериализованные данные. Это должно произойти как при чтении, так и в записи.

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

0

Я думаю, что вы будете тратить время, если только данные является статическим и сложный для генерации.

Скажите, что у вас есть объект, представляющий список контроля доступа (ACL), в котором указывается, какие уровни пользователей имеют разрешения для определенных ресурсов.

Заполнение этого ACL может занять значительное время, особенно если данные поступают из базы данных. Кэшированный ACL может быть создан быстрее.

0

Я использовал результаты кэширования SQL-запросов, а также результаты с учетом времени и впечатляющие результаты. прямо сейчас я работаю над приложением, которое извлекает более 200 записей базы данных (которые имеют множество функций SQL и вычисляет в них) из таблицы с более чем 200 000 записей, вычисляет результаты из полученных данных для каждого запроса. Я использую компонент Zend_Cache в Zend Framework для кэширования результатов расчета, так что в следующий раз, когда я не нужен:

  1. подключиться к базе данных
  2. ожидания для сервера баз данных, чтобы найти мои записи, расчет моих функции SQL, возвращают результаты
  3. выборки по крайней мере, 200 (может даже богатый 1000) записывает в память
  4. перешагнул все эти данные и вычислить, что я хочу от них

Я просто сделать:

  1. вызов метода Zend_Cache :: load(), который будет выполнять чтение некоторых файлов.

, который спасет меня, по крайней мере 4-5 секунд на каждом запросе (очень неточной, я не профиль это на самом деле., Но прирост производительности весьма заметно)

0

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

Кэш запроса должен быть постоянным (и ограниченным числом) и данными, довольно статичными. Чтобы быть эффективными (и стоит того), ваш доступ к жесткому диску должен быть намного быстрее, чем ваш запрос БД для этих данных.

Я когда-то использовал это, сериализуя кешированные объекты в файлах, на относительно статичном содержимом на домашней странице, занимая 200 + хитов/с с сильно загруженным DB одного экземпляра, с неизбежными запросами (на моем уровне). Получил около 40% производительности на этой домашней странице.

Код - при разработке этого с нуля - очень быстрый и простой, с pile_put/get_contents и un/serialize. Вы можете назвать свой файл после, скажем, контрольной суммы md5 вашего запроса.

6

Чтобы использовать эти объекты, каждый скрипт PHP должен будет десериализовать их в любом случае. Таким образом, это определенно не для экономии памяти, что вы будете кэшировать их на диске - это не спасет память.

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

Кэш-диск, основанный на дисках, не обязательно является большой победой. Если вы используете PHP и обеспокоены производительностью, вы должны запускать приложения в среде кэширования кода, например APC или Zend Platform. Эти инструменты также обеспечивают кэширование, которое вы можете использовать для сохранения объектов PHP в своем приложении. Memcached также является популярным решением для быстрого кэша памяти для данных приложения.

Также помните, что не все объекты PHP могут быть сериализованы, поэтому сохранение их в кеше, будь то на основе диска или в памяти, невозможно для всех данных. В принципе, если объект содержит ссылку на ресурс PHP, вы, вероятно, не можете его сериализовать.

+0

Объекты, которые я собираюсь создать, не будут извлекаться из базы данных и не будут иметь никаких ресурсов PHP. Что касается Memcached/Zend, поскольку разрабатываемое мной программное обеспечение будет использоваться для решений с низким бюджетом для общих веб-хостинга, у него, вероятно, не будет установлен Zend Optimizer и/или memcached (как причина, по которой я полагаюсь на диск. На данный момент я не использую APC, потому что я развиваюсь на окнах) Главный вопрос в основном: несколько объектов, созданных для каждого пользователя/посетителя для каждого посещения VS Отдельные объекты, созданные экземпляром ONCE для всех пользователей, но с данные записываются на диск – Nikko

+0

PHP - это архитектура «ничего общего», что означает, что объект должен быть создан для каждого сеанса PHP, даже если содержимое объекта считывается с диска. –

+0

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

0

К сожалению, для этого не правильный ответ. Такое же решение для одного и того же сайта на одном сервере может обеспечить лучшую производительность или намного хуже. Это зависит от слишком многих факторов (приложение, программное обеспечение, аппаратное обеспечение, конфигурация, загрузка сервера и т. Д.).

Следует помнить, что: - самая медленная часть сервера - это жесткий диск. - создание объекта WAY лучше, чем доступ к диску.

=> Оставайтесь как можно дальше от данных HD и кеша в ОЗУ, если это возможно.

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

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

Интересное видео по этой теме: YouTube Scalability

+0

Хорошо, спасибо. Что я, вероятно, сделаю, это добавить способ выбрать, хочет ли пользователь использовать кэширование диска или нет. – Nikko

0

Имея объекты кэшируются в памяти, как правило, лучше, чем на диске:

http://code.google.com/p/php-object-cache/

Однако эталоном для себя и сравнить результаты. То они только вы можете знать наверняка.

+0

просто интересно, есть ли у вас эталонные тесты для таких, как APC? – buggedcom

Смежные вопросы