3 回答

TA貢獻1810條經驗 獲得超4個贊
哈哈,我之前也是被這個搞蒙了很長一段時間。
不過后來解決了,很簡單,不在寫入session的地方使用dd
,dump
等方法。
laravel保存session是在中間件中進行的,源代碼如下
public function handle($request, Closure $next)
{
$this->sessionHandled = true;
// If a session driver has been configured, we will need to start the session here
// so that the data is ready for an application. Note that the Laravel sessions
// do not make use of PHP "native" sessions in any way since they are crappy.
if ($this->sessionConfigured()) {
$session = $this->startSession($request);
$request->setSession($session);
}
$response = $next($request);
// Again, if the session has been configured we will need to close out the session
// so that the attributes may be persisted to some storage medium. We will also
// add the session identifier cookie to the application response headers now.
if ($this->sessionConfigured()) {
$this->storeCurrentUrl($request, $session);
$this->collectGarbage($session);
$this->addCookieToResponse($response, $session);
}
return $response;
}
保存session的function
protected function addCookieToResponse(Response $response, SessionInterface $session)
{
if ($this->usingCookieSessions()) {
$this->manager->driver()->save();
}
if ($this->sessionIsPersistent($config = $this->manager->getSessionConfig())) {
$response->headers->setCookie(new Cookie(
$session->getName(), $session->getId(), $this->getCookieExpirationDate(),
$config['path'], $config['domain'], Arr::get($config, 'secure', false)
));
}
}
可以看到,保存session的方法在 $response = $next($request)
之后進行的,你在你的代碼中使用了dd()、dump()、exit()
等方法,后面的保存session的代碼將不能執行。

TA貢獻1828條經驗 獲得超13個贊
Laravel的session機制是:在程序的運行的過程中是把你的對session的操作用一個類記錄在內存中,然后在response發送給用戶以后執行session中間中的terminate方法把session數據持久化到相應的介質中去。如果在windows和linux下面沒問題,到了mac下就出了題很有可能是最后持久化的時候出了問題。
你是否更改了存儲介質,比如從redis變到了文件。那么那個文件有沒有寫的權限?要給storage目錄足夠的權限
如果是用內存存儲的session那么redis或者memerycache是否配置正確?
還有就像樓上說的那樣,不要用dd,因為dd完之后會終止程序,session就不會持久化,只是將運行內存中的值給你打印出來了而已。
還有一個debug方法,在Session::put()之后加一句
Session::save();
這句代碼是手動持久化session。如果成功說明你的session持久化沒問題,只是你程序運行的時候沒有到持久化這一步。
如果失敗回報失敗的原因。
有一次我遇到了session寫不進去是因為硬盤滿了...

TA貢獻1818條經驗 獲得超3個贊
從代碼上來看應該沒問題,很簡單的邏輯,而且在 windows 和 linux 上都是正常的。
個人再提供個思路:看下在 chrome Application 的 laravel_session 值。
- 3 回答
- 0 關注
- 475 瀏覽
添加回答
舉報