ホームページ > バックエンド開発 > PHPの問題 > PHPでのセッションの使い方を詳しく解説

PHPでのセッションの使い方を詳しく解説

hzc
リリース: 2023-03-01 16:40:01
オリジナル
3170 人が閲覧しました

PHPでのセッションの使い方を詳しく解説

Session の宣言と使用方法

Session の設定は Cookie やセッションとは異なります。開始するには、PHP で session_start() を呼び出す必要があります。 session_start() 関数の構文形式は次のとおりです。

Bool session_start(void) //セッションを作成し、セッションを開始し、セッションを初期化します

注: session_start() 関数の前の出力

初めて Web サイトにアクセスすると、Seesion_start() 関数は一意のセッション ID を作成し、HTTP 応答ヘッダーを通じてそのセッション ID をクライアント Cookie に自動的に保存します。同時に、ユーザーのセッション情報を保存するために、サーバー側でセッション ID に基づいた名前のファイルも作成されます。同じユーザーが再度この Web サイトにアクセスすると、Cookie に保存されている Seesion ID が HTTP リクエスト ヘッダーを通じて自動的に引き継がれます。このとき、Session_start() 関数は新しいセッション ID を割り当てず、サーバーのハード検索を行います。セッション ID と同じ名前のセッション ファイルをディスクに保存し、このユーザー用に以前に保存されたセッション情報を読み出し、それを現在のスクリプトに適用して、このユーザーを追跡するという目的を達成します。セッションは、次のような配列の形式で使用されます。 $_SESSION['セッション名']

関連トピックの推奨事項:php session (含む)写真、テキスト、ビデオ、ケース)

セッション変数を登録してセッションを読み取る

PHP でセッション変数を使用する場合、セッション変数を開始するだけでなく、登録手続き。 $_SESSION配列にアクセスすることでセッション変数の登録と読み込みが完了します。 $_SESSION 連想配列のキー名には、PHP の通常の変数と同じ命名規則があります。セッション変数を登録するコードは次のとおりです:

<?php
//启动session的初始化
session_start();
//注册session变量,赋值为一个用户的名称
$_SESSION["username"]="skygao";
//注册session变量,赋值为一个用户的ID
$_SESSION["uid"]=1;
?>
ログイン後にコピー

スクリプトを実行すると、2 つのセッション変数がサーバー側のファイルに保存されます。ファイルの場所は php.ini ファイルにあります。セッション内 .save_path 属性で指定されたディレクトリ内。

変数の登録を解除してセッションを破棄する

セッション変数が使用されている場合は削除することができ、セッションの終了時にも破棄することができます。ユーザーが Web システムからログアウトすると、ログアウト機能が提供される必要があり、ユーザーの情報はすべてサーバー内で破棄されます。現在のセッションに関連するすべてのデータを破棄するには、session_destroy() 関数を呼び出して現在のセッションを終了し、セッション内のすべてのリソースをクリアします。この関数の構文形式は次のとおりです。

  bool session_destroy(void) //销毁和当前Session有关的所有资料
ログイン後にコピー

