php的會話控制,什麼是會話控制,http等。
什麼是會話控制思想,http協議。php
cookie 和 sessionhtml
http是超文本傳輸協議,是網絡上最普遍的一種網絡協議。mysql
http最大特色是無鏈接無狀態,clinet到http request到server,server到http response到clinet。web
創建一個鏈接,鏈接完結束了。redis
cookie保存在客戶端中,內存中的cookie,由瀏覽器維護,保存在內存中,瀏覽器關閉後就沒了,保存在硬盤中的 cookie,有一個過時時間,除非手動清除和過時時間過了。sql
cookie使用場景數據庫
Cookie:達成服務器和瀏覽器之間長久鏈接的狀態。json
瀏覽器的cookie以小文件的形式保存在客戶端中。數組
做用:長期登陸,購物車。瀏覽器
設置cookie: bool
setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
$expire:默認爲0s。time()
認識COOKIE?
1.cookie是存儲在客戶端中的,至於怎麼存儲,存儲的文件是什麼這和服務器沒有關係,和客戶端有關係。
2.COOKIE過時了,也是客戶端來判斷要不要傳遞給服務器,若是過時了就刪除對應的COOKIE文件。用戶也能夠手動的清理COOKIE,那麼以前保存的COOKIE就所有不見了
3.COOKIE發送到服務器也是有條件的,不是何時都發送,要符合指定的域名,指定的路徑等信息纔會發送到對應的服務器上去。
4.COOKIE也是能夠僞造的,因此檢查服務器發送的COOKIE是否合法有效就很關鍵
<?php // 內存cookie,瀏覽器關閉後cookie數據消失了 setcookie('username','dashu'); setcookie('age',12); setcookie('email','dashucoding'); ?>
讀取cookie,cookie數據保持在$_COOKIE,這是一個數組
<?php var_dump($_COOKIE); ?>
setrawcookie()不會進行urlencode()編碼
setrawcookie-send a cookie without urlencoding the cookie value.
更新cookie,刪除cookie
經過header的方式操做cookie
<?php 經過header形式設置cookie // header('Set-Cookie: a=1'); header('Set-Cookie: b=2;expires='.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); header('Set-Cookie: b=2;expires='.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600).'; domain=.php.org'); ?>
var Cookie={ set: function(key, val, expiresDays){ // 判斷是否設置expiresDays if(expiresDays) { var date = new Date(); date.setTime(date.getTime() + expiresDays*24*3600*1000);// 格式化時間 var expiresStr = "expires=" + date.toGTMString() + ';'; }else{ var expiresStr = ''; } document.cookie = key+"=" +escape(val)+";"+expiresStr; }, get: function(key){ var getCookie=document.cookie.replace(/[ ]/g, ' ' ); var resArr = getCookie.split(';'); var res; for(var i=0, len = resArr.length; i<len; i++){ var arr = resArr[i].split('='); if(arr[0] == key){ res=arr[1]; break; } } return unescape(res); } };
Cookie實戰之自動登錄
<?php $username = $_POST['username']; $password = md5($_POST['password']); $autoLogin = $_POST['autoLogin']; $link= mysqli_connect('localhost', 'root', '') or die('Connect Error'); mysqli_set_charset($link, 'utf8'); mysqli_setlect_db($link, 'test1') or die ('Database Open Error'); $sql="SELECT id,username,password FROM user WHERE username=' {$username}' && password='{$password}' "; $sql = mysqli_escape_string($link,$sql); $result = mysqli_query($link, $sql); if(mysqli_num_rows($result) == 1){ if($autoLogin == 1){ $row = mysqli_fetch_assoc($resutl); setcookie('username', $username, strtotime('+7 days')); $salt = 'king'; $auth = md5($username.$password.$salt).":".$row['id']; setcookie('auth',$auth,strtotime('+7 days')); }else{ setcookie('username', $username); } exit("<script>alert('登陸成功'); location.href = 'index.php'; </script>"); }else{ exit("<script>alert('登陸失敗'); location.href = 'login.php'; <script>"); }
mysqli_connect mysqli_set_charset mysqli_select_db mysqli_escape_string mysqli_query mysqli_num_rows
封裝cookie
// cookie的設置,讀取,更新,刪除 <?php class CustomCookie{ static private $_instance = null; private $expire = 0; private $path=''; private $domain=''; private $secure = false; private $httponly = false; // 構造函數完成cookie參數初始化 private function __construct(array $options = []) { $this->setOptions($options); } // 設置相關選項 private function setOptions(array $options=[]){ if(iset($options['expire'])){ $this -> expire = (int) $options['expire']; } if(isset($options['path'])){ $this->path = $options['path']; } if(isset($options['domain'])){ $this->domain=$options['domain']; } if(isset($options['secure'])){ $this->secure=(bool)$options['secure']; } if(isset($options['httponly'])){ $this->httponly=(bool)$options['httponly']; } return $this; } // 單例模式 public static function getInstance(array $options = []) { if(is_null(self::$_instance)){ $class= __CLASS__; self::$_instance = new $class($options); } return self::$_instance; } // 設置cookie public function set(string $name, $value, array $options=[]){ if(is_array($options)&&count($options)>0){ $this->setOptions($options); } if(is_array($value) || is_object($value)){ $value=json_encode($value,JSON_FORCE_OBJECT); } setcookie($name,$value,$this-expire,$this->path,$this->domain,$this->secure,$this->httponly); } // 獲得指定cookie public function get(string $name){ if(isset($_COOKIE[$name])){ return substr($_COOKIE[$name],0,1) == '{'?json_decode($_COOKIE[$name]):$_COOKIE[$name]; }else{ return null; } } // 刪除 pulic function delete(string $name, array $options=[]){ if(is_array($options) && count($options)>0){ $this->setOptions($options); } if(isset($_COOKIE[$name])){ setcookie($name,'',time()-1,$this->path,$this->domain,$this->secure,$this->httponly); unset($_COOKIE[$name]); } } // 刪除全部 public function deleteAll(array $options=[]){ if(is_array($options) && count($options)>0){ $this->setOptions($options); } if(!empty($_COOKIE)){ foreach($_COOKIE as $name=>$value){ setcookie($name,'',time()-1,$this->path,$this->domain,$this->secure,$this->httponly); unset($_COOKIE[$name]); } } } } $cookie=CustomCookie::getInstance(); var_dump($cookie); $cookie -> set('dashu',111); $cookie -> set('dashucoding',111); $cookie -> set('dada', 222, ['expire'=> time+3600]); $cookie -> set('user', ['username' => 'dashu', 'age'=>12]); var_dump($cookie->get['user']); $cookie->delete('user'); $cookie->deleteAll();
var Custom_localStorage={ set:function(key,value){ var item={ data:value } localStorage.setItem(key,JSON.stringify(item)); }, get:function(key){ var val=localStorage.getItem(key); if(!val) return null; val = JSON.parse(val); return val; } };
var Custom_localStorage={ //添加緩存時間 set:function(key,value,days){ var item={ data:value, endTime:new Date().getTime()+days*24*3600*1000 }; localStorage.setItem(key,JSON.stringify(item)); }, get:function(key){ val val = localStorage.getItem(key); if(!val) return null; val=JSON.parse(val); if(new Date().getTime()>val.endTime){ var = null; localStorage.removeItem(key); } return val.data; }, remove:function(key){ localStorage.removeItem(key); return null; }, removeAll: function(){ localStorage.clear(); return null; } };
什麼是session?
session會話控制,會話支持在php中是在併發訪問時由一個方法來保存某些數據,從而使你可以構建更多的定製程序,從而提升你的web網站的吸引力。
一個訪問者訪問你的web網站將被分配一個惟一的id,就是所謂的會話id,這個id能夠存儲在用戶端的一個cookie中,也能夠經過url進行傳遞。
session對象存儲特定用戶會話所需的屬性及配置信息。
session工做原理
服務器會把session_id發送到瀏覽器保存,通常瀏覽器會把這個id保存到cookie中
以後的每一次訪問,都會攜帶cookie中存儲的這個session_id
憑着session_id到服務器上領取本身的信息
// 開啓會話 session_start() $_SESSION來設置和讀取全局變量 // 銷燬 session_destroy()
<?php header('content-type:text/html;charset=utf-8'); // 開啓會話 session_start(); // 設置數據 $_SESSION['username'] = 'dashu'; $_SESSION['email'] = '23@qq.com'; echo 'session名字', session_name(), session_id(), '<br/>';
<?php session_start(); $_SESSION['da'] = 'dashucoding'; setcookie(session_name(), session_id(), time()+3600);
<?php session_start(); $userList = [ 'user1'=>[ 'id'=>1, 'username'=>'da1', 'email' => 'cc.com'], 'user2'=>[ 'id'=>1, 'username'=>'da1', 'email' => 'cc.com'], ]; $_SESSION = $userList
session_id的傳遞方式:
session.save_handler string
session.save_handler定義了來存儲和獲取與會話關聯的數據的處理器的名字
session.save_path string
session.save_path定義了傳遞給存儲處理器的參數
session.name string
session.name指定會話名以用作cookie的名字
session.auto_start boolean
session.auto_start 指定會話模塊是否在請求開始時自動啓動一個會話,默認爲0
session.serialize_handler string
session.serialize_handler定義用來序列化/解序列化的處理器名字
當用戶禁用掉cookie以後是否還能夠用:
能夠用,原理是傳遞session_id。
銷燬session,將$_SESSION清空,$_SESSION=[];,將cookie中的數據清除,setcookie();銷燬會話session_destroy()。
session_destroy: destroys all data registered to a session
// 銷燬會話 <?php // 初始化會話 session_start(); // 重置會話中的全部變量 $_SESSION = array(); if(ini_get("session.use_cookies")){ $params = session_get_cookie_params(); setcookie(session_name(),'', time() - 42000, $params["path"],$params["domain], $params["secure"],$params["httponly"] ); } // 最後,銷燬會話 session_destroy(); ?>
session登陸應用
默認會話管理器是文件形式,一個用戶對應一個文件,不總以應對千萬訪問級別。
使用mysql做爲會話管理器,由於須要到數據庫進行查詢,會影響性能。
最佳方法:使用memcache或redis做爲會話管理器。
php自定義session 調用方式
要在一個函數中訪問一個全局變量,須要使用 global 關鍵字
<?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; // 輸出 15 ?>
<?php $x=5; $y=10; function myTest() { $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y']; } myTest(); echo $y; ?>
PHP static關鍵詞
<?php function myTest() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest(); ?>
每次調用,該變量將會保留着前一次被調用時的值。
兩種基本的輸出方法:echo、print
echo 命令輸出字符串
print 命令輸出字符串
PHP字符串
PHP整型
PHP浮點型
PHP 布爾型
PHP 對象
PHP NULL 值
<?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; echo $x; ?>
PHP 常量
define() 函數
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
好了,歡迎在留言區留言,與你們分享你的經驗和心得。
感謝你學習今天的內容,若是你以爲這篇文章對你有幫助的話,也歡迎把它分享給更多的朋友,感謝。
感謝!承蒙關照!您真誠的讚揚是我前進的最大動力!