2016-09-04 4 views
4

У меня есть один вопрос, я использую nginx и PHPFPM. Я использую loadbalancer для 2 сервера phpfpm.NGINX + phpFPM балансировщик нагрузки и сеансы

Чтобы синхронизировать сеансы с обоих серверов phpfpm, я использовал memcached. Но когда я использую memcached, я вижу, что страница замедляется.

Когда я использую файлы как сеансы, сохраняю тип, веб-браузер работает быстрее, но сеансы не синхронизируются сразу (я думаю, файлы являются автономными). Я использую NFS для обмена сеансами.

Любые идеи, пожалуйста, как синхронизировать сеансы при использовании nginx loadbalancer для серверов phpfpm?

+0

Что я имею в виду: «страница замедляется»? Это визуальный эффект, или вы выполнили некоторые измерения? –

ответ

2

Увеличение скорости, которое вы, вероятно, видите здесь, на PHP с использованием NFS по memcached, является порядочным обманчивым. Хранилище сеансов PHP по умолчанию блокирует получение по принципу «первым пришел-первым-обслужен». Это означает, что два одновременных запроса, сделанных для PHP для одного и того же сеанса, заставят первый запрос заблокировать сеанс, пока не будет выполнен PHP, или вы явно вызываете session_write_close() из своего кода, чтобы освободить блокировку.

Но в хранилище сеансов, основанном на файлах, PHP полагается на flock, который не работает в NFS.

Сервер NFS (версии 2 и 3) протокол не файл поддержки блокировки

See this answer on unix stackexchange

Так что для распределенной сессии магазине, вы редко хотите медленный замок на основе файловой системы. В любом случае большинство хранилищ в памяти работают быстрее. И поскольку NFS обычно не может обрабатывать вызовы flock, ваши сеансы будут повреждены, если два одновременных запроса попытаются записать в тот же файл сеанса. Другими словами, то, что вы видите как быстрее, - это в основном ваши запросы, потенциально искажающие их сеансы быстрее, потому что в сеансе для параллелизма нет блокировки.

Если ваши запросы занимают очень много времени и не требуют сеанса, лучше всего сразу позвонить по номеру session_write_close в начале кода, когда вы закончите сеанс, чтобы любые другие входящие запросы могли попасть в сессия. Обычно это проблема, когда вы делаете много запросов на длительный опрос PHP (скажем, через AJAX).