ホームページ  >  記事  >  バックエンド開発  >  PHPでセッション共有を実装する方法

PHPでセッション共有を実装する方法

(*-*)浩
(*-*)浩オリジナル
2019-09-19 14:42:234479ブラウズ

なぜセッション共有が必要なのですか?

現在、少し大きな Web サイトには基本的に、www.feiniu.com、search.feiniu.com、member などの複数のサブドメインがあります。 .feiniu.com、これらの Web サイトがユーザーのログイン情報を共有する必要がある場合、セッションを共有する必要があります。もちろん、同じプライマリ ドメイン名を持っていることが前提です。

PHPでセッション共有を実装する方法

PHP のセッション原理?

クライアントは php ページにアクセスし、session_start を実行し、session_id を生成します。一般に、 session_id を保存します Cookie には、セッションのコンテンツがサーバーに保存されます

クライアントは、別のページにアクセスするときに session_id をサーバーに渡し、session_id を通じてセッションのコンテンツを取得します。 (推奨学習: PHP プログラミングの入門から熟練度まで )

プロセスは次のようになりますが、異なるサーバーは同じクライアントに対して異なる session_id を生成するため、異なるサーバーが同じ session_id を取得することはできません。セッション内容。

そして、PHP のデフォルトの SESSION データは、このサーバーのファイル システムに個別に保存されます。

したがって、セッション共有を解決したい場合は、次の 2 つの問題を解決する必要があります:

複数のサーバーが同じ session_id を使用している

这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以
打开PHP.ini, 设置session.cookie_domain = .feiniu.com, 
当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");

複数のサーバーが同じ session_id を使用して同じセッション コンテンツにアクセスします

要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,
一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。

ストレージ エンジンの選択方法

#デフォルトファイル ストレージ:

这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置
分级目录进行 SESSION 文件的保存。
这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。

データベース ストレージ:

把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。
但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。

memcache ストレージ:

以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。
但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,
如果存储块不足,还会产生内存溢出。
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统
效率,因为网络连接同样需要资源。

redis ストレージ: memcache と比較すると、redis アクセスはわずかに遅くなります。利点は次のとおりです:

redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。
在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把
存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变
慢,不会影响程序的逻辑

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。