質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

10576閲覧

PHPのガベージコレクションの発生確率について

tabe6

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2014/11/06 01:37

PHPのマニュアルでは
http://php.net/manual/ja/session.configuration.php
セッションのガベージコレクションは、php.iniのsession.gc_probabilityとsession.gc_divisorの値で決まるようです。session.gc_probabilityがデフォルト値1、session.gc_divisorがデフォルト値100で、ガベージコレクションの確率はsession.gc_probability/session.gc_divisorで、1/100になります。

現在、開発しているサイトでユーザに半年などの長期間のセッションを持たせたいため、悩んでいます。
この「ガベージコレクションが起きる確率」というの「1つのセッションが延長されている間は常に特定のセッションがクリーンアップされる可能性が1%」という意味でしょうか? それとも、「(新しいものもふくめて)すべての既存のセッションの1%が他のセッションに対してGCを引き起こす」という意味なのでしょうか?

後者の場合だと、長期間のセッションは無理だと思いましたので質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

セッションが開始するたびに session.gc_probability/session.gc_divisor の確率で、すべてのセッションファイルが走査されて、session.gc_maxlifetime よりも古いものが削除されます。

よって、

「1つのセッションが延長されている間は常に特定のセッションがクリーンアップされる可能性が1%」
「(新しいものもふくめて)すべての既存のセッションの1%が他のセッションに対してGCを引き起こす」

後者です。

セッションを長くしたければ session.gc_maxlifetime を大きくすればできますが(勿論 session.cookie_lifetime も大きくする必要があります)、その場合、セッションファイルを格納したディレクトリには途方もない量のファイルが作成されてしまい、たまたま GC を引いてしまったユーザーはそのときの応答が遅くなる、という可能性があるように思います。

なので、セッションの GC は無効にして cron とかでアクセス数の少なそうな時間帯を狙ってセッションファイルを削除するバッチを走らせる、という選択肢もあると思います(実際にそんな長期間のセッションをやったことはありませんが・・・)。

あと、PHP のガベージコレクション だと、普通は 別のもの なので、PHP のセッションのガベージコレクション と言ったほうが良いと思います。

投稿2014/11/09 15:44

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHPのスクリプトがセッションをスタートするたびに、古いセッションのフォルダが削除されます。
一定の期間アクセスがなかったセッションだけが削除されますが、仕様として確実にどの期間までにセッションを削除する・・・というようなルールはありません。

6ヶ月の長期のセッションもうまくいくとは思いますが、確率は1%よりも0.1%の方がよいかもしれませんね。
それと半年という長期になりますと、PHP側は何もなくてもOSの再起動が発生するかもしれません。そのときに/tmp配下が削除されてしまうので、そういうケースも考慮する必要があります。

投稿2014/11/07 02:30

ysktks_17

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問