Способы кеширования объектов PHP в файл?

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

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

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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
26
0
16 977
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

Oli 24.09.2008 16:58
Ответ принят как подходящий

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

Хотел бы я гарантировать доступ к memcached, но из-за характера этих проектов я не могу контролировать развертывание ... И я действительно не могу установить это как требование. Приятно знать, что разрешение PHP писать - это еще не конец света.

Oli 24.09.2008 17:09

Я бы поспорил (и сделал stackoverflow.com/questions/126917#127165) бит достаточно безопасный. Нет ничего небезопасного в сериализации и записи, но делать это в среде общего хостинга далеко от идеала.

Alan Storm 24.09.2008 17:48

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

Shane H 30.06.2009 23:03

APC - это не просто кеш байт-кода. Он также имеет возможности кэширования в память, аналогичные memcache.

Eran Galperin 03.07.2009 01:21

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

Tim 27.04.2012 19:39

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

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

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

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.

FastCGI не очень медленный - медленнее, чем mod_php, но лучше. Спасибо за объяснение. +1

Oli 24.09.2008 18:12

Верно, но на дешевом виртуальном хостинге его сложно найти.

Alan Storm 24.09.2008 18:56

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

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

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

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

Другие вопросы по теме