關於session_start()這個問題,其實網上很多解決的方法,論壇也好多人回答這類的問題, 現在的狀況是依然有警告提示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()的問題還有要將session.auto_start = 0改為1,out.put_buffery=on 或者修改成4096 或者session_start()前面加ob_start();
還有cache-limiter= ;空,還有apache的緩存是否有開等等,不過對我的問題也沒有幫助而已.下面是我在找問題的答案的時候找到的一些關於session_start()的問題的總結
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.問題:我是不是可以用像$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()]);
}
以上,所述是一些新手經常遇到的問題。或許是詳述不清,難免有誤所在,請高手指點批評。
==================================================================================
=====session的部分設置問題====
首先打開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('count');
$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('count'); // 注冊Session變量Count
if(isset($PHPSESSID)) {
session_id($PHPSESSID);
} // 如果設置了$PHPSESSID,就將SessionID賦值為$PHPSESSID,否則生成SessionID
$PHPSESSID = session_id(); // 取得當前的SessionID
$count++; // 變量count加1
setcookie('PHPSESSID', $PHPSESSID, time()+3156000); // 儲存SessionID到Cookie中
echo $count; // 顯示Session變量count的值
?>
------------------------------------------------------------------------------------
保存之后,利用和剛才擁有服務器權限時候的檢測一樣的方法,檢測是否成功的保存了SessionID。
后記:
其實真正的永久儲存是不可能的,因為Cookie的保存時間有限,而服務器的空間也有限……
但是對於一些需要保存時間比較長的站點,以上方法就已經足夠了!