搜尋
首頁php教程PHP开发解析php中session的實作原理以及大網站應用程式應注意的問題

PHP SESSION原理
我們知道,session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是 在客戶端保持用戶資料。 HTTP協定是一種無狀態協議,伺服器回應完後就失去了與瀏覽器的聯繫,最早,Netscape將cookie引入瀏覽器,使得 資料可以客戶端跨頁面交換,那麼伺服器是如何記住眾多使用者的會話資料呢?

首先要將客戶端和伺服器端建立一一聯繫,每個客戶 端都得有一個唯一標識,這樣伺服器才能識別出來。建議唯一識別的方法有兩種:cookie或透過GET方式指定。預設配置的PHP使用session的 時會建立一個名叫」PHPSESSID」的cookie(可以透過php.ini修改session.name值指定),如果客戶端停用cookie,你 也可以指定透過GET方式把session id傳到伺服器(修改php.ini中session.use_trans_sid等參數)。

我們查看伺服器端session.save_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個 其實就是session id “vv9lpgf0nmkurgvkba1vbvj915″對應的資料。真相就在這裡,客戶端將session id傳遞到伺服器,伺服器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入。

事實就是這 樣,所以如果伺服器不支援session或你想自訂session,完全可以DIY,透過PHP的uniqid產生永不重複的session id,然後找個地方儲存session的內容即可,你也可以學flickr把session存放在MySQL資料庫中。

使用session之前為什麼必須先執行session_start()?
了 解的原理之後,所謂的session其實就是客戶端一個session id伺服器端一個session file,在新建session之前執行session_start()是告訴伺服器要種一個cookie以及準備好session文件,要不然你的 session內容怎麼存;讀取session之前執行session_start()是告訴伺服器,趕緊根據session id把session檔反序列化。

只有一個session函數可以在session_start()之前執行,session_name():讀取或指定session名稱(例如預設的就是”PHPSESSID”),這個當然要在session_start之前執行。

session影響系統效能
session 在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,PHP支持 session目錄hash,我們可以透過修改php.ini中session.save_path = “2;/path/to/session/dir”,那麼session將儲存在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支援建立目錄,你需要事先把那麼些目錄創建好 。

還有一個問題就是小文件的效率問題,一般我們的 session資料都不會太大(1~2K),如果有大量這樣1~2K的檔案在磁碟上,IO效率一定會很差,PHP手冊上建議使用Reiserfs檔案系 統,不過Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。

其實還有很多中 儲存session的方式,可以透過php -i|grep “Registered save handlers”查看,例如Registered save handlers => files user sqlite eaccelerator可以透過檔案、使用者、sqlite、eaccelerator來存,如果伺服器裝了memcached,還有會mmcache的 選項。當然還有很多,像是MySQL、PostgreSQL等等。都是不錯的選擇。

session的同步
我們前端可能有很多台伺服器,用戶在A伺服器上登入了,種下了session訊息,然後造訪網站的某些頁面沒準跳到B伺服器上去了,如果這個時候B伺服器上沒有session資訊又沒有做特殊處理,可能就會出問題了。
session同步有很多種,如果你是儲存在memcached或MySQL中,那就很容易了,指定到同樣的位置即可,如果是檔案形式的,你可以用NFS統一儲存。

還有一種方式是透過加密的cookie來實現,使用者在A伺服器上登入成功,在使用者的瀏覽器上種上一個加密的cookie,當使用者存取B伺服器時,檢查有無 session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效的話就在B伺服器上重建session。這種方法其實很有 用,如果網站有很多個子頻道,伺服器也不在一個機房,session沒辦法同步又想做統一登入那就太有用了。

當然還有一種方法就 是在負載平衡那一層保持會話,把訪客綁定在某個伺服器上,他的所有存取都在那個伺服器上就不需要session同步了,這些都是維運層面的東西。就說這 麼多吧,依照自己的應用選擇使用session,不要因為大家都說session影響系統效能就畏首畏尾,知道問題,解決問題才是關鍵,惹不起躲得起不適合這裡。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
SpringBoot Session怎么设置会话超时SpringBoot Session怎么设置会话超时May 15, 2023 pm 02:37 PM

问题发现springboot项目生产session-out超时问题,描述下问题:在测试环境通过改动application.yaml配置session-out,经过设置不同时间验证session-out配置生效,于是就直接设置了过期时间为8小时发布到了生产环境。然而中午接到客户反应项目过期时间设置较短,半小时不操作就会话过期需要反复登陆。解决处理开发环境:springboot项目内置Tomcat,所以项目中application.yaml配置session-out是生效的。生产环境:生产环境发布是

php session刷新后没有了怎么办php session刷新后没有了怎么办Jan 18, 2023 pm 01:39 PM

php session刷新后没有了的解决办法:1、通过“session_start();”开启session;2、把所有的公共配置写在一个php文件内;3、变量名不能和数组下标相同;4、在phpinfo里面查看session数据的存储路径,并查看该文件目录下的sessio是否保存成功即可。

session php默认失效时间是多少session php默认失效时间是多少Nov 01, 2022 am 09:14 AM

session php默认失效时间是1440秒,也就是24分钟,表示客户端超过24分钟没有刷新,当前session就会失效;如果用户关闭了浏览器,会话就会结束,Session就不存在了。

PHP如何在多个文件中正确地读取和写入Session数据PHP如何在多个文件中正确地读取和写入Session数据Mar 23, 2023 am 11:12 AM

当您在使用PHP会话(Session)时,有时会发现Session在一个文件中可以正常读取,但在另一个文件中却无法读取。这可能会让您感到困惑,因为会话数据应该可以在整个应用程序中共享。本文将解释如何在多个文件中正确地读取和写入PHP会话数据。

Redis的共享session应用如何实现短信登录Redis的共享session应用如何实现短信登录Jun 03, 2023 pm 03:11 PM

1.基于session实现短信登录1.1短信登录流程图1.2实现发送短信验证码前端请求说明:说明请求方式POST请求路径/user/code请求参数phone(电话号码)返回值无后端接口实现:@Slf4j@ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1.校验手机号if

Springboot2 session设置超时时间无效怎么解决Springboot2 session设置超时时间无效怎么解决May 22, 2023 pm 01:49 PM

问题:今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效。解决方案:server.*属性用于控制SpringBoot使用的嵌入式容器。SpringBoot将使用ServletWebServerFactory实例之一创建servlet容器的实例。这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等)。当应用程序作为war文件部署到Tomcat实例时,server.*属性不适用。它们不适用,

JavaScript和PHP的cookie之间有哪些区别?JavaScript和PHP的cookie之间有哪些区别?Sep 02, 2023 pm 12:29 PM

JavaScriptCookie使用JavaScriptcookie是记住和跟踪偏好、购买、佣金和其他信息的最有效方法。更好的访问者体验或网站统计所需的信息。PHPCookieCookie是存储在客户端计算机上的文本文件并保留它们用于跟踪目的。PHP透明地支持HTTPcookie。JavaScriptcookie如何工作?您的服务器将一些数据发送到访问者的浏览器cookie的形式。浏览器可以接受cookie。如果存在,它将作为纯文本记录存储在访问者的硬盘上。现在,当访问者到达站点上的另一个页面时

PHP如何处理微信小程序中的session问题PHP如何处理微信小程序中的session问题Jun 02, 2023 pm 03:40 PM

近年来,微信小程序风靡全球,已经成为了许多企业和个人开发者的首选平台。在小程序的开发中,我们经常会遇到session问题,也就是如何在小程序中保存用户登录状态。这个问题对于网站开发者来说并不陌生,但在小程序中却有些不同。本文将介绍如何使用PHP解决微信小程序中的session问题。一、小程序登录过程概述小程序的登录流程与网站的登录流程类似,分为以下几个步骤:

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),