PHP進階(二)

一掌栅、會話控制

  • 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信息
}

四艇抠、數(shù)據(jù)庫操作

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市久锥,隨后出現(xiàn)的幾起案子家淤,更是在濱河造成了極大的恐慌,老刑警劉巖瑟由,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件絮重,死亡現(xiàn)場離奇詭異,居然都是意外死亡错妖,警方通過查閱死者的電腦和手機绿鸣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暂氯,“玉大人潮模,你說我怎么就攤上這事〕帐” “怎么了擎厢?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辣吃。 經(jīng)常有香客問我动遭,道長,這世上最難降的妖魔是什么神得? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任厘惦,我火速辦了婚禮,結果婚禮上哩簿,老公的妹妹穿的比我還像新娘宵蕉。我一直安慰自己,他們只是感情好节榜,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布羡玛。 她就那樣靜靜地躺著,像睡著了一般宗苍。 火紅的嫁衣襯著肌膚如雪稼稿。 梳的紋絲不亂的頭發(fā)上薄榛,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音让歼,去河邊找鬼敞恋。 笑死,一個胖子當著我的面吹牛是越,可吹牛的內容都是我干的耳舅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼倚评,長吁一口氣:“原來是場噩夢啊……” “哼浦徊!你這毒婦竟也來了?” 一聲冷哼從身側響起天梧,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤盔性,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呢岗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冕香,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年后豫,在試婚紗的時候發(fā)現(xiàn)自己被綠了悉尾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挫酿,死狀恐怖构眯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情早龟,我是刑警寧澤惫霸,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站葱弟,受9級特大地震影響壹店,放射性物質發(fā)生泄漏。R本人自食惡果不足惜芝加,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一硅卢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藏杖,春花似錦将塑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春哆键,著一層夾襖步出監(jiān)牢的瞬間始鱼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留责鳍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓兽间,卻偏偏與公主長得像历葛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘀略,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 一恤溶、會話控制(session與cookie) 1.cookie簡介 Cookie是存儲在客戶端瀏覽器中的數(shù)據(jù),我們...
    空谷悠閱讀 623評論 0 5
  • Php:腳本語言帜羊,網(wǎng)站建設咒程,服務器端運行 PHP定義:一種服務器端的HTML腳本/編程語言,是一種簡單的、面向對象...
    廖馬兒閱讀 2,137評論 2 38
  • cookie Cookie是存儲在客戶端瀏覽器中的數(shù)據(jù)讼育,通過Cookie來跟蹤和存儲用戶數(shù)據(jù)帐姻。一般情況下,Cook...
    wrlynxayy閱讀 204評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理奶段,服務發(fā)現(xiàn)饥瓷,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 一痹籍、php可以做什么 php是一種可以在服務器端運行的編程語言呢铆,可以運行在Web服務器端。 php是一門后臺編程語...
    空谷悠閱讀 3,096評論 4 97