セッションが期限切れにならないようにするための PHP メソッド
この記事では、PHP セッションの詳細な説明と、セッションの再利用メカニズムの説明と、SessionId が変更されない問題の解決策を含む、セッションの有効期限が切れないようにする方法を主に紹介します。お役に立てれば幸いです。
COOKIE テクノロジーは SESSION の実装で使用され、SESSION は session_id (SESSION 番号) を含む COOKIE をクライアント側に保存し、session_name などの他のセッション変数をサーバー側に保存します。ユーザーがサーバーにリクエストを送信すると、session_id もサーバーに送信され、session_id を通じてサーバー側に保存されている変数を抽出することで、ユーザーが誰であるかを識別できます。同時に、SESSION が時々失敗する理由を理解するのは難しくありません。
クライアントがCOOKIEを無効にすると(IEの「ツール」→「インターネットオプション」をクリックし、ポップアップダイアログボックスの「セキュリティ」→「レベルのカスタマイズ」をクリックし、「会話ごとにCOOKIEを許可」を「無効」に設定)、 session_id は渡されず、SESSION は無効になります。ただし、php5 は Linux/Unix プラットフォーム上の Cookie ステータスを自動的にチェックできます。クライアントが無効になっている場合、システムは自動的に session_id を URL に追加して渡します。 Windows ホストにはこの機能はありません。
php中国語ウェブサイト学習トピック: phpセッション (写真、テキスト、ビデオ、ケースを含む)
セッションの共通機能と使用法?
Session_start(): セッションを開始するか、既存のセッションを返します。
注: この関数にはパラメータがなく、戻り値は true です。 Cookie ベースのセッションを使用する場合、Session_start() を使用する前にブラウザに出力を含めることはできません。そうしないと、次のエラーが発生します:
警告: セッション キャッシュ リミッターを送信できません - ヘッダーはすでに送信されました (出力は /usr/local/apache で開始されました) /htdocs/cga/member/1.php:2)…………
php.ini で session.auto_start=1 を開始できるため、セッション session_start() を使用する前に毎回呼び出す必要はありません。ただし、このオプションの有効化にはいくつかの制限があります。session.auto_start が実際に有効になっている場合、セッション内でオブジェクトを再作成するには、セッションを開始する前にクラス定義をロードする必要があるため、オブジェクトをセッションに配置することはできません。
登録されたすべての変数は、リクエストの完了後にシリアル化されます。登録されているが定義されていない変数は、未定義としてマークされます。これらの変数は、ユーザーが後で定義しない限り、その後のアクセスでもセッション モジュールによって定義されません。
警告: 一部のタイプのデータはシリアル化できないため、セッションに保存できません。循環参照を持つリソース変数またはオブジェクトを含めます (つまり、あるオブジェクトがそれ自体への参照を別のオブジェクトに渡します)。
SESSION 変数の登録:
PHP5 は $_SESSION[‘xxx’]=xxx を使用して SESSION グローバル変数を登録します。 GET、POST、COOKIEの使用方法は同様です。
注: session_register()、session_unregister、session_is_registered は、php.ini で register_globle が on に設定されていない限り、php5 では使用されなくなりました。ただし、セキュリティ上の理由から、 register_globle をオフにすることを強くお勧めします。 HTTP_SESSION_VARS の使用は推奨されなくなり、代わりに $_SESSION を使用することが公式に推奨されています。例:
Page1.php
<?php Session_start(); //使用SESSION前必须调用该函数。 $_SESSION[‘name']=”我是黑旋风李逵!”; //注册一个SESSION变量 $_SESSION[‘passwd']=”mynameislikui”; $_SESSION[‘time']=time(); echo ' 通过COOKIE传递SESSION'; //如果客户端支持cookie,可通过该链接传递session到下一页。 echo ' . SID . '">通过URL传递SESSION';//客户端不支持cookie时,使用该办法传递session. ?>
Page2.php
<?php session_start(); echo $_SESSION['name']; // echo $_SESSION['passwd']; // echo date('Y m d H:i:s', $_SESSION['time']); echo ' 返回山一页'; ?>
セッション ID を渡す方法は 2 つあります:
cookie
URL パラメータ
セッション モジュールは両方の方法をサポートします。 Cookie はより最適化されていますが、常に利用できるわけではないため、代替手段も提供されています。 2 番目の方法では、セッション ID を URL の途中に直接埋め込みます。
PHP は接続を透過的に変換できます。 PHP 4.2 以降を使用している場合を除き、PHP をコンパイルするときに手動でアクティブ化する必要があります。 Unix では、--enable-trans-sid 構成オプションを使用します。この構成オプションと実行時オプション session.use_trans_sid が両方ともアクティブ化されている (php.ini が変更されている) 場合、相対 URI はセッション ID を含むように自動的に変更されます。
session_id
session_id() は、現在の session_id を設定または取得するために使用されます。 php5 では、session_id() を使用するか、URL に添付された SID を通じて現在のセッションの session_id と session_name を取得できます。
session_id() に特定の値がある場合、現在の session_id 値が置き換えられます。この関数を使用する前にセッションを開始する必要があります: session_start();
セッション Cookie を使用する場合、session_id() 値が指定されている場合、session_start() が開始されるたびに Cookie 値がクライアントに送信されます。現在の session_id が指定された値と等しいかどうかは関係ありません。
session_id() 値が指定されていない場合は、現在の session_id() が返されます。現在のセッションが開始されていない場合は、空の文字列が返されます。
セッションが存在するかどうかを確認しますか?
以前の PHP バージョンでは、セッションが存在するかどうかを確認するために通常 session_is_register() が使用されていましたが、$_SESSION['XXX']=XXX を使用してセッション変数を登録すると、session_is_register() 関数は機能しなくなります。代わりに
isset($_SESSION['xxx']) を使用できます。
Change session_id session_regenerate_id() は、変更が成功した場合は true を返し、失敗した場合は false を返します。
この関数を使用すると、現在のセッションの session_id を変更できますが、現在のセッションの他の情報は変更されません。例:
<?php session_start(); $old_sessionid = session_id(); session_regenerate_id(); $new_sessionid = session_id(); echo "原始 SessionID: $old_sessionid "; echo "新的 SessionID: $new_sessionid "; echo" "; print_r($_SESSION); echo""; ?>
session_name() 返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start() 之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:
$previous_name = session_name("WebsiteID"); echo "新的session名为: $previous_name "; ?>
如何删除session?
1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。 session_unregister()在PHP5中不再使用,可将之打入冷宫。
unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
2、$_SESSION=array() 删除多个session
3、 session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量 (globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true
session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。
下面是PHP官方关于删除session的案例:
<?php // 初始化session. session_start(); /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/ $_SESSION = array(); /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/ if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最后彻底销毁session. session_destroy(); ?>
由此我们可以得出删除Session的步骤:
session_start()
$_SESSION=array()/unset($_SESSION['xxx'])
session_destroy()
解决PHP Session不过期以及SessionId保持不变的问题
session 回收机制:
PHP采用Garbage Collection process对过期session进行回收,然而并不是每次session建立时,都能够唤起 ‘garbage collection' process ,gc是按照一定概率启动的。这主要是出于对服务器性能方面的考虑,每个session都触发gc,浏览量大的话,服务器吃不消,然而按照一定概率开启gc,当流览量大的时候,session过期机制能够正常运行,而且服务器效率得到节省。细节应该都是多年的经验积累得出的。
三个与PHP session过期相关的参数(php.ini中):
session.gc_probability = 1
session.gc_pisor = 1000
session.gc_maxlifetime = 1440
gc启动概率 = gc_probability / gc_pisor = 0.1%
session过期时间 gc_maxlifetime 单位:秒
当web服务正式提供时,session过期概率就需要根据web服务的浏览量和服务器的性能来综合考虑session过期概率。为每个session都开启gc,显然是不明智的,感觉有点“碰运气”的感觉,要是访问量小命中几率就小。我在本机测试过程中,几乎都没有被命中过,sessionid几天都不变,哪怕机器重启。测试过程中,这个过期概率值要设置大一点命中几率才高点。
通过修改php配置文件的过期概率值,可以“碰运气”式的设置session过期,那有没有更好的办法呢?
下面写的这个session类可以彻底解决session不过期以及sessionid不变的问题。
<?php /** * 扩展Session类(简单封装) * * @author slimboy * */ class Session { /** * 初始化 */ static function _init(){ ini_set('session.auto_start', 0); //Session::start(); } /** * 启动Session */ static function start() { session_start(); } /** * 设置Session * * @param $name Session名称 * @param $value 值 * @param $time 超时时间(秒) */ public static function set($name,$value,$time){ if(empty($time)){ $time = 1800; //默认值 } $_SESSION[$name] = $value; $_SESSION[$name.'_Expires'] = time() + $time; } /** * 获取Session值 * * @param $name Session名称 */ public static function get($name){ //检查Session是否已过期 if(isset($_SESSION[$name.'_Expires']) && $_SESSION[$name.'_E xpires']>time()){ return $_SESSION[$name]; }else{ Session::clear($name); return null; } } /** * 设置Session Domain * * @param $sessionDomain 域 * @return string */ static function setDomain($sessionDomain = null) { $return = ini_get('session.cookie_domain'); if(!empty($sessionDomain)) { ini_set('session.cookie_domain', $sessionDomain);//跨 域访问Session } return $return; } /** * 清除某一Session值 * * @param $name Session名称 */ static function clear($name){ unset($_SESSION[$name]); unset($_SESSION[$name.'_Expires']); } /** * 重置销毁Session */ static function destroy(){ unset($_SESSION); session_destroy(); } /** * 获取或设置Session id */ static function sessionid($id=null){ return session_id($id); } } ?> 简单调用: <?php //设置session Session::set('UserId', $userid, 3600); //读取session $userId = Session::get('UserId'); ?>
相关推荐:
以上がセッションが期限切れにならないようにするための PHP メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
