程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> 關於session

關於session

編輯:PHP基礎知識
 

session_start()這個問題,我竟然用了4天來解決.其實網上很多解決的方法,論壇也好多人回答這類的問題,不過最後呢,我還是先在我朋友的電腦上運行php的代碼,確認沒有寫錯後,再通過朋友的php.ini來對照,找出不同的地方,然後修改才成功. 現在的狀況是依然有警告提示Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent in C:\php\phpdesigner_output_tmp.php on line 2 不過,代碼可以成功運行,$_SESSION的值可以傳遞到別的頁面,那我就不再修改其他的(還沒對照到的地方).最後一句感歎,一個人憑興趣去寫程序,真是困難重重!
  現在先說我自己的問題.我在網上找session_start()的問題的時候,有的帖子提到要修改session.save_path =c:\tmp 和session.cookie_path =/
這兩個路徑為c:\tmp 然後再添加一個文件夾.但我自己是問題是,session.cookie_path  的值應該是=/  慚愧的是我現在還不明白什麼是這個值應該是默認路徑吧.

  其實相關的session_start()的問題還有要將out.put_buffery=on 或者修改成4096 或者session_start()前面加ob_start();還有cache-limiter= ;空,還有apache的緩存是否有開等等,不過對我的問題也沒有幫助而已.下面是我在找問題的答案的時候找到的一些關於session_start()的問題的總結,我本來想自己總結,現在就貼出這位兄弟的文章就是了(沒有問過他,如果有一天作者覺得有異議,請聯系我)http://cmpford.bokee.com/


session問題集錦

  對於PHP的session功能,始終找不到合適的答案,尤其是一些錯誤,還有一些沒有錯誤的結果,最可怕的就是後者,一直為許多的初學者為難。就連有些老手,有時都被搞得莫名其妙。本文,將這些問題,做一個簡單的匯總,以便大家查閱。

1.
錯誤提示
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
分析及解決辦法
這一類問題,的原因是你在程序中使用session_start()時,之前已經有實際的html內容輸出了。或許你說,我沒有啊,我只不過是echo或print一條消息了。很抱歉,你的echo或print語句所產生的輸出,就是實際的html內容輸出。解決此類問題的辦法是,將你的session_start()調到程序的第一行。

