錯誤提示
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.phpsession_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的設置問題,網上這篇文章比較好,***拿來學習,並供大家參考。
轉載自旅行論壇 piling 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的保存時間有限,而服務器的空間也有限……
但是對於壹些需要保存時間比較長的站點,以上方法就已經足夠了!關於Session的其他應用,可
以參見zphp.com的文章。
最後,筆者的調試環境:Windows98DigExt(SE)+Apache+PHP 4.04。 本文來自CSDN博客,轉載請標明出處: /yuyuzhou06/archive/2007/11/27/1905017.aspx