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

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

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

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

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

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

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

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

Есть ли другой метод persist-to-file, который я забываю?

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

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

Re: Есть ли другой метод persist-to-file, который я забываю?

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

Re [2]: Сохраняется ли файл в безопасности? и дешевый общий хостинг-аккаунт)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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