一掌栅、會話控制
- 1、cookie
-
簡介:Cookie是存儲在客戶端瀏覽器中的數(shù)據(jù)瀑梗,我們通過Cookie來跟蹤與存儲用戶數(shù)據(jù)烹笔。一般情況下,Cookie通過HTTP headers從服務端返回到客戶端抛丽。多數(shù)web程序都支持Cookie的操作谤职,因為Cookie是存在于HTTP的標頭之中,所以必須在其他信息輸出以前進行設置亿鲜,類似于header函數(shù)的使用限制允蜈。
PHP通過setcookie函數(shù)進行Cookie的設置,任何從瀏覽器發(fā)回的Cookie蒿柳,PHP都會自動的將他存儲在$_COOKIE的全局變量之中饶套,因此我們可以通過$_COOKIE['key']的形式來讀取某個Cookie值。
PHP中的Cookie具有非常廣泛的使用垒探,經(jīng)常用來存儲用戶的登錄信息妓蛮,購物車等,且在使用會話Session時通常使用Cookie來存儲會話id來識別用戶圾叼,Cookie具備有效期蛤克,當有效期結束之后捺癞,Cookie會自動的從客戶端刪除。同時為了進行安全控制咖耘,Cookie還可以設置域跟路徑 - 設置:PHP設置Cookie最常用的方法就是使用setcookie函數(shù)
setcookie(name,value,expire,path,domain,secure):
name 必需( Cookie名)可以通過$_COOKIE['name'] 進行訪問
value 必需(Cookie的值)
expire(過期時間)Unix時間戳格式翘簇,默認為0,表示瀏覽器關閉即失效
path(有效路徑)如果路徑設置為'/'儿倒,則整個網(wǎng)站都有效
domain(有效域)默認整個域名都有效版保,如果設置了'www.imooc.com',則只在www子域中有效
- PHP中還有一個設置Cookie的函數(shù)setrawcookie,setrawcookie跟setcookie基本一樣夫否,唯一的不同就是value值不會自動的進行urlencode彻犁,因此在需要的時候要手動的進行urlencode。
setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);
- cookie的刪除與過期時間
php中沒有刪除Cookie的函數(shù)凰慈,在PHP中刪除cookie也是采用setcookie函數(shù)來實現(xiàn)汞幢。
setcookie('test', '', time()-1);
可以看到將cookie的過期時間設置到當前時間之前,則該cookie會自動失效微谓,也就達到了刪除cookie的目的
- cookie的有效路徑
cookie中的路徑用來控制設置的cookie在哪個路徑下有效森篷,默認為'/',在所有路徑下都有豺型,當設定了其他路徑之后仲智,則只在設定的路徑以及子路徑下有效。 - 2姻氨、session與cookie的異同
cookie將數(shù)據(jù)存儲在客戶端钓辆,建立起用戶與服務器之間的聯(lián)系,通畴群福可以解決很多問題前联,但是cookie仍然具有一些局限:
cookie相對不是太安全,容易被盜用導致cookie欺騙
單個cookie的值最大只能存儲4k
每次請求都要進行網(wǎng)絡傳輸娶眷,占用帶寬
session是將用戶的會話數(shù)據(jù)存儲在服務端似嗤,沒有大小限制,通過一個session_id進行用戶識別茂浮,PHP默認情況下session id是通過cookie來保存的双谆,因此從某種程度上來說,seesion依賴于cookie席揽。但這不是絕對的顽馋,session id也可以通過參數(shù)來實現(xiàn),只要能將session id傳遞到服務端進行識別的機制都可以使用session幌羞。 - 3寸谜、session的使用
先執(zhí)行session_start方法開啟session,然后通過全局變量$_SESSION進行session的讀寫属桦。默認情況下熊痴,session是以文件形式存儲在服務器上的他爸,因此當一個頁面開啟了session之后,會獨占這個session文件果善,這樣會導致當前用戶的其他并發(fā)訪問無法執(zhí)行而等待诊笤。可以采用緩存或者數(shù)據(jù)庫的形式存儲來解決這個問題巾陕,
<?php
//開始使用session
session_start();
//設置一個session
$_SESSION['test'] = time();
//顯示當前的session_id
echo "session_id:".session_id();
echo "<br>";
//讀取session值
echo $_SESSION['test'];
//銷毀一個session
unset($_SESSION['test']);
echo "<br>";
var_dump($_SESSION);
session會自動的對要設置的值進行encode與decode讨跟,因此session可以支持任意數(shù)據(jù)類型,包括數(shù)據(jù)與對象等鄙煤。
session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
- 4晾匠、刪除與銷毀session
刪除某個session值可以使用PHP的unset函數(shù),刪除后就會從全局變量$_SESSION中去除梯刚,無法訪問凉馆。
session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
如果要刪除所有的session,可以使用session_destroy函數(shù)銷毀當前session亡资,session_destroy會刪除所有數(shù)據(jù)澜共,但是session_id仍然存在。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
- 5锥腻、使用session來存儲用戶的登錄信息
<?php
session_start();
//假設用戶登錄成功獲得了以下用戶數(shù)據(jù)
$userinfo = array(
'uid' => 10000,
'name' => 'spark',
'email' => 'spark@imooc.com',
'sex' => 'man',
'age' => '18'
);
header("content-type:text/html; charset=utf-8");
/* 將用戶信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
var_dump($_SESSION);
//* 將用戶數(shù)據(jù)保存到cookie中的一個簡單方法 */
$secureKey = 'imooc'; //加密密鑰
$str = serialize($userinfo); //將用戶信息序列化
//用戶信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
//用戶信息加密后
//將加密后的用戶數(shù)據(jù)存儲到cookie中
setcookie('userinfo', $str);
//當需要使用時進行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用戶信息:<br>";
print_r($uinfo);
二咳胃、文件系統(tǒng)
- 1、讀取文件內容
- 1旷太、file_get_contents:將整個文件讀取到一個字符串中,也可以通過參數(shù)控制讀取內容的開始點以及長度销睁。
$content = file_get_contents('./test.txt');
$content = file_get_contents('./test.txt', null, null, 100, 500);
file_get_contents(path,include_path,context,start,max_length)
path 必需供璧。規(guī)定要讀取的文件。
include_path 可選冻记。如果也想在 include_path 中搜尋文件的話睡毒,可以將該參數(shù)設為 "1"。
context
可選冗栗。規(guī)定文件句柄的環(huán)境演顾。
context 是一套可以修改流的行為的選項。若使用 null隅居,則忽略钠至。
start 可選。規(guī)定在文件中開始讀取的位置胎源。該參數(shù)是 PHP 5.1 新加的棉钧。
max_length 可選。規(guī)定讀取的字節(jié)數(shù)涕蚤。該參數(shù)是 PHP 5.1 新加的宪卿。
- 2的诵、PHP也提供類似于C語言操作文件的方法,使用fopen佑钾,fgets西疤,fread等方法,fgets可以從文件指針中讀取一行休溶,freads可以讀取指定長度的字符串代赁。使用fopen打開的文件,最好使用fclose關閉文件指針邮偎,以避免文件句柄被占用管跺。
r 打開文件為只讀。文件指針在文件的開頭開始禾进。
w 打開文件為只寫豁跑。刪除文件的內容或創(chuàng)建一個新的文件,如果它不存在泻云。文件指針在文件的開頭開始艇拍。
a 打開文件為只寫。文件中的現(xiàn)有數(shù)據(jù)會被保留宠纯。文件指針在文件結尾開始卸夕。創(chuàng)建新的文件,如果文件不存在婆瓜。
x 創(chuàng)建新文件為只寫快集。返回 FALSE 和錯誤,如果文件已存在廉白。
r+ 打開文件為讀/寫个初、文件指針在文件開頭開始。
w+ 打開文件為讀/寫猴蹂。刪除文件內容或創(chuàng)建新文件院溺,如果它不存在。文件指針在文件開頭開始磅轻。
a+ 打開文件為讀/寫珍逸。文件中已有的數(shù)據(jù)會被保留。文件指針在文件結尾開始聋溜。創(chuàng)建新文件谆膳,如果它不存在。
x+ 創(chuàng)建新文件為讀/寫撮躁。返回 FALSE 和錯誤摹量,如果文件已存在。
$fp = fopen('./text.txt', 'rb');//rb表示文件打開模式
while(!feof($fp)) {//是否讀到文件末尾
echo fgets($fp); //讀取一行
$contents='';
$contents .= fread($fp, 4096); //一次讀取4096個字符
}
fclose($fp);
- 2、判斷文件是否存在
is_file和file_exists用來判斷文件是否存在缨称。如果只是判斷文件存在凝果,使用file_exists就行,file_exists不僅可以判斷文件是否存在睦尽,同時也可以判斷目錄是否存在器净,從函數(shù)名可以看出,is_file是確切的判斷給定的路徑是否是一個文件当凡。
$filename = './test.txt';
if (is_file($filename)) {
echo file_get_contents($filename);
}
更加精確的可以使用is_readable與is_writeable在文件是否存在的基礎上山害,判斷文件是否可讀與可寫。
$filename = './test.txt';
if (is_writeable($filename)) {
file_put_contents($filename, 'test');
}
if (is_readable($filename)) {
echo file_get_contents($filename);
}
- 3沿量、取得文件的修改時間
文件有很多元屬性浪慌,包括:文件的所有者、創(chuàng)建時間朴则、修改時間权纤、最后的訪問時間等。
fileowner:獲得文件的所有者
filectime:獲取文件的創(chuàng)建時間
filemtime:獲取文件的修改時間
fileatime:獲取文件的訪問時間
<?php
$filename = '/data/webroot/usercode/code/resource/test.txt';
echo '所有者:'.fileowner($filename).'<br>';
echo '創(chuàng)建時間:'.filectime($filename).'<br>';
echo '修改時間:'.filemtime($filename).'<br>';
echo '最后訪問時間:'.fileatime($filename).'<br>';
//給$mtime賦值為文件的修改時間
$mtime = filemtime($filename);
//通過計算時間差 來判斷文件內容是否有效
if (time() - $mtime > 3600) {
echo '<br>緩存已過期';
} else {
echo file_get_contents($filename);
}
- 4乌妒、取得文件的大小
通過filesize函數(shù)可以取得文件的大小汹想,文件大小是以字節(jié)數(shù)表示的。
$filename = '/data/webroot/usercode/resource/test.txt';
$size = filesize($filename);
可以通過自己定義函數(shù)來實現(xiàn)撤蚊,轉換文件大小的單位古掏。
function getsize($size, $format = 'kb') {
$p = 0;
if ($format == 'kb') {
$p = 1;
} elseif ($format == 'mb') {
$p = 2;
} elseif ($format == 'gb') {
$p = 3;
}
$size /= pow(1024, $p);
return number_format($size, 3);
}
$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);
$size = getsize($size, 'kb'); //進行單位轉換
echo $size.'kb';
三、異常處理
- 1侦啸、拋出異常
從PHP5開始槽唾,PHP支持異常處理,異常處理是面向對象一個重要特性光涂,PHP代碼中的異常通過throw拋出夏漱,異常拋出之后,后面的代碼將不會再被執(zhí)行顶捷。
//創(chuàng)建可拋出一個異常的函數(shù)
function checkNum($number){
if($number>1){
throw new Exception("異常提示-數(shù)字必須小于等于1");
}
return true;
}
//在 "try" 代碼塊中觸發(fā)異常
try{
checkNum(2);
//如果異常被拋出,那么下面一行代碼將不會被輸出
echo '如果能看到這個提示屎篱,說明你的數(shù)字小于等于1';
}catch(Exception $e){
//捕獲異常
echo '捕獲異常: ' .$e->getMessage();
}
- 2服赎、異常處理類
PHP具有很多異常處理類,其中Exception是所有異常處理的基類交播。
Exception具有幾個基本屬性與方法重虑,其中包括了:
message 異常消息內容
code 異常代碼
file 拋出異常的文件名
line 拋出異常在該文件的行數(shù)
其中常用的方法有:
getTrace 獲取異常追蹤信息
getTraceAsString 獲取異常追蹤信息的字符串
getMessage 獲取出錯信息
如果必要的話,可以通過繼承Exception類來建立自定義的異常處理類秦士。
//自定義的異常類缺厉,繼承了PHP的異常基類Exception
class MyException extends Exception {
function getInfo() {
return '自定義錯誤信息';
}
}
try {
//使用異常的函數(shù)應該位于 "try" 代碼塊內。如果沒有觸發(fā)異常提针,則代碼將照常繼續(xù)執(zhí)行命爬。但是如果異常被觸發(fā),會拋出一個異常辐脖。
throw new MyException('error');//這里規(guī)定如何觸發(fā)異常饲宛。注意:每一個 "throw" 必須對應至少一個 "catch",當然可以對應多個"catch"
} catch(Exception $e) {//"catch" 代碼塊會捕獲異常嗜价,并創(chuàng)建一個包含異常信息的對象
echo $e->getInfo();//獲取自定義的異常信息
echo $e->getMessage();//獲取繼承自基類的getMessage信息
}