12797


サーバはWindows2012/IIS8/PHP5.6です

PHPのアプリを複数作成し同一のサーバないで動作させていますが、  
アプリ毎にセッションを独立させる方法がわかりません

そのため、同一マシンからアクセスした際、  
違うアプリ同士でも同じセッションIDを使用してしまうともう片方のアプリからセッション内容を上書きされてしまいます

C:\PhpApp\AppA  
C:\PhpApp\AppB  
として、アプリをAppA/AppBと作成し、IIS上からはそれぞれ別アプリとして設定しています  
ただ、PHPにはその設定を反映させる方法がわからず、  
PhpAppという全体で一つのアプリとして認識されているようです


CC BY-SA 3.0
2015-07-29T06:18:50.313
12789
2015-08-03T01:07:40.653
10098
question
php iis sessionid
PHPでアプリ毎にセッションを分離する


目的(ゴール)がちょっと分からないのですが、  
アプリ毎にセッションを分けたいって事で良いですかね？  
多分、同一のPHP設定になっているから同じセッションの保存先を見るのかと思いますが……

セッションファイルの保存先は  
**php.ini** に記述されている`session.save_path`の項目で決まっており  
設定が同じであれば同じセッションを呼び出します。  
ですので、php.iniが別々に分かれているのであれば上記項目を変更しましょう。  
もし同一であればセッションファイルを保存しているディレクトリをアプリ毎に変更する必要があります。  
また変更する際の注意ですが、  
セッション関連の設定を変更する際は、必ず`session_start();`の前に行う必要があります。

[code]

    //セッションファイルの保存先を変更。アプリ毎にディレクトリ変更すれば良い。
    //(普通は"tmp"に保存される。"tmp\appa"でセッションディレクトリ下に置いた方が管理しやすい)
    session_save_path('C:\PhpApp\session\appa');
    //OR
    session_save_path('C:\PhpApp\session\appb');
    
    //GC設定を変更
    //GC使う
    ini_set('session.gc_probability', 1); 
    //セッション破棄確立1/1000
    ini_set('session.gc_divisor', 1000); 
    //セッション有効期限(秒)：1時間
    ini_set('session.gc_maxlifetime', 60 * 60);
    
    //セッション開始
    session_start();
    
[/code]

正直なところ、  
どういった値か不明なのでセッションを使う意図すらも分からないのですが  
同一設定環境下で実行するなら、自分は上記みたいにセッションの保存先を変更するのではなく  
Key名にアプリ名の略称でも使い接頭辞を付与して同じセッションIDで管理します。  
理由としては、アプリを変更する度にセッションファイルが変わり  
GCが動くまでゴミデータが増えるからですかね……  
1ユーザに対してセッションファイルは出来るだけ1つで済ませたいものです

**追記：**  
でもunaristさんの回答も踏まえて考えたけど  
結局の所、コード中でアプリ判定するなら  
態々php.iniの設定変えてまで  
セッションファイル１つ余計に増やす必要性無いと思うんだよね  
key名分ければいい話なんだし……

[code]

    $app_name = 'appb';
    session_save_path('C:\PhpApp\session\$app_name');
    session_name($app_name);
    /** GC設定略 **/
    session_start();
    
[/code]

↓↓↓↓↓↓↓↓↓↓

[code]

    $seskey = 'apb_';
    $_SESSION[$seskey.'key'];
    
[/code]


CC BY-SA 3.0
2015-07-29T08:16:29.753
12797
2015-07-30T04:48:12.387
2015-07-30T04:48:12.387
7676
7676
12789
answer


`session.save_path` の変更は最低限必要ですが、これだけではセッションIDを保持するCookieは依然共有されることになります。例えば
`session_regenerate_id()` でセッションIDを更新した場合、もう一方のセッションにアクセスできなくなります。

これは `session.cookie_path` でCookieの送出先を限定したり、 `session.name`
でCookieの名前を別のものにすることで回避することができると思います。

[code]

    session_save_path('...');
    session_name('AppB');
    session_start();
    
[/code]

例えばこのようにすると、 `PHPSESSID` の代わりに `AppB` がCookieの名前として用いられます。


CC BY-SA 3.0
2015-07-29T09:38:22.223
12802
2015-07-29T09:38:22.223
8000
12789
answer


お二人ともありがとうございます。  
今回はとりあえず、セッションファイルを分けて解決しました  
元々別のサーバにあった全く別のアプリを無理矢理移植して、とにかくセッション情報が混じらず動くようにするという目的があったもので、頼らせていただきました。

テストもうまくいったので、今回はこれで解決とさせてください(IDの変更などは今回は無しでなんとかなりました)


CC BY-SA 3.0
2015-08-03T01:07:40.653
12962
2015-08-03T01:07:40.653
10098
12789
answer