1

CodeIgniter セッション クラスに似た PHP セッション クラス? 存在しますか?

検索してみましたが、有用な結果が得られませんでした。私は CodeIgniter セッション クラスを使用していました。

ユーザーの一意のセッション ID、ユーザーの IP アドレス、ユーザーのユーザー エージェント データ、最後のアクティビティ、および手動で提供されたその他の情報を保存します。これらの情報はデータベース (MySql) に保存されます。このクラスは、一意のセッション ID をデータベースのセッション ID と照合するために Cookie を作成します。私の意見では、このクラスは非常に安全です。

このクラスを CodeIgniter の外部で (CodeIgniter を使用せずに) 使用したいと考えています。これらの機能を備えたクラスを推薦してくれる人はいますか?

ありがとう!

4

2 に答える 2

5

実際には、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 クラスを賢く作成し、上記のクラスをベースとして自由に使用し、必要な機能を追加してください。

于 2012-07-21T23:09:32.717 に答える