この関数は、現在のセッションに関連する変数を解放したり、クライアント Cookie に保存されたセッション ID を削除したりしません。 $_SESSION 配列とカスタム配列は同じように使用されるため、unset() 関数を使用してセッションに登録された単一の変数を解放できます。以下に示すように:

  unset($_SESSION[&#39;键名&#39;]);
ログイン後にコピー

unset($_SESSION) を使用して $_SESSION 配列全体を削除しないように注意してください。そのため、$_SESSION スーパー グローバル配列を介して変数を登録できなくなります。ただし、ユーザーがセッションに登録したすべての変数を削除したい場合は、配列変数 $_SESSION を空の配列に直接割り当てることができます。以下に示すように:

 $_SESSION=array()
ログイン後にコピー

PHP のデフォルトのセッションは Cookie に基づいています。セッション ID はサーバーによってクライアントの Cookie に保存されます。したがって、セッションからログアウトするときは、セッションに保存されているセッション ID もクリアする必要があります。 Cookie、これには setCookie.() 関数の助けが必要です。 PHP スクリプトでは、session_name() 関数を呼び出すことでセッション名を取得できます。クライアント Cookie に保存されているセッション ID を削除します。コードは次のとおりです:

<?php
//判断Cookie中是否存在session ID
if(isset($_COOKIE[session_name()])){
    //删除包含Session ID的cookie,注意第四个参数一定要和php.ini设置的路径相同
    setcookie(session_name(),&#39;&#39;,time()-3600,&#39;/&#39;);
}
?>>
ログイン後にコピー

前の説明から、セッション ログアウト プロセスには合計 4 つの手順が必要であると結論付けることができます。次の例では、完全な 4 ステップのコードが提供されています。スクリプトを実行すると、セッションが閉じられ、このセッションに関連するすべてのリソースが破棄されます。コードは次のとおりです:

<?php
//第一步:开启Session并初始化
session_start();

//第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除
$_SESSION = array();

//第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
    setCookie(session_name(), "", time()-42000, "/");
}

//第四部:最后彻底销毁session
session_destroy();

?>
ログイン後にコピー

session の phpini 構成オプション

php.ini ファイルとセッションに関連するいくつかの一般的な構成オプション:

# # session.auto_start = 0 ; リクエスト開始時に初期化 session

session.cache_expire = 180 ; n分以内にセッションドキュメントをキャッシュに設定後で期限切れになります

session.cookie_lifetime = 0; cookie の保存時間を秒単位で設定します。これは、Session## の有効期限を設定するのと同じです。 #、0 の場合、ブラウザが再起動されるまで使用されないことを意味します (session.auto_start=1)。そのため、毎回 session_start() を呼び出す必要はありません。 sessionを使用するまでの時間は推奨されません。ただし、このオプションの有効化にはいくつかの制限があります。 session.auto_start が実際に有効になっている場合、クラス定義がセッションを開始する前にロードされ、セッション内でオブジェクトが再作成されます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">session.cookie_path = / ; cookie的有效路径session.cookie_domain = ; cookie的有效域session.name = PHPSESSID; 用在cookie里的session的名字session.save_handler = files ; 用于保存/取回数据的控制方式session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.session.use_cookies = 1 ; 是否使用cookies</pre><div class="contentsignin">ログイン後にコピー</div></div>

セッションの自動ガベージ コレクション メカニズム

可以通过session_destroy()函数在页面中提供一个“退出”按钮,通过单击销毁本次会话。但如果用户没有单击退出按钮,而是直接关闭浏览器,或断网等情况,在服务器端保存的Session文件是不会删除的。虽然关闭浏览器,下次需要重新分配一个新的Session ID重新登录,但这只是因为在php.ini中的设置seesion.cookie_lifetime=0,来设定Session ID在客户端Cookie中的有效限期,以秒为单位指定了发送到浏览器的Cookie的生命周期。当系统赋予Session有效期限后不管浏览器是否开启,Session ID都会自动消失。而客户端Session ID消失服务器端保存的Session文件并没有被删除。所以没有被Sessoin ID引用的服务器端Session文件,就成为了“垃圾”。

服务器保存的Session文件就是一个普通文本文件,所以都会有文件修改时间。“垃圾回收程序”启动后就是根据Session文件的修改时间,将所有过期的Session文件全部删除。通过在php.ini中设置session.gc_maxlifetime选项来指定一个时间(单位:秒),例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session文件中排查,如果有修改时间距离当前系统时间大于1440秒的就将其删除。

“session垃圾回收程序”是怎样的启动机制呢?“垃圾回收程序”是在调用session_start()函数时启动的。而一个网站有多个脚本,没有脚本又都要使用session_start()函数开启会话,又会有很多个用户同时访问,这就很可能session_start()函数在1秒内被调用N次,而如果每次都会启动“session垃圾回收程序”,这样是很不合理的。可以通过php.ini文件中修改“session.gc_probability和session.gc_pisor”两个选项,设置启动垃圾回收程序的概率。会根据“session.gc_probability/session.gc_pisor”公示计算概率,例如选项session.gc_probability=1,而选项session.gc_pisor=100,这样的概率就是“1/100”,即session_start()函数被调用100次才会有一次可能启动“垃圾回收程序”。

php.ini中相关的配置

session.cookie_lifetime=0; 关闭浏览器相应的cookie文件即被删除

session.gc_maxlifetime; 设置过期session时间,默认1440秒(24分钟)

session.gc_probability/session.gc_pisor; 启动垃圾回收机制的概率(建议值为1/1000——5000)

cookie禁用时通过URL传递session的ID

  使用Session跟踪一个用户,是通过在各个页面之间传递唯一的Session ID,并通过Session ID提取这个用户在服务器中保存的Session变量。常见的Session ID传送方法有以下两种。

  第一种方法是基于cookie的方式传递session ID,这种方式更优,但不总是可用, 因为用户在客户端可以屏蔽cokie;

  第二种方法是通过url参数进行传递,直接将session ID嵌入到URL中去。

在Session的实现中通常都是采用Cookie的方式,客户端保存的Session ID就是一个Cookie。当客户禁用Cookie时,Session ID就不能在Cookie中保存,也就不能在页面之间传递,此时Session失效。不过PHP5在Linux平台可以自动检查Cookie状态,如果客户端禁用它,则系统自动把Session ID附加到URL上传送。而使用Windows系统作为Web服务器则无此功能。

  在PHP中提出了跟踪Session的另一种机制,如果客户浏览器不支持Cookie,则PHP可以重写客户请求的URL,把Session ID添加到URL信息中。可以手动地在每个超链接的URL中都加上一个Session ID,但工作量比较大,不建议使用这种方法。如下所示:

<?php
//开启session
session_start();
//在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取
echo &#39;<a href="demo.php?&#39;.session_name().&#39;=&#39;.session_id().&#39;">连接演示</a>&#39;;
?>
在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。
<?php
session_start();
$_SESSION["username"]="admin";
echo "session ID:".session_id()."<br>";
?>
ログイン後にコピー

推荐教程: 《php教程

以上がPHPでのセッションの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート