Методы для кэширования объектов PHP в файл? - PullRequest
25 голосов
/ 24 сентября 2008

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

Одна из лучших функций ASPNET, IMO.

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

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

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

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

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

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

Существуют ли более эффективные методы кэширования в «ограниченных» средах?

Ответы [ 8 ]

18 голосов
/ 24 сентября 2008

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

7 голосов
/ 24 сентября 2008

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

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

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

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

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

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

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

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

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

4 голосов
/ 01 июля 2009

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

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

3 голосов
/ 24 сентября 2008

То, что я всегда делаю, если мне нужно писать, - это чтобы я нигде не писал, у меня есть 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-код для выполнения, что делает пост-анализ очень быстрым.

1 голос
/ 05 декабря 2008

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

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

1 голос
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

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