Кэширование файлов PHP-запросов в серверной среде с балансировкой нагрузки - PullRequest
1 голос
/ 09 февраля 2012

Я хочу написать базовый драйвер кэширования файлов PHP в приложении PHP, которое направляет весь трафик на фронт-контроллер. Для примера предположим следующую упрощенную настройку с использованием apache mod_proxy_balancer:

enter image description here

В среде с одним сервером я бы кэшировал ответы на запросы на диске в структуре каталогов, соответствующей URI запроса. Затем простые правила перезаписи apache, подобные приведенным ниже, могут позволить apache возвращать статические файлы кэша (если они существуют) и вообще избегать процесса PHP:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /front_controller.php [L]

Очевидно, что это проблематично в среде с балансировкой нагрузки, поскольку файл кэша будет записан на диск только на том сервере PHP, где был обработан запрос, а результаты кэшированы.

Решение проблемы ...

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

И вопросы ...

  1. Можно ли выполнить какую-либо форму проверки, например, описанную выше, в RewriteRules, чтобы балансировщик нагрузки на передней панели обслуживал статический файл перед отправкой запросов на один из внутренних серверов?
  2. Это вообще желательно? Следует ли разрешать балансировщику нагрузки только для маршрутизации трафика и не беспокоиться о предоставлении статического содержимого?
  3. Было бы лучше просто использовать приемлемый TTL для кэшированных файлов на уровне сервера PHP и справиться с принятым уровнем перекрытия устаревшего кэша?

Наконец, извинения, если это слишком широко или уже был дан ответ; Я не совсем уверен, что искать в результате моего вышеупомянутого невежества по вопросу балансировки нагрузки.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Для простейшего решения вы можете использовать NFS.Монтируйте файловую систему через NFS на всех серверах PHP, и она действует как локальное хранилище, но одинакова для всех серверов.Чтобы стать немного сложнее, используйте что-то вроде Nginx или Varnish, которые могут кэшировать то, что находится в файловой системе NFS.

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

0 голосов
/ 09 февраля 2012

Это звучит как то, что Nginx мог бы легко сделать, и это избавило бы от необходимости записи в файлы на диске.

Nginx может выполнять балансировку нагрузки и кэширование, вот руководство по нему:

http://nathanvangheem.com/news/nginx-with-built-in-load-balancing-and-caching

...