しばらく働いていると、誰もが次のような問題に遭遇したことがあると思います。
1. フロントエンド ユーザーは理由がわからないまま自動的に切断されました。
2. バックグラウンドからログアウトすると、すべてのフロントエンド ユーザーもオフラインになります。
3. 30 分後に自動的にオフラインになるようにユーザーを制御したいのですが、構成ファイルを変更しても機能しないことがわかりました。
上記の問題はすべて最近私が遭遇したもので、後で問い合わせてみると、PHP のセッション メカニズムは複数のパラメータによって同時に制御されていることがわかりました。具体的なパラメータについては書きません。 php.ini には、セッション ストレージ パスもあります。これは、PHP セッションのデフォルトの有効期限が 24 分であることを示しています。これは、ページを 24 分間操作しないとセッションが期限切れになることを意味します。もちろん、これは理想的には、24 分後にセッション リサイクル メカニズムを開始し、デフォルトのストレージ ディレクトリ内のセッション ファイルの変更時刻が 24 分前であるかどうかを検出するために使用されます。もちろん、これは、前述した確率に基づいて、セッションが 24 分前のファイルであっても、リサイクル メカニズムがトリガーされるのが理想的な状態です。もちろん、これは私たちが望んでいることではありませんが、セッションを有効にしない場合は、前述した 3 番目のパラメータが表示されます。 .save_path を php.ini 内に追加すると、セッションにはファイルが生成されないため、セッションをより効果的に制御するには、セッションを開いてパスを入力するか、 session_save_path("...") 関数を使用します。もう 1 つの重要な点は、セッションが自分で定義したパスに保存されている場合、セッションのリサイクル メカニズムが機能しないため、セッションの有効期限を制御することしかできないということです。私たち
以下は私の理解に基づいて書いたセッションに関する有効期限処理クラスです
<?php class Session{ private $savePath;//存储session的路径,必须是绝对路径 private $time;//存储session的过期时间,单位是秒 private $sessionName;//session的名字 private $sessionValue;//session的值 public function __construct($savePath) { //将session存入指定的目录 $this->savePath = $savePath; //注意:这个一定要写在session_start前面 session_save_path($this->savePath); session_start();//开启session if(!is_dir($this->savePath)) { //默认为最大的权限 0777 mkdir($this->savePath) or die('系统错误!'); } } //创建session 一共三个参数, // $name->session名字 // $val->session值 // $time->过期时间,默认为30分钟 public function setSession($name,$val,$time=1800) { $this->sessionName = $name; $this->sessionValue = $val; $this->time = $time; if(!isset($_SESSION[$this->sessionName])) { if(is_array($this->sessionValue)) { foreach($this->sessionValue as $key=>$val) { $_SESSION[$this->sessionName][$key] = $val; } } else { $_SESSION[$this->sessionName]['val'] = $this->sessionValue; } $_SESSION[$this->sessionName]["startTime"] = time(); } //这时候说明session已经存在,那么我们判断他是否过期,如果过期,删除session else if(isset($_SESSION[$this->sessionName]["startTime"]) && time()-$_SESSION[$this->sessionName]['startTime']>=$this->time) { unset($_SESSION[$this->sessionName]); } } } ?>
このクラスを通じて、いくつかの目的を達成できます:
1. セッションの有効期限を明確に制御できます。
2. 上記の 2 番目の質問に対応して、ユーザーとしてログアウトするときは、通常 session_destroy() または unset($_SESSION); を書きましたが、これによってすべてのセッションがクリアされるかどうかはわかりません。前のユーザーが終了した後、私たち自身のセッションも削除されました。
3. すべてのステップが透過的に行われるため、ユーザーは理由もなく切断されることはありません。