1. GET和POST的區(qū)別
? 區(qū)別:
Get從服務(wù)器獲取數(shù)據(jù),Post向服務(wù)器傳送數(shù)據(jù)
Get傳值在url中可見,Post在url中不可見
Get傳值一般在2KB以內(nèi),Post傳值大小可以在php.ini中進(jìn)行設(shè)置
Get安全性非常低,Post安全性較高,執(zhí)行效率卻比Post高
? 建議:
get式安全性較Post式要差些包含機(jī)密信息建議用Post數(shù)據(jù)提交式;
做數(shù)據(jù)查詢建議用Get式;做數(shù)據(jù)添加、修改或刪除建議用Post方式
2. SESSION和COOKIE的區(qū)別
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙考慮到安全應(yīng)當(dāng)使用session。
session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。
單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
3.?SESSION多服務(wù)器間共享
服務(wù)器實(shí)現(xiàn)的 session 復(fù)制或 session 共享,如 webSphere或 JBOSS 在搭集群時(shí)配置實(shí)現(xiàn) session 復(fù)制或 session 共享.致命缺點(diǎn):不好擴(kuò)展和移植。
利用成熟技術(shù)做session復(fù)制,如12306使用的gemfire,如常見內(nèi)存數(shù)據(jù)庫redis或memorycache,雖較普適但依賴第三方.
將 session維護(hù)在客戶端,利用 cookie,但客戶端存在風(fēng)險(xiǎn)數(shù)據(jù)不安全,且可以存放的數(shù)據(jù)量較小,所以將session 維護(hù)在客戶端還要對(duì) session 中的信息加密。
第二種方案和第三種方案的合體,可用gemfire實(shí)現(xiàn) session 復(fù)制共享,還可將session 維護(hù)在 redis中實(shí)現(xiàn) session 共享,同時(shí)可將 session 維護(hù)在客戶端的cookie 中,但前提是數(shù)據(jù)要加密。
4. 瀏覽器禁用cookie后php如何保持session會(huì)話
可以用隱藏表單手動(dòng)帶上sessid
在使用session時(shí),服務(wù)器會(huì)發(fā)送sessionid,標(biāo)志為PHPSESSID(這個(gè)關(guān)鍵字可以在php.ini文件中配置),我們可以在超鏈接傳輸?shù)刂穮?shù)時(shí),把PHPSESSID帶上/或者帶上常量sid,sid是php中sessionid的常量,一般sid的格式為PHPSESSID=6ibdh4timhdpi14acq1ianqte6,以key=value鍵值對(duì)方式記錄,value是session文件的名稱,可以在啟動(dòng)session之前,指定sessionid
if (isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
5. Redis
Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis 優(yōu)勢(shì):性能極高 豐富的數(shù)據(jù)類型 原子性 豐富的特性。
6.什么是存儲(chǔ)過程?用什么來調(diào)用???MySQL存儲(chǔ)過程
7. 數(shù)據(jù)庫優(yōu)化
(1)選擇正確的存儲(chǔ)引擎(2)優(yōu)化字段的數(shù)據(jù)類型(3)為搜索字段添加索引(4)只返回需要的字段,避免使用Select *(5)使用 ENUM 而不是 VARCHAR(6)盡可能的使用 NOT NULL(7)固定表的長度(8)數(shù)據(jù)分頁處理(9)減少交互次數(shù)(10)使用存儲(chǔ)過程(11)防止SQL注入(11)提高SQL可讀性(12)Like模糊查詢?
8. HTTP協(xié)議
基于客戶端/服務(wù)端(C/S)的架構(gòu)模型,是一個(gè)無狀態(tài)的請(qǐng)求/響應(yīng)協(xié)議,通過URL進(jìn)行數(shù)據(jù)傳輸和建立連接。
客戶端請(qǐng)求格式:請(qǐng)求行(request line)、請(qǐng)求頭部(header)、空行和請(qǐng)求數(shù)據(jù)。
服務(wù)器響應(yīng)分別是:狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。
HTTP請(qǐng)求方法:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE 和 CONNECT。
HTTP狀態(tài)碼:1**(信息), 2**(成功), 3**(重定向), 4**(客戶端錯(cuò)誤), 5**(服務(wù)器錯(cuò)誤)
HTTP content-type(內(nèi)容類型).
9. 微信開發(fā)
1. 微信運(yùn)行機(jī)制
公眾號(hào)與php之間用什么語言通信:Xml
如何接收公眾號(hào)數(shù)據(jù)的:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//接收數(shù)據(jù)? XML數(shù)據(jù)
2. 消息類型
? ?微信目前提供了7種基本消息類型,分別為:
(1)文本消息(text);(2)圖片消息(image);(3)語音(voice)(4)視頻(video)(5)地理位置(location);(6)鏈接消息(link);(7)事件推送(event)類型。掌握不同的消息類型發(fā)送時(shí)的數(shù)據(jù)傳遞格式
10. PHP7新特性
10PHP 7 異常
11. 瀏覽器數(shù)據(jù)庫
隨著瀏覽器的處理能力不斷增強(qiáng),越來越多的網(wǎng)站開始考慮,將大量數(shù)據(jù)儲(chǔ)存在客戶端,這樣可以減少用戶等待從服務(wù)器獲取數(shù)據(jù)的時(shí)間。
一、localStorage ?— 本地存儲(chǔ) ?可以長期存儲(chǔ)數(shù)據(jù),沒有時(shí)間限制。
? ? ??可以存儲(chǔ) :數(shù)組、json數(shù)據(jù)、圖片、腳本、樣式文件
function?test(){
if(window.localStorage){//判斷瀏覽器是否支持?localStorage
var?ls=window.localStorage;
ls.setItem("name","張三");//設(shè)置值
var?name=?ls.getItem("name");//取值
ls.removeItem("name");//刪除數(shù)據(jù)
}else{
alert('瀏覽器不支持?localStorage');
}
}
?存在的局限性: 子域名之間不能共享存儲(chǔ)數(shù)據(jù);超出存儲(chǔ)范圍后可以使用 LRU、FIFO 技術(shù)處理;
二、sessionStorage生命周期為當(dāng)前窗口或標(biāo)簽頁,一旦窗口或標(biāo)簽頁被永久關(guān)閉了,那么所有通過sessionStorage存儲(chǔ)的數(shù)據(jù)也就被清空了。
三、IndexedDB
1、使用IndexedDB的原因
? ? ? 現(xiàn)有的瀏覽器端數(shù)據(jù)儲(chǔ)存方案,都不適合儲(chǔ)存大量數(shù)據(jù):cookie不超過4KB,且每次請(qǐng)求都會(huì)發(fā)送回服務(wù)器端;Window.name屬性缺乏安全性,
?且沒有統(tǒng)一的標(biāo)準(zhǔn);localStorage在2.5MB到10MB之間(各家瀏覽器不同)。所以,需要一種新的 ? 解 ?決方案,這就是IndexedDB誕生的背景。
2、什么是IndexedDB
? ? ? ? 通俗地說,IndexedDB就是瀏覽器端數(shù)據(jù)庫,可以被網(wǎng)頁腳本程序創(chuàng)建和操作。它允許儲(chǔ)存大量數(shù)據(jù),提供查找接口,還能建立索引。
? 這些都是localStorage所不具備的。就數(shù)據(jù)庫類型而言,IndexedDB不屬于關(guān)系型數(shù)據(jù)庫(不支持SQL查詢語 ? 句),更接近NoSQL數(shù)據(jù)庫。
3、IndexedDB的特點(diǎn)。
(1) ? ? ?鍵值對(duì)儲(chǔ)存。?IndexedDB內(nèi)部采用對(duì)象倉庫(object store)存放數(shù)據(jù)。所有類型的數(shù)據(jù)都可以直接存入,包括JavaScript對(duì)象。在對(duì)象倉庫中,
? ? ? ? 數(shù)據(jù)以“鍵值對(duì)”的形式保存,每一個(gè)數(shù)據(jù)都有對(duì)應(yīng)的鍵名,鍵名是獨(dú)一無二的,不能有重復(fù),否則會(huì)拋出一個(gè)錯(cuò)誤。
(2)異步。?IndexedDB操作時(shí)不會(huì)鎖死瀏覽器,用戶依然可以進(jìn)行其他操作,這與localStorage形成對(duì)比,后者的操作是同步的。異步設(shè)計(jì)是為了防止大量數(shù)據(jù)的讀寫,拖慢網(wǎng)頁的表現(xiàn)。
(3)支持事務(wù)。?IndexedDB支持事務(wù)(transaction),這意味著一系列操作步驟之中,只要有一步失敗,整個(gè)事務(wù)就都取消,數(shù)據(jù)庫回到事務(wù)發(fā)生之前的狀態(tài),不存在只改寫一部分?jǐn)?shù)據(jù)的情況。
(4)同域限制?IndexedDB也受到同域限制,每一個(gè)數(shù)據(jù)庫對(duì)應(yīng)創(chuàng)建該數(shù)據(jù)庫的域名。來自不同域名的網(wǎng)頁,只能訪問自身域名下的數(shù)據(jù)庫,而不能訪問其他域名下的數(shù)據(jù)庫。
(5)儲(chǔ)存空間大?IndexedDB的儲(chǔ)存空間比localStorage大得多,一般來說不少于250MB。IE的儲(chǔ)存上限是250MB,Chrome和Opera是剩余空間的某個(gè)百分比,F(xiàn)irefox則沒有上限。
(6)支持二進(jìn)制儲(chǔ)存。?IndexedDB不僅可以儲(chǔ)存字符串,還可以儲(chǔ)存二進(jìn)制數(shù)據(jù)。
目前,Chrome 27+、Firefox 21+、Opera 15+和IE 10+支持這個(gè)API,但是Safari完全不支持。
IndexedDB是HTML5規(guī)范里新出現(xiàn)的瀏覽器里內(nèi)置的數(shù)據(jù)庫。對(duì)于在瀏覽器里存儲(chǔ)數(shù)據(jù),你可以使用cookies或local storage,但它們都是比較簡單的技術(shù),而IndexedDB提供了類似數(shù)據(jù)庫風(fēng)格的數(shù)據(jù)存儲(chǔ)和使用方式。存儲(chǔ)在IndexedDB里的數(shù)據(jù)是永久保存,不像cookies那樣只是臨時(shí)的。IndexedDB里提供了查詢數(shù)據(jù)的功能,在online和offline模式下都能使用。你可以用IndexedDB存儲(chǔ)大型數(shù)據(jù)。
IndexedDB里數(shù)據(jù)以對(duì)象的形式存儲(chǔ),每個(gè)對(duì)象都有一個(gè)key值索引。IndexedDB里的操作都是事務(wù)性的。一種對(duì)象存儲(chǔ)在一個(gè)objectStore里,objectStore就相當(dāng)于關(guān)系數(shù)據(jù)庫里的表。IndexedDB可以有很多objectStore,objectStore里可以有很多對(duì)象。每個(gè)對(duì)象可以用key值獲取。
IndexedDB vs LocalStorage
IndexedDB和LocalStorage都是用來在瀏覽器里存儲(chǔ)數(shù)據(jù),但它們使用不同的技術(shù),有不同的用途,你需要根據(jù)自己的情況適當(dāng)?shù)倪x擇使用哪種。LocalStorage是用key-value鍵值模式存儲(chǔ)數(shù)據(jù),但跟IndexedDB不一樣的是,它的數(shù)據(jù)并不是按對(duì)象形式存儲(chǔ)。它存儲(chǔ)的數(shù)據(jù)都是字符串形式。如果你想讓LocalStorage存儲(chǔ)對(duì)象,你需要借助JSON.stringify()能將對(duì)象變成字符串形式,再用JSON.parse()將字符串還原成對(duì)象。但如果要存儲(chǔ)大量的復(fù)雜的數(shù)據(jù),這并不是一種很好的方案。畢竟,localstorage就是專門為小數(shù)量數(shù)據(jù)設(shè)計(jì)的,它的api是同步的。
IndexedDB很適合存儲(chǔ)大量數(shù)據(jù),它的API是異步調(diào)用的。IndexedDB使用索引存儲(chǔ)數(shù)據(jù),各種數(shù)據(jù)庫操作放在事務(wù)中執(zhí)行。IndexedDB甚至還支持簡單的數(shù)據(jù)類型。IndexedDB比localstorage強(qiáng)大得多,但它的API也相對(duì)復(fù)雜。
對(duì)于簡單的數(shù)據(jù),你應(yīng)該繼續(xù)使用localstorage,但當(dāng)你希望存儲(chǔ)大量數(shù)據(jù)時(shí),IndexedDB會(huì)明顯的更適合,IndexedDB能提供你更為復(fù)雜的查詢數(shù)據(jù)的方式。
IndexedDB vs Web SQL
WebSQL也是一種在瀏覽器里存儲(chǔ)數(shù)據(jù)的技術(shù),跟IndexedDB不同的是,IndexedDB更像是一個(gè)NoSQL數(shù)據(jù)庫,而WebSQL更像是關(guān)系型數(shù)據(jù)庫,使用SQL查詢數(shù)據(jù)。W3C已經(jīng)不再支持這種技術(shù)。具體情況請(qǐng)看:http://www.w3.org/TR/webdatabase/。
因?yàn)椴辉僦С?,所以你就不要在?xiàng)目中使用這種技術(shù)了。
IndexedDB vs Cookies
Cookies(小甜點(diǎn))聽起來很好吃,但實(shí)際上并不是。每次HTTP接受和發(fā)送都會(huì)傳遞Cookies數(shù)據(jù),它會(huì)占用額外的流量。例如,如果你有一個(gè)10KB的Cookies數(shù)據(jù),發(fā)送10次請(qǐng)求,那么,總計(jì)就會(huì)有100KB的數(shù)據(jù)在網(wǎng)絡(luò)上傳輸。Cookies只能是字符串。瀏覽器里存儲(chǔ)Cookies的空間有限,很多用戶禁止瀏覽器使用Cookies。所以,Cookies只能用來存儲(chǔ)小量的非關(guān)鍵的數(shù)據(jù)。
IndexedDB的用法
想要理解IndexedDB,最好的方法是創(chuàng)建一個(gè)簡單的web應(yīng)用:把你們班的學(xué)生的學(xué)號(hào)和姓名存儲(chǔ)在IndexedDB里。IndexedDB里提供了簡單的增、刪、改、查接口。
打開一個(gè)IndexedDB數(shù)據(jù)庫
首先,你需要知道你的瀏覽器是否支持IndexedDB。請(qǐng)使用最新版的谷歌瀏覽器或火狐瀏覽器。低版本的IE是不行的。
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if(!window.indexedDB)
{
? ? console.log("你的瀏覽器不支持IndexedDB");
}
一旦你的瀏覽器支持IndexedDB,我們就可以打開它。你不能直接打開IndexedDB數(shù)據(jù)庫。IndexedDB需要你創(chuàng)建一個(gè)請(qǐng)求來打開它。
var request = window.indexedDB.open("testDB", 2);
第一個(gè)參數(shù)是數(shù)據(jù)庫的名稱,第二個(gè)參數(shù)是數(shù)據(jù)庫的版本號(hào)。版本號(hào)可以在升級(jí)數(shù)據(jù)庫時(shí)用來調(diào)整數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)。
但你增加數(shù)據(jù)庫版本號(hào)時(shí),會(huì)觸發(fā)onupgradeneeded事件,這時(shí)可能會(huì)出現(xiàn)成功、失敗和阻止事件三種情況。
var db;
request.onerror = function(event){
? ? console.log("打開DB失敗", event);
}
request.onupgradeneeded? = function(event){
? ? console.log("Upgrading");
? ? db = event.target.result;
? ? var objectStore = db.createObjectStore("students", { keyPath : "rollNo" });
};
request.onsuccess? = function(event){
? ? console.log("成功打開DB");
? ? db = event.target.result;
}
onupgradeneeded事件在第一次打開頁面初始化數(shù)據(jù)庫時(shí)會(huì)被調(diào)用,或在當(dāng)有版本號(hào)變化時(shí)。所以,你應(yīng)該在onupgradeneeded函數(shù)里創(chuàng)建你的存儲(chǔ)數(shù)據(jù)。如果沒有版本號(hào)變化,而且頁面之前被打開過,你會(huì)獲得一個(gè)onsuccess事件。如果有錯(cuò)誤發(fā)生時(shí)則觸發(fā)onerror事件。如果你之前沒有關(guān)閉連接,則會(huì)觸發(fā)onblocked事件。
在上面的代碼片段里,我們創(chuàng)建了一個(gè)Object Store,叫做“students”,用“rollNo”做數(shù)據(jù)鍵名。
往ObjectStore里新增對(duì)象
為了往數(shù)據(jù)庫里新增數(shù)據(jù),我們首先需要?jiǎng)?chuàng)建一個(gè)事務(wù),并要求具有讀寫權(quán)限。在indexedDB里任何的存取對(duì)象的操作都需要放在事務(wù)里執(zhí)行。
var transaction = db.transaction(["students"],"readwrite");
transaction.oncomplete = function(event) {
? ? console.log("Success");
};
transaction.onerror = function(event) {
? ? console.log("Error");
};?
var objectStore = transaction.objectStore("students");
objectStore.add({rollNo: rollNo, name: name});
從ObjectStore里刪除對(duì)象
刪除跟新增一樣,需要?jiǎng)?chuàng)建事務(wù),然后調(diào)用刪除接口,通過key刪除對(duì)象。
db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);
我把語句合并到了一起,變得更簡單,但效果是一樣的。
通過key取出對(duì)象
往get()方法里傳入對(duì)象的key值,取出相應(yīng)的對(duì)象。
var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);
request.onsuccess = function(event){
? ? console.log("Name : "+request.result.name);? ?
};
更新一個(gè)對(duì)象
為了更新一個(gè)對(duì)象,首先要把它取出來,修改,然后再放回去。
var transaction = db.transaction(["students"],"readwrite");
var objectStore = transaction.objectStore("students");
var request = objectStore.get(rollNo);
request.onsuccess = function(event){
? ? console.log("Updating : "+request.result.name + " to " + name);
? ? request.result.name = name;
? ? objectStore.put(request.result);
};
13.三層結(jié)構(gòu)
????????所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫之間加入了一個(gè)中間件層,也叫組件層。這里所 說的三層體系,不是指物理上的三層,不是簡單地放置三臺(tái)機(jī)器就是三層體系結(jié)構(gòu),也 不僅僅有B/S應(yīng)用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即使這三個(gè)層放置到一 臺(tái)機(jī)器上。 三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗(yàn)等工作放到了中 間層進(jìn)行處理。通常情況下,客戶端不直接與數(shù)據(jù)庫進(jìn)行交互,而是通過COM/DCOM通 訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交換。
概念
表現(xiàn)層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見所得。
業(yè)務(wù)邏輯層(BLL):針對(duì)具體問題的操作,也可以說是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
數(shù)據(jù)訪問層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫,針對(duì)數(shù)據(jù)的增添、刪除、修改、查找等。
?優(yōu)點(diǎn)
無需開發(fā)客戶端軟件,維護(hù)和升級(jí)方便。
可跨平臺(tái)操作。
具有良好的開放性和可擴(kuò)充性。
便于數(shù)據(jù)庫移植。
安全性好
資源重用性好。
缺點(diǎn)
有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都增加相應(yīng)的代碼。
相對(duì)于不分層的編程方法,使用三層或多層架構(gòu)的應(yīng)用于程序運(yùn)行效率低,代碼量大,難度增加。