2.
錯誤提示
Warning: open(F:/689phpsessiondatasess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
分析及解決方法
出現這樣的錯誤語句一般是因為你的php.ini中關於session.save_path一項沒有設置好,解決的方法是將session.save_path和session.cookie_path 設置置為
session_save_path = c: emp
session.cookie_path = c: emp
然後在c:目錄下建立一個temp目錄,即可

3.
錯誤提示
Warning: Trying to destroy uninitialized session in
分析及解決方法
出類這樣的提示,一般情況都是你直接調session_destroy()函數造成的。很多的朋友認為session_destroy()函數可以獨立的運行,其實不然。解決的方法是在你調session_destroy()函數之前,要用session_start()開啟session的功能。

4.問題:怎麼獲得當前session的id值呢?
最簡單的方法是:
echo SID;
你會發現的。

5.問題:我的程序,在調用header函數之前沒有任何的輸出,雖然我include了一個config.php文件,但在config.php文件中也沒有任何的輸出,為什麼session還是會報出與問題1同樣的錯誤呢,是不是因為我在header之前用了session_start()的緣故呢?
答:或許你確實認真的檢查了你的php程序,在引用header()之前確實也沒有任何的輸出,並且在你的include文件中也沒有任何的輸出!但是你是否用光標鍵在?>這個PHP代碼結束語句後移動檢查呢?那麼你會發現在?>這個後面,有一個空行或幾個空格,你刪除了這幾個空行或空格,那麼問題就解決了。
注:此問題,會出PHP4.1.2中,更高版本,沒有測試過。

6.問:用session做登錄主頁面後,其它頁面怎麼用session限制登錄。。。
答:最簡單的方法是
session_start();
if(!session_registered('login') ││ $login != true) {
echo "你沒有登陸";
exit;
}

7.問:我用session_register()注冊了session變量,可是當我用header或用javascript的重定向語句,那麼在一下頁面中,我卻訪問不到session所注冊的變量值。請問如何解決?
問題的程序片段:
session_start();
$ok = 'love you';
session_register('ok');
header("location : next.php");
?>

next.php
session_start();
echo $ok;
?>

解決的方法:
當你用header函數或window.location這樣的功能後,你上一個頁面所注冊的session變量,就會容易的丟失,關於這個問題的原因,至今仍沒有一個詳細的回答。
不過有解決的方法。如下所示
header("Location: next.php" ."?" . SID);
在跳轉到下一頁面的時候,將session的當前id做為一個參數,傳到後一個頁面。

8.session如何傳數組
session_register('data');
$data=array(1,2,3,4);

方法是先注冊後賦值

9.問題9:我是不是可以用像$HTTP_GET_VARS['**']方式來訪問session值呢?

回答:可以,你可以使用如下global數組來訪問session,以加強網頁的安全性
$HTTP_SESSION_VARS
$_SESSION
例程:
session_start();
$username = 'stangly.wrong';
session_register('username');

echo $HTTP_SESSION_VARS['username'];
echo '
';
echo $_SESSION['username'];
?>
請參照此例程修改符合您自己的程序。

問題10:session_unregister() 和 session_destroy() 有何區別?
session_unregister()函數主要作用是注消當前的一sion.(譯自於php.net)

例程:
if(isset($_COOKIE[session_name()])) {
session_start();
session_destroy();
unset($_COOKIE[session_name()]);
}


以上,所述是一些新手經常遇到的問題。或許是詳述不清,難免有誤所在,請高手指點批評。


php中的session的配置

今天調試程序遇到了session的設置問題,網上這篇文章比較好,共拿來學習,並供大家參考。
轉載自旅行論壇 http://www/lvxing.net


首先打開php.ini文件,找到session的部分:(分號後面的是注釋)

[Session]
; Handler used to store/retrieve data.
session.save_handler = files ; 這個是session的方式,默認的files就可以了,代表用文件儲存

; Argument passed to save_handler. In the case of files, this is the path where data files are stored.
session.save_path = /tmp ; 這個是session的保存路徑,比如你是c盤,那麼默認就是c:/tmp, 所以如果出現“Warning: open(/tmpsess_cc8b04f146a1e0494bc464305da92ea1, O_RDWR) failed”這樣子的錯誤,你可以修改這個路徑,或者在根目錄下面建立一個tmp的文件夾

; Whether to use cookies.
session.use_cookies = 1 ; sessionid的傳遞方式,默認是cookie,推薦使用

; Name of the session (used as cookie name).
session.name = PHPSESSID ; sessionid的名稱,保存在cookie裡面的,要避免同名

; Initialize session on request startup.
session.auto_start = 0 ; 是否自動啟動session,默認為不是,不需要修改

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0 ; sessionid的cookie生存時間,0代表知道浏覽器關閉

; The path for which the cookie is valid.
session.cookie_path = / ; sessionid的cookie路徑,不需要修改

; The domain for which the cookie is valid.
session.cookie_domain = ; ;sessionid的cookie域名,不需要修改

; Handler used to serialize data. php is the standard serializer of PHP.
session.serialize_handler = php ; 保存data的默認文件名後綴,不需要修改

; Percentual probability that the 'garbage collection' process is started on every session initialization.
session.gc_probability = 1

; After this number of seconds, stored data will be seen as 'garbage' and cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440 ; session文件的保存時間

; Check HTTP Referer to invalidate externally stored URLs containing ids.
session.referer_check = ; How many bytes to read from the file.
session.entropy_length = 0 ; Specified here to create the session id.
session.entropy_file = ;session.entropy_length = 16 ;session.entropy_file = /dev/urandom

; Set to {nocache,private,public} to determine HTTP caching aspects.
session.cache_limiter = nocache ; Document expires after n minutes.
session.cache_expire = 180 ; use transient sid support if enabled by compiling with --enable-trans-sid.
session.use_trans_sid = 1 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" ======================================================================
session 的生命周期是多長

1 浏覽器結束時其生命周期也同時結束,但是檔案仍然存在於 /tmp/(sess_???)
2 下次重新開浏覽器時會重新分配 sessionID,如果你使用 session_id() 把以前的 ID 帶回來,
則會去讀取殘存在 /tmp 處的 sess_???, 取回你之前所有已經設定的參數
3 可以在 php.ini 裡修改 session 檔案殘存的時間 session.gc_maxlifetime = 1440 ; after this number of seconds, stored
; data will be seen as 'garbage' and
; cleaned up by the gc process 默認是 1440 秒,24分鐘
=========================================================================

使用無限生命期Session的方法
在PHP4.0中加入了對Session的支持,方便了我們很多程序,比如購物車等等!
在很多論壇中,Session也用於處理用戶的登陸,記錄下用戶名和密碼,使得用戶不必每次都輸入自己的用戶名和密碼!但是一般的Session的生命期有限,如果用戶關閉了浏覽器,就不能保存Session的變量了!那麼怎麼樣可以實現Session的永久生命期呢?
大家知道,Session儲存在服務器端,根據客戶端提供的SessionID來得到這個用戶的文件,然後讀取文件,取得變量的值,SessionID可以使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的“?”後面的部分)來傳送給服務器,然後服務器讀取Session的目錄……

