SESSION與COOKIE問(wèn)題,可以說(shuō)是一個(gè)老生常談的問(wèn)題,對(duì)于什么是SESSION,什么是COOKIE,我這里就不多說(shuō)了,

GOOGLE一下,一大把(或者:去看:http://hi.baidu.com/fc_lamp/blog/item/da10f32cf47b843e349bf7c3.html)。

今天,我要說(shuō)的是如何在同一頁(yè)面重復(fù)的操作同一個(gè)session.name官網(wǎng)說(shuō)明:session.name指定會(huì)話名以用做 cookie 的名字。只能由字母數(shù)字組成,默認(rèn)為PHPSESSID。即:人為修改PHP自動(dòng)生成的SESSION ID。

首先,我們知道 一旦 PHP session_start()后就開(kāi)啟了一個(gè)會(huì)話。這當(dāng)種了兩件事:一是把相關(guān)SESSION信息存放于服務(wù)器端(產(chǎn)生一個(gè)類似于sess_XXX這樣的文件),二是把會(huì)話名session name(默認(rèn)為:PHPSESSID),以及SESSION ID發(fā)給瀏覽器以cookie的方式存起來(lái)(即:cookie_name : SESSION ID)。這樣,當(dāng)再次訪問(wèn)頁(yè)面時(shí),瀏覽器再把COOKIE里的SESSION ID發(fā)給服務(wù)器(當(dāng)然,COOKIE里的值是沒(méi)有過(guò)期的),PHP比對(duì)服務(wù)器上的SESSION文件,如果沒(méi)有得話,會(huì)產(chǎn)生一個(gè)新的SESSION文件,如果有得話,則直接使用。這里有兩點(diǎn)值的說(shuō)明一下:

1 :對(duì)于登錄合不合法之類的是你自己寫(xiě)PHP腳本來(lái)判斷的,即比對(duì)$_SESSION里的值(因?yàn)樾庐a(chǎn)生的SESSION文件里是沒(méi)有任何值的)。

2 :把COOKIE里的SESSION ID傳給服務(wù)器(PHP)后,在使用SESSION ID之前有一個(gè)選擇。前面,我們說(shuō)過(guò)SESSION ID在COOKIE里是以鍵值配對(duì)方式存放的,鍵即為會(huì)話名(session name),一般如果沒(méi)有事先聲明(在session_start()之前)PHP是使用默認(rèn)的會(huì)話名,即PHPSESSID,所以不同頁(yè)面可以有不同的會(huì)話名。如下圖所示:


所以,對(duì)于特殊的SESSION ID,要使用時(shí)必須事先聲明(設(shè)置)會(huì)話名,才能正常的引用。

那么如何設(shè)置會(huì)話名(session name)呢?設(shè)置session name的方試一般有兩種:

1:在php.ini配置文件里修改:在php.ini文件里找到:session.name = PHPSESSID  即可完成設(shè)置

2:使用session_name()函數(shù)設(shè)置,eg:session_name('test9');

這里要注意一下:關(guān)于session name的問(wèn)題。恩,在這里我直接引用官網(wǎng)上的一段話(簡(jiǎn)單的E文,想必大家都看的懂):

The session name references the session id in cookies and URLs. It should contain only alphanumeric characters; it should be short 

and descriptive (i.e. for users with enabled cookie warnings). Ifnameis specified, the name of the current session is changed to its value.

The session name can't consist of digits only, at least one letter must be present. Otherwise a new session id is generated every time.

以上這段非常重要,請(qǐng)你一定要仔細(xì)看。或者去官網(wǎng):http://cn.php.net/manual/zh/function.session-name.php

好了,有了以上的說(shuō)明后我們來(lái)看一段同一頁(yè)面重復(fù)的操作同一個(gè)session.name代碼:

    if(isset($_COOKIE['test9'])){//如果已有值,則銷毀
        session_name('test9');
        session_start();
        setcookie('test9','',time()-3600);//相應(yīng)COOKIE也過(guò)期(這段代碼實(shí)際上可以不要)
        session_unset();
        session_destroy();
    }
    //重新播種SESSION
    session_name('test9');
    session_id(md5(uniqid()));
    session_start();
    $_SESSION['test'] = 'test';

    var_dump($_COOKIE);


 另外:官網(wǎng)上也有討論設(shè)置SESSION生命周期的問(wèn)題,可以看看。地址:http://cn.php.net/manual/zh/function.session-set-cookie-params.php