実際には、PHP セッションと codeigniter セッションという 2 つの靴のペアがあります。主な違いについて知ることは良いことです。それは基本的に codeigniter のすべてであり、セッションは大きなパーツのホイールを再発明し、いくつかの機能を追加しました。
したがって、先に進む前に、PHP マニュアルのセッションの章を参照する価値があると思われます。PHP の組み込みセッション サポートは非常に強力ですが、オブジェクト インターフェイスはありません。
たとえば、PHP セッションをデータベース (デフォルトはファイル システム) に保存するには、いわゆるセッション保存ハンドラーによってサポートされます。一部の PHP 拡張機能は、保存ハンドラー (memcache など) を提供します。念のため言っておきますが、これは memchache プロトコルと互換性のあるものなら何でも動作します (例: MySQL ) 。しかし、それはほんの一例です。ネイティブ PHP セッションに関連しないセッション クラスを探している場合は、検索に "PHP 3" を追加します。これは、バージョン 4 より前の PHP にはネイティブ セッションがなく、確かに他のセッションが必要だったため、独自のライブラリを作成したためです。
さて、正気を保つために、今日 PHP を使用して、セッションを探して、PHP セッションに触れたくないと言っているのは、ただのばかです。ファイルシステムに触れたくない場合は、Cookie に保存します。Cookie に保存したくない場合や、memcached、mysql、couchdb、ssd ファイル システムなど、高速でサーバー側のストアに保存したくない場合があります。なんでもいい。ここでは、PHP ネイティブ セッションは非常に柔軟です。
独自のユーザーランド セッション保存ハンドラーを作成し、セッションをデータベースに保存することもできます。実際には、任意のキー値ストアで実行できます。キーはセッション ID であり、値はエンコードされた (シリアル化された) セッション データです。これは 1 つのバイナリ文字列です。
ホイール コードイグナイターの再発明の次に書かれているように、探している機能がいくつかあります。基本的に、 codeiginiterのセッション コンポーネントのソース コードはいつでも調べることができますが、それほど複雑ではありません。優れた IDE を使用すると、調べたいものを選択したり、インスピレーションとして表示したりできます。
1 つの機能は、メタデータ codeigniter がセッションに割り当てることです。たとえば、リモート アドレス、セッション開始時刻 (非常に便利)、最後のアクティビティ (これも便利) です。開始するたびにこれをセッションに保存することで、独自のものを非常に簡単に模倣できます (以下の例)。そのために、独自のセッション オブジェクトを作成できます。以下は単なる例ですが、すでにいくつかの優れた機能を備えています。
- セッションの作成
- リモート IP、作成、最後のアクティビティのタイムスタンプなどのメタデータ。
- 該当する場合、Cookie の破棄。
使用法:
$session = new Session();
$session['foo'] = 'bar';
$session->destroy(); // yes, full destroy
コード:
/**
* Session class
*
* @license MIT
* @license-year 2012
* @license-copyright-holder hakre <http://hakre.wordpress.com>
*/
class Session implements ArrayAccess
{
private $meta = '__meta';
private $started;
public function __construct()
{
if (ini_get('session.auto_start')) {
$this->started = true;
$this->start();
}
}
public function start()
{
$this->started || session_start();
(isset($_SESSION[$this->meta]) || $this->init())
|| $_SESSION[$this->meta]['activity'] = $_SERVER['REQUEST_TIME'];
$this->started = true;
}
/**
* write session data to store and close the session.
*/
public function commit()
{
session_commit();
}
public function destroy()
{
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
public function get($name, $default = NULL)
{
return isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
}
/**
* @return string
*/
public function getName()
{
return session_name();
}
private function init()
{
$_SESSION[$this->meta] = array(
'ip' => $_SERVER['REMOTE_ADDR'],
'name' => session_name(),
'created' => $_SERVER['REQUEST_TIME'],
'activity' => $_SERVER['REQUEST_TIME'],
);
return true;
}
/**
* Whether a offset exists
* @link http://php.net/manual/en/arrayaccess.offsetexists.php
* @param mixed $offset
* @return boolean true on success or false on failure.
* The return value will be casted to boolean if non-boolean was returned.
*/
public function offsetExists($offset)
{
$this->started || $this->start();
return isset($_SESSION[$offset]);
}
/**
* Offset to retrieve
* @link http://php.net/manual/en/arrayaccess.offsetget.php
* @param mixed $offset
* @return mixed Can return all value types.
*/
public function offsetGet($offset)
{
$this->started || $this->start();
return $this->get($offset);
}
/**
* Offset to set
* @link http://php.net/manual/en/arrayaccess.offsetset.php
* @param mixed $offset
* @param mixed $value
* @return void
*/
public function offsetSet($offset, $value)
{
$this->started || $this->start();
$_SESSION[$offset] = $value;
}
/**
* Offset to unset
* @link http://php.net/manual/en/arrayaccess.offsetunset.php
* @param mixed $offset
* @return void
*/
public function offsetUnset($offset)
{
unset($_SESSION[$offset]);
}
}
要約すると、PHP セッションを使用する場合は、PHP セッションを使用します。それらは強力ですが、その上に処理を追加したい場合があります。上記のクラスの例Session
は、セッションのライフサイクル (初期化、更新、破棄) を処理します。PHP 自体が、実際のセッションの開始とその保存を処理します。もちろん、セッション ストレージ用のクラスを追加することもできますが、パフォーマンスとシンプルさが気になる場合は、通常、これらはすべて php.ini 内で構成できます。
これとは別に、より高度なものがあります。
- セッション ID の再生成 (PHP はそれをサポートしているため、クラスに簡単に追加したり、PHP の関数を呼び出したりすることができます)
- あるセッションから別のセッションへのデータのコピー (PHP はこれを簡単にサポートしていません。必要な場合は、そのような機能をセッション クラスにラップする価値があります。codeigniter にはそれもありません)
- セッションが現在実行されているかどうかのステータスの取得 (グローバル PHP セッション)。クラスは、必要な場合にのみ
Session
追加するのに適した場所 です。関連する質問でコードを見つけます:セッションがアクティブかどうかを確認する方法は?
だから、あなたが必要なものを見つけてください。そのように実装すると、かなり簡単になります。独自の Session クラスを賢く作成し、上記のクラスをベースとして自由に使用し、必要な機能を追加してください。