亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

運作正常的代碼(laravel)遷移到Mac上取不到session

運作正常的代碼(laravel)遷移到Mac上取不到session

PHP
慕無忌1623718 2019-03-11 14:15:11
我在windows和linux上都正常的項目,放到mac上后,取不到session為了避免laravel項目的session()不能即時,我使用了Session::put()可是依然沒用,請問如何解決呢? 補充一下:如果我在寫入session的地方打個斷點,在存入session后,調用一下,是可以正常取到值的。請解惑。。
查看完整描述

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的代碼將不能執行。

查看完整回答
反對 回復 2019-03-18
?
慕田峪7331174

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寫不進去是因為硬盤滿了...

查看完整回答
反對 回復 2019-03-18
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

從代碼上來看應該沒問題,很簡單的邏輯,而且在 windows 和 linux 上都是正常的。

個人再提供個思路:看下在 chrome Application 的 laravel_session 值。

查看完整回答
反對 回復 2019-03-18
  • 3 回答
  • 0 關注
  • 475 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號