2011-04-16 47 views
1

我正在Apache上運行PHP/Yii應用程序。我試圖做到以下幾點:更改符號鏈接會破壞PHP會話

  1. 我的DocumentRoot是「www」,它是一個符號鏈接。將/ usr/local/src/releases/mysite-1/www目錄重命名爲/ usr/local/src/releases/mysite -2/WWW
  2. 我使用刪除舊符號鏈接的WWW:RM -f WWW
  3. 我創建一個使用一個新的符號鏈接:LN -s在/ usr/local/src目錄/發行/ mysite的-2/WWW萬維網

只是這樣做會導致PHP會話被銷燬,甚至沒有重新啓動Apache。有任何想法嗎?我檢查了我的PHP save_path,並且它不應該是一個問題,因爲我使用Redis進行會話處理。我的Apache配置是這樣的:

DocumentRoot "www" 
<Directory "www"> 
    Options -Indexes +FollowSymLinks 
    RewriteEngine on 
    # if a directory or a file exists, use it directly 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    # otherwise forward it to index.php 
    RewriteRule . index.php 
    ... 

編輯: 我懷疑問題是與誼。經過一些進一步的測試後,它看起來不像會話數據實際上被破壞。我已經切換到基於文件的會話。這是我所看到的:

  1. 用戶登錄和會話ID設置爲tdv3l6jgf2sb1dnutt7updhfo1

  2. 會話數據的模樣:

    陣列(5){ [「20b30da82f6dcc260a66f6a1044a5c3a_ ID 「] =>串(1) 」2「 [」 20b30da82f6dcc260a66f6a1044a5c3a _name 「] =>串(8) 」ewest FB「 [」 20b30da82f6dcc260a66f6a1044a5c3afbId 「] =>串(10) 」1028251971「 [」 20b30da82f6dcc260a6 6f6a1044a5c3aisFbUser「] => bool(true) [」20b30da82f6dcc260a66f6a1044a5c3a__states「] =>數組(3){ [」fbId「] => bool(true)[」isFbUser「] => bool(true)[」avatar「] => BOOL(真) } }

  3. 會話文件/ tmp下

  4. 創建我改變WWW符號鏈接,如上所述。會話ID保持不變,會話數據完好無損!但Yii :: app() - > user-> isGuest正在評估爲true。所以會議數據仍然存在,但Yii認爲我退出了!

Yii是否有另一個位置將用戶數據寫入? state.bin文件位於www外部的運行時目錄中。

+0

在第一次看我不明白這到底是怎麼的,但做會議仍然會出現在Redis的步驟後, 2和3? – Fanis 2011-04-16 06:28:06

+0

我認爲所有這些都與啓用allowAutoLogin綁定在一起。更改符號鏈接會導致Yii使用的Cookie ID丟失。它不會導致PHP會話丟失。 – Simian 2011-04-16 23:41:49

+0

對於其他已登陸此處的用戶,在更改每個構建的文檔根目錄(而不是使用符號鏈接)時,我們遇到了類似的會話丟失問題。原因是'suhosin.session.cryptdocroot'標誌導致會話加密密鑰依賴於Documentroot字段 – Thomas 2015-06-09 01:08:29

回答

2

我無法弄清楚是什麼導致了這個問題,但我想出了一個解決方法。

相反的:

  1. 更改WWW符號鏈接到d-xxx其中xxx是發行版

我現在:

  1. 移動舊版本目錄 「d」,以d -yyy其中yyy是舊發行版本
  2. 將新版本提取到「d」
  3. 「www」符號鏈接仍然指向「d」

因此,「www」符號鏈接的真正路徑從不改變。這解決了這個問題,我不知道爲什麼這會起作用。除此之外,我手動設置了Yii的securityManager的validationKey和encryptionKey。

我懷疑在這一點上唯一的事情是APC和我的設置不知情的事情。

0

有Yii中的1.x代碼怪: СApplication.php

public function getId() 
{ 
    if($this->_id!==null) 
     return $this->_id; 
    else 
     return $this->_id=sprintf('%x',crc32($this->getBasePath().$this->name)); 
} 

所以,你只需要設置應用程序ID在你的應用程序配置文件。

例如,保護/配置/ web.php

return [ 
     'id'=>'my application' 

...