要實現Session的永久生命期,首先需要了解一下php.ini關於Session的相關設置(打開php.ini文件,在“[Session]”部分):
1、session.use_cookies:默認的值是“1”,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;
2、session.name:這個就是SessionID儲存的變量名稱,可能是Cookie,也可能是Query_String來傳遞,默認值“PHPSESSID”;
3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表浏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!
4、session.gc_maxlifetime:這個是Session數據在服務器端儲存的時間,如果超過這個時間,那麼Session數據就自動刪除!
還有很多的設置,不過和本文相關的就是這些了,下面開始講使用永久Session的原理和步驟。

前面說過,服務器通過SessionID來讀取Session的數據,但是一般浏覽器傳送的SessionID在浏覽器關閉後就沒有了,那麼我們只需要人為的設置SessionID並且保存下來,不就可以……
如果你擁有服務器的操作權限,那麼設置這個非常非常的簡單,只是需要進行如下的步驟:
1、把“session.use_cookies”設置為1,打開Cookie儲存SessionID,不過默認就是1,一般不用修改;
2、把“session.cookie_lifetime”改為正無窮(當然沒有正無窮的參數,不過999999999和正無窮也沒有什麼區別);
3、把“session.gc_maxlifetime”設置為和“session.cookie_lifetime”一樣的時間;
設置完畢後,打開編輯器,輸入如下的代碼:
------------------------------------------------------------------------------------

<?php session_start();
session_register(&apos;count&apos;);
$count++;
echo $count;
?>
------------------------------------------------------------------------------------
然後保存為“session_check.php”,用浏覽器打開“session_check.php”,看看顯示的是不是“1”,再關閉浏覽器,然後再打開浏覽器訪問“session_check.php”,如果顯示“2”,那麼恭喜了,你已經成功;如果失敗的話,請檢查你前面的設置。

但是如果你沒有服務器的操作權限,那就比較麻煩了,你需要通過PHP程序改寫SessionID來實現永久的Session數據保存。查查php.net的函數手冊,可以見到有“session_id”這個函數:如果沒有設置參數,那麼將返回當前的SessionID,如果設置了參數,就會將當前的SessionID設置為給出的值……
只要利用永久性的Cookie加上“session_id”函數,就可以實現永久Session數據保存了!
但是為了方便,我們需要知道服務器設置的“session.name”,但是一般用戶都沒有權限查看服務器的php.ini設置,不過PHP提供了一個非常好的函數“phpinfo”,利用這個可以查看幾乎所有的PHP信息!
------------------------------------------------------------------------------------


------------------------------------------------------------------------------------
打開編輯器,輸入上面的代碼,然後在浏覽器中運行這個程序,會見到PHP的相關信息(如圖1所示)。其中有一項“session.name”的參數(圖中已經標出),這個就是我們需要的服務器“session.name”,一般是“PHPSESSID”。
記下了SessionID的名稱後,我們就可以實現永久的Session數據儲存了!
打開編輯器,輸入下面的代碼:
------------------------------------------------------------------------------------
session_start(); // 啟動Session
session_register(&apos;count&apos;); // 注冊Session變量Count
if(isset($PHPSESSID)) {
session_id($PHPSESSID);
} // 如果設置了$PHPSESSID,就將SessionID賦值為$PHPSESSID,否則生成SessionID
$PHPSESSID = session_id(); // 取得當前的SessionID
$count++; // 變量count加1
setcookie(&apos;PHPSESSID&apos;, $PHPSESSID, time()+3156000); // 儲存SessionID到Cookie中
echo $count; // 顯示Session變量count的值
?>
------------------------------------------------------------------------------------

保存之後,利用和剛才擁有服務器權限時候的檢測一樣的方法,檢測是否成功的保存了SessionID。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved