Как управлять одним сеансом PHP5 на нескольких серверах Apache? - PullRequest
13 голосов
/ 27 июня 2011

Привет! Мне нужно получить данные с нескольких веб-серверов.Сначала я захожу как пользователь на свой веб-сайт.После успешного входа я должен получить данные с разных веб-серверов и отобразить их.Как я могу поделиться одним сеансом с несколькими серверами.Как мне этого добиться?

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

Ответы [ 5 ]

13 голосов
/ 27 июня 2011

Вам придется использовать другой обработчик сеанса.

Вы можете:

  • создать свой собственный (см. session_set_save_handler) или
  • использует расширения, которые предоставляют собственный обработчик сеанса, например memcached
9 голосов
/ 28 июня 2011

В дополнение ко всем этим ответам:

Если вы храните сессии в базах данных, убедитесь, что сборщик мусора сессий в PHP действительно активирован (это не относится к дистрибутивам, подобным Debian, они решили собирать сессии с помощью своего собственного cron и изменили php.ini, чтобы он никогда не запускал gc, поэтому проверьте session.gc_probability и session.gc_divisor). Основная проблема сессионного хранилища в базе данных состоит в том, что оно требует большого количества запросов на запись и большого количества противоречивого доступа к базе данных. Это отличный способ подчеркнуть сервер базы данных, как MySQL. Так что, имхо, лучше использовать другое решение, это позволит лучше соотнести чтение и запись в базе данных.

Вы также можете сохранить систему хранения файлов и просто разделить каталог файлов между серверами с NFS . Измените настройку session.save_path, чтобы использовать что-то отличное от /tmp. Но NFS по определению не самый быстрый способ использования диска. Предпочитаю memcached или mongodb для быстрого доступа.

Если единственное, что вам нужно для общего доступа между серверами, это Аутентификация , то вместо совместного использования реального хранилища сеансов вы можете поделиться учетными данными аутентификации. Как и система OpenId в SO, это то, что мы называем SSO, для веб-части у вас есть несколько решений, от OpenId до CAS и другие. Если данные объединяются на стороне клиента (ajax, ESI-gate), то вам не нужно общее хранилище данных сеанса на стороне сервера. Это позволит избежать одновременной записи 3 из 5 затронутых веб-приложений в общий сеанс. Другие методы совместного использования сеансов (база данных, NFS, даже memcached) в основном используются для обмена вашими данными между несколькими серверами, потому что инструменты балансировки нагрузки могут передавать ваш последовательный HTTP-запрос с одного сервера на другой, но если вы действительно имеете в виду параллельный сбор данных, вам действительно нужно учеба ССО.

7 голосов
/ 27 июня 2011

Другой вариант - использовать memcached для хранения сеансов.

Важно то, что у вас должен быть общий ресурс - будь то база данных SQL, memcached, база данных NoSQL и т. Д., К которой могут обращаться все серверы.Затем вы используете session_set_save_handler для доступа к общему ресурсу.

5 голосов
/ 27 июня 2011

Сохраните его в базе данных - подключите все серверы к этой базе данных. Первый результат для " php store session в базе данных "

5 голосов
/ 27 июня 2011

Хранение сеансов в базе данных, которая доступна из всего пула серверов.

...