Методы кэширования объектов PHP в файл?

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

Безусловно, одна из лучших функций ASPNET, IMO.

С тех пор я отказался от Windows в пользу Linux и, следовательно, PHP, Python и Ruby в пользу веб-разработки. Я чаще всего использую PHP, потому что разрабатываю несколько проектов с открытым исходным кодом, и все они используют PHP.

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

  1. Сериализация в файл (довольно медленный/дорогой процесс)
  2. Запись данных в файл в формате JSON/XML/plaintext/etc (еще медленнее для операций чтения)
  3. Запись данных в файл как чистый PHP (самое быстрое чтение, но довольно запутанная операция записи)

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

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

Есть ли другой метод сохранения в файл, о котором я забыл?

Есть ли лучшие методы кэширования в "ограниченных" средах?


person Oli    schedule 24.09.2008    source источник


Ответы (8)


Сериализация вполне безопасна и широко используется. Однако есть альтернатива — кешировать в память. Ознакомьтесь с memcached и APC, они бесплатны и обладают высокой производительностью. Эта статья о различных методах кэширования в PHP также может представлять интерес.

person Eran Galperin    schedule 24.09.2008
comment
Я хотел бы гарантировать доступ к memcached, но из-за характера этих проектов я не могу контролировать развертывание... И я не могу установить это как требование. Приятно осознавать, что разрешение PHP писать — это не конец света. - person Oli; 24.09.2008
comment
Я бы сказал (и сделал stackoverflow.com/questions/126917#127165), что довольно безопасно немного. В сериализации и записи нет ничего небезопасного по своей сути, но делать это в среде общего хостинга далеко не идеально. - person Alan Storm; 24.09.2008
comment
Memcache и APC совсем не похожи. Единственное, что у них общего, это то, что они оба используют оперативную память. Memcache кэширует данные. APC оптимизирует и кэширует коды операций. APC ускорит почти любое PHP-приложение, но не поможет с кэшированием объектов и сокращением запросов к БД. - person Shane H; 30.06.2009
comment
APC — это не просто кеш байт-кода. Он также имеет возможности кэш-памяти, аналогичные memcache. - person Eran Galperin; 03.07.2009
comment
Для программного обеспечения, предназначенного для различных сценариев развертывания, было бы лучше написать стандартный интерфейс кэширования, который можно реализовать с помощью различных поставщиков кэширования (APC, Memcached, на основе файлов). Тогда это просто становится вопросом конфигурации для каждого развертывания. Если у них нет доступного кеширования памяти, тогда вернитесь к кешированию на основе файлов. - person Tim; 27.04.2012

Re: Есть ли другой метод сохранения в файл, который я забыл?

Это имеет ограниченную полезность, но если у вас есть особенно мощный запрос к базе данных, вы можете записать сериализованный объект обратно в индексированную таблицу базы данных. У вас по-прежнему будут накладные расходы на запрос к базе данных, но это будет простой выбор, а не громоздкий запрос.

Re: Безопасно ли сохранять файл? и дешевый виртуальный хостинг)

Печальный факт заключается в том, что дешевый виртуальный хостинг небезопасен. Насколько вы доверяете 100 500 или 1000 другим людям, имеющим доступ к вашему серверу? По историческим причинам и (по иронии судьбы) по соображениям безопасности в средах общего хостинга PHP/Apache работает как непривилегированный пользователь (при этом PHP работает как модуль Apache). Рациональность безопасности здесь заключается в том, что если мир, с которым сталкивается процесс apache, будет скомпрометирован, эксплуататоры будут иметь доступ только к непривилегированной учетной записи, которая не сможет взломать важные системные файлы.

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

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

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

Решения некрасивые. Некоторые хосты предлагают CGI Wrapper, который позволяет запускать PHP как CGI. Преимущество здесь в том, что PHP будет работать как владелец скрипта, что означает, что он будет работать как вы, а не как непривилегированный пользователь. Проблема предотвращена! Новая проблема! Традиционная компьютерная графика медленна, как патока в феврале.

Есть FastCGI, но FastCGI привередлив и требует постоянной настройки. Не многие общие хосты предлагают это. Если вы найдете тот, который это делает, скорее всего, у них будет включен APC, и, возможно, они даже смогут предоставить механизм для memcached.

person Alan Storm    schedule 24.09.2008
comment
FastCGI не очень медленный — медленнее, чем mod_php, но лучше. Спасибо за объяснение, хотя. +1 - person Oli; 24.09.2008
comment
Да, но это трудно найти на дешевом виртуальном хостинге. - person Alan Storm; 24.09.2008

У меня была аналогичная проблема, и поэтому я написал решение, кеш памяти, написанный на PHP. Требуется только сборка PHP для поддержки сокетов. Кроме того, это чисто php-решение, которое должно нормально работать на виртуальном хостинге.

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

person bucabay    schedule 01.07.2009

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

project/
  app/
  html/
    index.php
    data/
  cache/

app недоступен для записи веб-сервером (желательно и index.php). cache доступен для записи и используется для кэширования таких вещей, как проанализированные шаблоны и объекты. data, возможно, доступен для записи, в зависимости от необходимости. То есть, если пользователи загружают данные, они переходят в данные.

Веб-сервер указывает на project/html, и любой удобный метод используется для настройки index.php в качестве сценария, запускаемого для каждой страницы в проекте. Вы можете использовать mod_rewrite в Apache или согласование содержимого (мое предпочтение, но часто невозможно) или любой другой метод, который вам нравится.

Весь ваш реальный код находится в app, который не доступен напрямую веб-серверу, но должен быть добавлен в путь PHP.

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

О... и я бы использовал serialize()/unserialize() для кэширования, хотя генерация PHP-кода имеет определенную привлекательность. Все известные мне шаблонизаторы генерируют PHP-код для выполнения, что делает пост-парсинг очень быстрым.

person Michael Johnson    schedule 24.09.2008

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

person Jan Gorman    schedule 24.09.2008

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

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

person Sean McSomething    schedule 05.12.2008

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

person Linor    schedule 24.09.2008
comment
Это идея, но она недостаточно велика. Представьте, что 1000 пользователей зашли на сайт и пять раз запросили одни и те же данные. Обычно это 5000 DBIO. С вашим методом это 1000 (и много дублирующихся данных!) С ASPNET Cache (и методами, которые я упомянул выше) это 1. Это то, к чему я стремлюсь. - person Oli; 24.09.2008

На некоторых хостингах может быть скомпилирован APC. Это позволит вам хранить объекты в памяти.

person DreamWerx    schedule 24.09.2008