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

StackOverflow https://stackoverflow.com/questions/126917

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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.Это позволит вам хранить объекты в памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top