php的會話控制


image.png

php的會話控制,什么是會話控制,http等。
什么是會話控制思想,http協議。

cookie 和 session

http是超文本傳輸協議,是網絡上最廣泛的一種網絡協議。

http最大特點是無連接無狀態,clinet到http request到server,server到http response到clinet。

建立一個連接,連接完結束了。

image.png

cookie保存在客戶端中,內存中的cookie,由瀏覽器維護,保存在內存中,瀏覽器關閉后就沒了,保存在硬盤中的 cookie,有一個過期時間,除非手動清除和過期時間過了。

cookie使用場景

image.png

image.png

Cookie:達成服務器和瀏覽器之間長久連接的狀態。

瀏覽器的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); ?>

image.png

image.png

setrawcookie()不會進行urlencode()編碼

setrawcookie-send a cookie without urlencoding the cookie value.

更新cookie,刪除cookie

image.png

image.png

通過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); } };

image.png

Cookie實戰之自動登陸

image.png

image.png

image.png

<?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>"); }

image.png

image.png

image.png

image.png

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();

image.png

image.png

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工作原理

image.png

服務器會把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/>';

image.png

image.png

<?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

image.png

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定義用來序列化/解序列化的處理器名字

image.png

當用戶禁用掉cookie之后是否還可以用:

image.png

可以用,原理是傳遞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登錄應用

image.png

默認會話管理器是文件形式,一個用戶對應一個文件,不總以應對千萬訪問級別。

使用mysql作為會話管理器,因為需要到數據庫進行查詢,會影響性能。

最佳方法:使用memcache或redis作為會話管理器。

php自定義session 調用方式

image.png

image.png

image.png

image.png

image.png

image.png

要在一個函數中訪問一個全局變量,需要使用 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 命令輸出字符串

image.png

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 ] )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM