电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP開發中session應用詳解

瀏覽:3日期:2024-02-04 13:03:20

Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是用戶瀏覽這個網站所花費的時間。從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。

一般來說,在網站上某一個頁面中的變量(指服務器端變量,下同)是不能在下一頁中用的,有了session就好辦了。session中注冊的變量可以作為全局變量使用。這樣我們就可以將session用于用戶身份認證,程序狀態記錄,頁面之間參數傳遞。

在PHP3版本中是如何實現session的?

php3本身是沒有實現session功能的,我們只有用其他的方法來實現,這其中最有名的要算phplib了。phplib最基本的功能包括用戶認證、Session管理、權限及數據庫的抽象化。下面我們就講述一下如何用phplib實現session。

1、首先安裝phplib(環境為win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)

首先將phplib解開,里面有一個'php'目錄,將這個目錄拷貝到Apache的安裝目錄下。例如:Apache安裝在d:Apache 目錄下,那么就將'php'目錄拷貝到d:Apache,并將phplib目錄的pages目錄下(不包括目錄本身)的文件和目錄一起拷貝到d:Apachehtdocs下。

phplib的類庫需要根據系統進行初始化,可能需要修改local.inc文件,其中包含著一些基本參數,可以根據自己機器的實際情況來進行修改。

將d:Apachephpprepend.php文件中的一段程序改為如下樣子:

if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB['libdir'] = 'd:/Apache/php/'; //放phplib下php目錄的路徑 };

修改d:Apachephplocal.inc文件:

class DB_Example extends DB_Sql { var $Host = 'localhost'; //mysql數據庫所在主機名 var $Database = 'test'; //數據庫名 var $User = 'root'; //數據庫用戶名 var $Password = '1234567'; //數據庫用戶密碼 };

最后根據phplib目錄下的stuff子目錄中的create_database.mysql文件生成初始表。

由于每一個使用phplib的頁面首先必須可以找到運行phplib所必需的類庫文件,我們可以在php.ini中設置auto_prepend變量來支持,phplib中包含一個prepend.php文件,并將auto_prepend指定為'd:/Apache/php/prepend.php'(帶引號)后,各頁面就會自動包含phplib類庫,我們還可以將phplib類庫所在目錄加進include變量中,以便可以找到這些文件。 2、調用page_open()函數

在每一個使用phplib的頁面中,必須首先調用page_open函數進行初始化,例如:

<?php page_open(array('sess' => 'Test_Session')); ?>;

數組變量(sess)用來初始化一些狀態保存對象,這里應該注意:必須使用phplib內置名(sess),這些內置名是在local.inc中所定義的.。

因為phplib使用了Cookies來保存狀態信息,所以page_open()函數必須在頁面內容輸出到瀏覽器之前被調用。php腳本最后應以page_close()結束,這將會將有關狀態數據寫回到數據庫中,否則變量會丟失。

3、具體使用。

注冊一個變量后即可在隨后的頁面中使用它,直至session結束。方法:

<?php $sess->register( 'varname'); ?>

注意,這里的varname不是變量值,而是變量名,可以先指定變量名,隨后再賦值。你在某個頁面中可以改變變量的值,隨后的頁面訪問該變量時會得到改變后的值。變量的類型是多樣的,可以是一個字符串,一個數字,一個數組。舉例來說明:

第一頁:

<?php  page_open(array('sess' => 'Test _Session'));  $sess->register( 'welcome'); //注冊變量$welcome,注意不需要加$  $welcome='Hello,PHP world!'; …… page_close(); ?>;

第二頁:

<?php  page_open();//開始session  echo $welcome;//顯示第一頁中定義的$welcome page_close();//保存狀態信息 ?>;

注冊完一個變量,當頁面最后調用page_close()函數后,各個session變量會被寫回到數據庫中。如果忘記調用page_close()函數的話,變量就不會被寫回數據庫,這樣將出現不可預知的后果。當變量被使用完畢,不再需要用到時,可以調用以下函數將變量刪除:

<?php  page_open(array('sess' => 'Test _Session'));  …… $sess->unregister( 'variable_name');  …… page_close(); ?>;

在PHP4版本中是如何實現session的?

php4的session也靠cookies保存session id,用文件系統保存變量(默認情況下),因此,它的session變量不能保存對象。當然也可以將session保存在數據庫中。

在php4中有關session的函數很多(詳見php.ini配置一文),通常情況下我們只需要調用三個函數即可:sesssion_start()、session_register()、session_is_registered()。

在需要用到session的每一頁的最開始處調用session_start()函數, 例如:

<?session_start()?> <html><body> <?  $welcome='hello world !';  session_register('welcome');//注冊$welcome變量,注意沒有$符號  if(session_is_registered('welcome'))//檢查$welcome變量是否注冊 echo 'welcome變量已經注冊了!';  else echo 'welcome變量還沒有注冊!'; ?> </body></html>;

php4中session處理的定制

我們需要擴充6個函數:

·sess_open($sess_path, $session_name);

這個函數被session處理程序調用來作初始化工作。參數$sess_path對應php.ini文件中的session.save_path選項參數$session_name對應php.ini中的session.name 選項。

·sess_close();

這個函數在頁面結束執行并且session處理程序需要關閉時被調用

·sess_read($key);

這個函數在session處理程序讀取指定session鍵值($key)時,檢索并返回標識為$key的session數據.(注意:序列化是將變量或對象在程序結束或需要時保存在文件中,在下次程序運行或需要時再調入內存的技術,有別于只保存數據的方法。)

·sess_write($key, $val);

這個函數據在session處理程序需要將數據保存時調用,這種情況經常在程序結束時發生。它負責將數據保存在下次能用sess_read($key)函數檢索的地方。

·sess_destroy($key);

這個函數在需要消毀session時。它負責刪除session并且清除環境。

·sess_gc($maxlifetime);

這個函數負責清理碎片。在這種情況下,它負責刪除過時的session數據。session處理程序會偶爾調用它們。

定制程序可以用mysql數據庫或DBM文件保存session數據,視具體的情況而定。如果使用mysql作支持,那還需要進行以下的步驟:

首先在mysql中創建一個sessions數據庫,并且創建一個sessions表:

mysql> CREATE DATABASE sessions; mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost -> IDENTIFIED BY 'phpsession'; mysql> CREATE TABLE sessions ( -> sesskey char(32) not null, -> expiry int(11) unsigned not null, -> value text not null, -> PRIMARY KEY (sesskey) -> )

下一步,修改session_mysql.php文件的$SESS_DB* 變量使其匹配你機器上的數據庫設置:

<?$SESS_DBHOST = 'localhost'; /* 數據庫主機名 */ $SESS_DBNAME = 'sessions'; /* 數據庫名 */ $SESS_DBUSER = 'phpsession'; /* 數據庫用戶名 */ $SESS_DBPASS = 'phpsession'; /* 數據庫密碼 */$SESS_DBH = ''; $SESS_LIFE = get_cfg_var('session.gc_maxlifetime');

……//定制函數

session_set_save_handler( 'sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc'); ?>;

定制使用dbm文件時的接口 :

<?$SESS_DBM = ''; $SESS_LIFE = get_cfg_var('session.gc_maxlifetime');

……//定制函數

session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc'); ?>;

session定制的測試代碼:

<?php……if ($handler == 'dbm') include('session_dbm.php');//使用何種接口elseif ($handler == 'mysql') include('session_mysql.php'); else ……

session_start(); session_register('count'); ……?>;

在身份驗證中,怎樣應用Session?

Session可以用于用戶認證 :

驗證用戶是否合法:

<?  session_start();  ……//驗證過程 session_register('reguser'); ?>;

在另一頁面中檢查用戶是否登錄

<?  session_start();  if(isset($reguser)&&$reguser!=''){//如果已經登錄 echo '親愛的用戶,歡迎你';  }else{//如果沒有登錄 echo '請先注冊!';  }?>;

用戶退出登錄:

<?  session_destroy();  ……?>;

如何實現多session并發運行?

問題提出:我在為所在單位編寫一個進銷存系統中發現需要讓多個用戶可以同時進入一個php應用程序。原來設計的靜態的唯一的session ID導致數據混亂。這樣,動態生成一個唯一的session ID成為當務之急。

解決辦法很簡單:我用了php文件名+時間戳為唯一的session ID,這樣在我的程序中的每個session就各就各位,不再混亂了。

下面把我的源代碼公布,方便也有同樣的問題的朋友多一個解決方法。

//Start a PHP session to preserve variables.if ( empty($mysessionname) ) { $micro = microtime(); $micro = str_replace(' ','',$micro); // strip out the blanks $micro = str_replace('.','',$micro); // strip out the periods $mysessionname = 'po_maint' . $micro;}session_name($mysessionname);session_start()

程序注釋:

用mysessionname為頁面間唯一的sessionname傳遞變量,如果你也用到這個名字必須把上述程序做個小小的改動。Mysessionname不能為session的內部變量名,因為他在session開始之前就已經存在了。Mysessionname也不能用cookie方式存放,因為多個session肯定會覆蓋掉原先的cookie文件。你可以用隱含表單的域來保存它。這樣就不會有問題。

標簽: PHP
主站蜘蛛池模板: 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | AR开发公司_AR增强现实_AR工业_AR巡检|上海集英科技 | 奥运星-汽车性能网评-提供个性化汽车资讯 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 首页_中夏易经起名网| 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 首页 - 军军小站|张军博客 | 江西自考网-江西自学考试网 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓| 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器| 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 深圳南财多媒体有限公司介绍 | 北京百度网站优化|北京网站建设公司-百谷网络科技 |