↑こちらの記事の通りなのだが、自分なりに噛み砕いてまとめておく。

また、上記記事に追加されている下記記事のように修正するほうがよい。

要約すると、セッションは短期で切れてもいいから、ワンタイムパス的なものをクッキーで残しておいて、セッションが切れたら作り直すようにする、ということ。なるほど。


ここでは、クッキーを使用したセッションのお話しをいたします。すなわちsession.use_cookiesは1にセットされていること(PHPのデフォルト)。

◎登場する設定項目たち
主役:session.cookie_lifetime
ヒロイン:session.gc_maxlifetime
犯人役:session.gc_divisor
手下役:session.gc_probability
陰のキーマン役:session.save_path

◎クイックセットアップ
なんだか偉そうなタイトルを付けてしまった(-_-;)
・session.cookie_lifetimeに有効期限としたい秒数を設定
・session.gc_maxlifetimeにsession.cookie_lifetimeの2倍の値を設定
・(必要に応じて)session.save_pathを独自のディレクトリに設定
・(必要に応じて)session.gc_divisorを1に設定

◎説明 (ワタクシメの勝手な解釈なので、正確ではないかもしれません。。)
まず、session.cookie_lifetimeで基本的なセッションの有効期限を設定する。デフォルトで0となっていて、ブラウザを閉じたら切れるようになっている。
ただしこれだけだと、セッションのガベージコレクション(古い情報のお掃除機能)が行われた際にセッション情報が削除されてしまうらしい。
そのガベージコレクションが行われる周期がsession.gc_maxlifetimeで設定できる。
ただ、これがセッション期限設定をややこしくしている一因だと思うのだが、ガベージコレクションが行われるタイミングは、session.gc_maxlifetimeだけでなく、session.gc_divisorとsession.gc_probabilityの値によって決まる。いや、これがまたややこしいのだが、明確には決まらない。決まるのは『行われる確率』なのである。すなわち、

・session.gc_maxlifetimeの周期ごとにガベージコレクションを行うか判定する
・判定にはsession.gc_divisorとsession.gc_probabilityが用いられる
・判定のsession.gc_divisor回のうちsession.gc_probability回の割合でガベージコレクションを行う
 (つまり、session.gc_probability / session.gc_divisor の確率で行う)

よって、最短でsession.gc_maxlifetimeの周期でガベージコレクションが行われるということになりますね。なんで「max」なんだろう…?これまた事態をややこしくしているような…。

最短で、ではなく確実にsession.gc_maxlifetimeの周期でガベージコレクションを行ってほしい場合にはsession.gc_divisorを1に設定すれば良いということです。
(session.gc_divisorを変えるのではなくsession.gc_probabilityをsession.gc_divisorと同値にしても同じだろうけど、まあsession.gc_probabilityはデフォルトの1のままとしておくほうがスマートでしょう…というわけでsession.gc_probabilityのほうを「手下役」としてます(^o^;)

更に、以上で安心してはいけません。
注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。

つまり、php.iniではなくプログラム側でsession.gc_maxlifetimeを設定した場合などで、同ディレクトリを使用している場合に、期待したより短い周期でガベージコレクションが行われてしまう可能性がある、ということ。
なので、プログラム側で専用のディレクトリを用意して、そこにセッション情報を保管しましょう、っていうお話し。
うーん、これは見落としがち。。
(っていうかまさに見落としてました(*ノω・*))


◎書いていて気がついたコト
ガベージコレクションが周期実行されているとすると、session.cookie_lifetimeとsession.gc_maxlifetimeを同値としてはダメですね。
例えば、これらを86400秒(=1日)と設定したとして、
前回のガベージコレクションが23時間前に行われました。
ってタイミングでセッションを作ると、1時間後にガベージコレクションが行われ、セッションが破棄される。
ということになる。
なので、session.gc_maxlifetimeはsession.cookie_lifetimeの2倍とするべき?
(というわけでクイックセットアップのところを書き換えておいた。。)

◎書いていて気がついたコト part2
session.gc_maxlifetimeが「max」なのは、ガベージコレクションが行われる間隔が最大でこの値になる、って意味なのかも。つまり、なんらかの要因によってこれより短い間隔になるかもしれない、と。。
マニュアルにも詳しくは書いてないので、ソース読むしかないのか…(´・ω・`)


教えて〜、エライ人!