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

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

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

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

受付中

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

tabe6
tabe6

総合スコア19

PHP

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

2回答

0グッド

0クリップ

9175閲覧

投稿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を引き起こす」という意味なのでしょうか?

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア4510

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

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

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

投稿2014/11/07 02:30

ysktks_17

総合スコア45

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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