Zend Session: общий сеанс в нескольких приложениях

Я хочу, чтобы мои пользователи из одной службы в поддомене/домене могли сразу войти в остальные.

Это моя структура:

  • /library
    • /app1
      • config
      • модули
      • начальная загрузка
    • /app2
      • config
      • модули
      • начальная загрузка
    • /app3
      • config
      • модули
      • начальная загрузка

Домены

  • Приложение 1: example.com
  • Приложение 2: app2.example.com
  • Приложение 3: app3.example.com

Все они используют одну базу данных для учетных записей, сеансов и т. д.
Я попытался заставить Session_Db_Adpater работать, когда кто-то входит в одно из приложений и сохраняет свой IP-адрес в базе данных.
Затем, когда он входит в другой скрипт (в том другом, оф.ч.) должен проверить, есть ли у него запись в таблице, и если он есть, скрипт должен сделать активным сеанс к этому или не создает ли он новый.


Пробная версия 1: я попытался просто обновить session_data до нового идентификатора из старого, но session_data отказывается обновляться, хотя $db->update() возвращает true.

Trial 2 Я отключил Session_SaveHandler_DbTable и попробовал это, потому что в конце концов они находятся в одном домене:

  Zend_Session::setOptions(array('cookie_domain' => '.example.com'));
    Zend_Session::start();

Пока ничего.

Пробная версия 3. Я использовал Zend_Session::setId();

    $db = Zend_Registry::get('users_db');    
    $test = $db->select()->from('session')->where('ip = ?', $_SERVER['REMOTE_ADDR']);
    $row = $db->fetchRow($test);
    if($row) {            
        Zend_Session::setId($row['session_id']);
    } else {
        Zend_Session::start();
        $db->update('session', array('ip'=>$_SERVER['REMOTE_ADDR']), 'session_id = "'. Zend_Session::getId() .'"');
    }

И работает 2-5 мин и потом выдает такую ​​ошибку: Сессия уже запущена. Идентификатор сеанса должен быть установлен первым.

Я заметил, что когда я вхожу, например, app3.example.com , сеанс не вставляет строку в базу данных. Адаптер работает хорошо, потому что я проверил несколько тестовых запросов, и они работают.

Я добавил в конфигурацию SessionHandler что-то вроде этого:

    $config = array(
        'db' => Zend_Registry::get('users_db') ,  //or alone 'main_db' 

Остальная часть конфигурации по умолчанию, как в ссылке.

Пожалуйста помоги.


person Aylard    schedule 25.06.2011    source источник


Ответы (1)


Вам не нужно ничего устанавливать из Zend. Просто установите следующее в файле php.ini

; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

Теперь все ваши приложения из поддоменов могут получить доступ к одним и тем же идентификаторам SESSION ID, созданным из основного приложения, и наоборот.

person Lenin Raj Rajasekaran    schedule 25.06.2011
comment
У меня нет доступа к php_ini, могу ли я сделать это через ini_set? - person Aylard; 25.06.2011