2015-04-27 3 views
2

Я в процессе обновления нашего проекта от Centos-6/Apache 2.0/PHP5.3/Cake 2.0/File Cache (6/3/2/0/F) в Centos-7/Apache 2.4/PHP5.6/Cake 2.6/Redis Cache & Сессия (7/6/4/6/R).CakePHP 2.6, Redis сеанс/кеш уничтожается при перенаправлении

Обновление работает отлично и по назначению, если я оставлю 7/6/4/6/R с кешированием файлов и сеансами php. Но я установил Redis, следуя нескольким учебным пособиям, и все работает по принципу PHP 5.6, признавая Redis, CakePHP получает 18 на 18 проходов тестов в test.php, но Redis Sessions уничтожаются в Redirects.

core.php

//Replaces standard 
Configure::write('Session', array(
'defaults' => 'cache', 
'timeout' => '100', 
'start' => true, 
'checkAgent' => false, 
'handler' => array(
'config' => 'session' 
) 
)); 
//Engine 
$engine = 'Redis'; 

//Bottom of Core 
Cache::config ('session', array (
'Engine' => $engine, 
'Prefix' => $prefix . 'cake_session_', 
'Duration' => $duration 
)); 

Bootstrap.php

Cache::config('default', array('engine' => 'Redis')); 

AppController.php

public $components = array(
    'Session', 
    'Auth' => array(
     'loginRedirect'=>array('controller' => 'companies', 'action' => 'view'), 
     'logoutRedirect'=>array('controller' => 'users', 'action' => 'login'), 
     'loginAction'=>array('controller' => 'users', 'action' => 'login'), 
     'authenticate' => array(
      'Form' => array(
       'userModel' => 'User', 
       'fields' => array('username' => 'email', 'password' => 'password') 
      ) 
     ) 
    )); 

UsersController.php - Войти Функция - C & P'd из блога, например

if ($this->request->is('post')) { 

    if ($this->Auth->login()) { 
     //print_r($_SESSION);die(); 
     return $this->redirect($this->Auth->redirectUrl()); 
    } 
    $this->Session->setFlash(__('Invalid username or password, try again')); 
} 

напечатает, предназначенные и весь ключ => значения массива Session. ИДЕАЛЬНО!!! Теперь, если я разрешу перенаправление.

CompaniesController.php

public function view($id = null) { 
     print_r($_SESSION); 
} 

Не содержит ключ => значение.

ответ

0

Есть два дополнительных элемента для проверки. После того, как они были модифицированы, Redis отлично справился с Cake 2.6.4.

1) Повторно проверьте ваш phpinfo() и убедитесь, что локальные переменные сеанса не блокируются глобальными настройками php.ini. Мои были из httpp's php.conf.

2) session_start() необходимо добавить, хотя CakePHP Documentation заявляет, что вам не нужно использовать эту команду, если используется загруженный компонент Session или Auth. Я поместил команду в строку один из веб-роуток.

0

Вам нужно вызвать session_write_close перед перенаправлением, поскольку internal session_write_close вызывается __destroy.

Но это событие происходит после того, как вы отправили заголовок «Местоположение:».

Попробуйте это в AppController:

public function redirect($url, $status = null, $exit = true) { 
    if ($exit && $this->Components->enabled('Session') && $this->Session->started()) { 
     session_write_close(); 
    } 
    return parent::redirect($url, $status, $exit); 
} 

Такая же проблема все еще в Cake3. В symfony2 он исправлен - перед тем, как компонент сеанса перенаправления закрывается.

Смежные вопросы