Laravel 搭配 Memcached Cross Domain Session

Laravel PHP Framework

Laravel 提供了 filecookiedatabasememcachedarray 五種方式來存取 Session,預設的使用方式會是 file 存取,如果要跨 Domain 存取 Session 基本上只要設定 php.ini 裡面的 Session 相關參數即可,請注意底下 3 個參數。

完成後,只要是相同主網域內的 sub domain session 都可以互相存取,然而在 Laravel 內該如何設定,請先打開

app/config/session.php 檔案,Laravel 預設使用 Native File Session Driver,看看原本設定

'files' => storage_path().'/sessions',
'cookie' => 'laravel_session',
'domain' => null,

這三個參數都必須修改成底下

'files' => 'your session folder path',
'cookie' => 'PHPSESSID',
'domain' => '.domain.com',

PHP 預設 Session cookie name 是 PHPSESSID,另外 Laravel Session 存放位置請跟 php.ini 內設定位置一樣。到這邊設定倒是沒有什麼問題,如果改成使用 Memcached 來存放 Session,會發生無法存取同一個 Session。請先將 php.ini 改成底下設定

php_value[session.save_handler] = memcached
php_value[session.save_path] = "192.168.1.102:11211"
php_value[session.cookie_domain] = ".example.com"

另外 Laravel Session 設定請改成

'driver' => 'memcached',
'cookie' => 'PHPSESSID',
'domain' => '.example.com',

要設定 Memcached Server 請修改 app/config/cache.php

'memcached' => array(
    array('host' => '192.168.1.102', 'port' => 11211, 'weight' => 100),
),

但是這樣是不會通的,因為如果改成 Laravel Memcached Session Driver,那麼寫入跟讀出的 Session handle 將會被 Laravel Driver 取代,所以永遠拿不到一樣的 Session,此解法就是將 Session Driver 調回 Native Driver,並且修改 HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php 檔案,此檔案放在 vendor/symfony/http-foundation/Symfony/Component/ 將底下兩行程式碼註解掉即可。

ini_set('session.save_path', $savePath);
ini_set('session.save_handler', 'files');

這不是很正規的解法,不過提供給有需要搭配 Memcached 的開發者一個方向。


See also