1. GET和POST的區(qū)別
? 區(qū)別:
Get從服務器獲取數據蜕乡,Post向服務器傳送數據
Get傳值在url中可見,Post在url中不可見
Get傳值一般在2KB以內针余,Post傳值大小可以在php.ini中進行設置
Get安全性非常低,Post安全性較高,執(zhí)行效率卻比Post高
? 建議:
get式安全性較Post式要差些包含機密信息建議用Post數據提交式速和;
做數據查詢建議用Get式;做數據添加剥汤、修改或刪除建議用Post方式
2. SESSION和COOKIE的區(qū)別
cookie數據存放在客戶的瀏覽器上颠放,session數據放在服務器上。
cookie不是很安全吭敢,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session碰凶。
session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面欲低,應當使用COOKIE辕宏。
單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie砾莱。
3.?SESSION多服務器間共享
服務器實現的 session 復制或 session 共享瑞筐,如 webSphere或 JBOSS 在搭集群時配置實現 session 復制或 session 共享.致命缺點:不好擴展和移植。
利用成熟技術做session復制腊瑟,如12306使用的gemfire聚假,如常見內存數據庫redis或memorycache,雖較普適但依賴第三方.
將 session維護在客戶端闰非,利用 cookie膘格,但客戶端存在風險數據不安全,且可以存放的數據量較小财松,所以將session 維護在客戶端還要對 session 中的信息加密瘪贱。
第二種方案和第三種方案的合體,可用gemfire實現 session 復制共享游岳,還可將session 維護在 redis中實現 session 共享政敢,同時可將 session 維護在客戶端的cookie 中,但前提是數據要加密胚迫。
4. 瀏覽器禁用cookie后php如何保持session會話
可以用隱藏表單手動帶上sessid
在使用session時喷户,服務器會發(fā)送sessionid,標志為PHPSESSID(這個關鍵字可以在php.ini文件中配置)访锻,我們可以在超鏈接傳輸地址參數時褪尝,把PHPSESSID帶上/或者帶上常量sid,sid是php中sessionid的常量期犬,一般sid的格式為PHPSESSID=6ibdh4timhdpi14acq1ianqte6河哑,以key=value鍵值對方式記錄,value是session文件的名稱龟虎,可以在啟動session之前璃谨,指定sessionid
if (isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
5. Redis
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中鲤妥,重啟的時候可以再次加載進行使用佳吞。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list棉安,set底扳,zset,hash等數據結構的存儲贡耽。
Redis支持數據的備份衷模,即master-slave模式的數據備份鹊汛。
Redis 優(yōu)勢:性能極高 豐富的數據類型 原子性 豐富的特性。
6.什么是存儲過程阱冶?用什么來調用刁憋???MySQL存儲過程
7. 數據庫優(yōu)化
(1)選擇正確的存儲引擎(2)優(yōu)化字段的數據類型(3)為搜索字段添加索引(4)只返回需要的字段,避免使用Select *(5)使用 ENUM 而不是 VARCHAR(6)盡可能的使用 NOT NULL(7)固定表的長度(8)數據分頁處理(9)減少交互次數(10)使用存儲過程(11)防止SQL注入(11)提高SQL可讀性(12)Like模糊查詢?
8. HTTP協(xié)議
基于客戶端/服務端(C/S)的架構模型熙揍,是一個無狀態(tài)的請求/響應協(xié)議职祷,通過URL進行數據傳輸和建立連接。
客戶端請求格式:請求行(request line)届囚、請求頭部(header)有梆、空行和請求數據。
服務器響應分別是:狀態(tài)行意系、消息報頭泥耀、空行和響應正文。
HTTP請求方法:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE 和 CONNECT蛔添。
HTTP狀態(tài)碼:1**(信息), 2**(成功), 3**(重定向), 4**(客戶端錯誤), 5**(服務器錯誤)
HTTP content-type(內容類型).
9. 微信開發(fā)
1. 微信運行機制
公眾號與php之間用什么語言通信:Xml
如何接收公眾號數據的:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//接收數據? XML數據
2. 消息類型
? ?微信目前提供了7種基本消息類型痰催,分別為:
(1)文本消息(text);(2)圖片消息(image)迎瞧;(3)語音(voice)(4)視頻(video)(5)地理位置(location)夸溶;(6)鏈接消息(link);(7)事件推送(event)類型凶硅。掌握不同的消息類型發(fā)送時的數據傳遞格式
10. PHP7新特性
10PHP 7 異常
11. 瀏覽器數據庫
隨著瀏覽器的處理能力不斷增強缝裁,越來越多的網站開始考慮,將大量數據儲存在客戶端足绅,這樣可以減少用戶等待從服務器獲取數據的時間捷绑。
一、localStorage ?— 本地存儲 ?可以長期存儲數據氢妈,沒有時間限制粹污。
? ? ??可以存儲 :數組、json數據首量、圖片壮吩、腳本、樣式文件
function?test(){
if(window.localStorage){//判斷瀏覽器是否支持?localStorage
var?ls=window.localStorage;
ls.setItem("name","張三");//設置值
var?name=?ls.getItem("name");//取值
ls.removeItem("name");//刪除數據
}else{
alert('瀏覽器不支持?localStorage');
}
}
?存在的局限性: 子域名之間不能共享存儲數據加缘;超出存儲范圍后可以使用 LRU粥航、FIFO 技術處理;
二生百、sessionStorage生命周期為當前窗口或標簽頁,一旦窗口或標簽頁被永久關閉了柄延,那么所有通過sessionStorage存儲的數據也就被清空了蚀浆。
三缀程、IndexedDB
1、使用IndexedDB的原因
? ? ? 現有的瀏覽器端數據儲存方案市俊,都不適合儲存大量數據:cookie不超過4KB杨凑,且每次請求都會發(fā)送回服務器端;Window.name屬性缺乏安全性摆昧,
?且沒有統(tǒng)一的標準撩满;localStorage在2.5MB到10MB之間(各家瀏覽器不同)。所以绅你,需要一種新的 ? 解 ?決方案伺帘,這就是IndexedDB誕生的背景。
2忌锯、什么是IndexedDB
? ? ? ? 通俗地說伪嫁,IndexedDB就是瀏覽器端數據庫,可以被網頁腳本程序創(chuàng)建和操作偶垮。它允許儲存大量數據张咳,提供查找接口,還能建立索引似舵。
? 這些都是localStorage所不具備的脚猾。就數據庫類型而言,IndexedDB不屬于關系型數據庫(不支持SQL查詢語 ? 句)砚哗,更接近NoSQL數據庫龙助。
3、IndexedDB的特點频祝。
(1) ? ? ?鍵值對儲存泌参。?IndexedDB內部采用對象倉庫(object store)存放數據。所有類型的數據都可以直接存入常空,包括JavaScript對象沽一。在對象倉庫中,
? ? ? ? 數據以“鍵值對”的形式保存漓糙,每一個數據都有對應的鍵名铣缠,鍵名是獨一無二的,不能有重復昆禽,否則會拋出一個錯誤蝗蛙。
(2)異步。?IndexedDB操作時不會鎖死瀏覽器醉鳖,用戶依然可以進行其他操作捡硅,這與localStorage形成對比,后者的操作是同步的盗棵。異步設計是為了防止大量數據的讀寫壮韭,拖慢網頁的表現北发。
(3)支持事務。?IndexedDB支持事務(transaction)喷屋,這意味著一系列操作步驟之中琳拨,只要有一步失敗,整個事務就都取消屯曹,數據庫回到事務發(fā)生之前的狀態(tài)狱庇,不存在只改寫一部分數據的情況。
(4)同域限制?IndexedDB也受到同域限制恶耽,每一個數據庫對應創(chuàng)建該數據庫的域名密任。來自不同域名的網頁,只能訪問自身域名下的數據庫驳棱,而不能訪問其他域名下的數據庫批什。
(5)儲存空間大?IndexedDB的儲存空間比localStorage大得多,一般來說不少于250MB社搅。IE的儲存上限是250MB驻债,Chrome和Opera是剩余空間的某個百分比,Firefox則沒有上限形葬。
(6)支持二進制儲存合呐。?IndexedDB不僅可以儲存字符串,還可以儲存二進制數據笙以。
目前淌实,Chrome 27+、Firefox 21+猖腕、Opera 15+和IE 10+支持這個API拆祈,但是Safari完全不支持。
IndexedDB是HTML5規(guī)范里新出現的瀏覽器里內置的數據庫倘感。對于在瀏覽器里存儲數據放坏,你可以使用cookies或local storage,但它們都是比較簡單的技術老玛,而IndexedDB提供了類似數據庫風格的數據存儲和使用方式淤年。存儲在IndexedDB里的數據是永久保存,不像cookies那樣只是臨時的蜡豹。IndexedDB里提供了查詢數據的功能麸粮,在online和offline模式下都能使用。你可以用IndexedDB存儲大型數據镜廉。
IndexedDB里數據以對象的形式存儲弄诲,每個對象都有一個key值索引。IndexedDB里的操作都是事務性的娇唯。一種對象存儲在一個objectStore里齐遵,objectStore就相當于關系數據庫里的表凤巨。IndexedDB可以有很多objectStore,objectStore里可以有很多對象洛搀。每個對象可以用key值獲取。
IndexedDB vs LocalStorage
IndexedDB和LocalStorage都是用來在瀏覽器里存儲數據佑淀,但它們使用不同的技術留美,有不同的用途,你需要根據自己的情況適當的選擇使用哪種伸刃。LocalStorage是用key-value鍵值模式存儲數據谎砾,但跟IndexedDB不一樣的是,它的數據并不是按對象形式存儲捧颅。它存儲的數據都是字符串形式景图。如果你想讓LocalStorage存儲對象,你需要借助JSON.stringify()能將對象變成字符串形式碉哑,再用JSON.parse()將字符串還原成對象挚币。但如果要存儲大量的復雜的數據,這并不是一種很好的方案扣典。畢竟妆毕,localstorage就是專門為小數量數據設計的,它的api是同步的贮尖。
IndexedDB很適合存儲大量數據笛粘,它的API是異步調用的。IndexedDB使用索引存儲數據湿硝,各種數據庫操作放在事務中執(zhí)行薪前。IndexedDB甚至還支持簡單的數據類型。IndexedDB比localstorage強大得多关斜,但它的API也相對復雜示括。
對于簡單的數據,你應該繼續(xù)使用localstorage蚤吹,但當你希望存儲大量數據時例诀,IndexedDB會明顯的更適合,IndexedDB能提供你更為復雜的查詢數據的方式裁着。
IndexedDB vs Web SQL
WebSQL也是一種在瀏覽器里存儲數據的技術繁涂,跟IndexedDB不同的是,IndexedDB更像是一個NoSQL數據庫二驰,而WebSQL更像是關系型數據庫扔罪,使用SQL查詢數據。W3C已經不再支持這種技術桶雀。具體情況請看:http://www.w3.org/TR/webdatabase/矿酵。
因為不再支持唬复,所以你就不要在項目中使用這種技術了。
IndexedDB vs Cookies
Cookies(小甜點)聽起來很好吃全肮,但實際上并不是敞咧。每次HTTP接受和發(fā)送都會傳遞Cookies數據,它會占用額外的流量辜腺。例如休建,如果你有一個10KB的Cookies數據,發(fā)送10次請求评疗,那么测砂,總計就會有100KB的數據在網絡上傳輸。Cookies只能是字符串百匆。瀏覽器里存儲Cookies的空間有限砌些,很多用戶禁止瀏覽器使用Cookies。所以加匈,Cookies只能用來存儲小量的非關鍵的數據存璃。
IndexedDB的用法
想要理解IndexedDB,最好的方法是創(chuàng)建一個簡單的web應用:把你們班的學生的學號和姓名存儲在IndexedDB里矩动。IndexedDB里提供了簡單的增有巧、刪、改悲没、查接口篮迎。
打開一個IndexedDB數據庫
首先,你需要知道你的瀏覽器是否支持IndexedDB示姿。請使用最新版的谷歌瀏覽器或火狐瀏覽器甜橱。低版本的IE是不行的。
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if(!window.indexedDB)
{
? ? console.log("你的瀏覽器不支持IndexedDB");
}
一旦你的瀏覽器支持IndexedDB栈戳,我們就可以打開它岂傲。你不能直接打開IndexedDB數據庫。IndexedDB需要你創(chuàng)建一個請求來打開它子檀。
var request = window.indexedDB.open("testDB", 2);
第一個參數是數據庫的名稱镊掖,第二個參數是數據庫的版本號。版本號可以在升級數據庫時用來調整數據庫結構和數據褂痰。
但你增加數據庫版本號時亩进,會觸發(fā)onupgradeneeded事件,這時可能會出現成功缩歪、失敗和阻止事件三種情況归薛。
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事件在第一次打開頁面初始化數據庫時會被調用,或在當有版本號變化時。所以主籍,你應該在onupgradeneeded函數里創(chuàng)建你的存儲數據习贫。如果沒有版本號變化,而且頁面之前被打開過千元,你會獲得一個onsuccess事件苫昌。如果有錯誤發(fā)生時則觸發(fā)onerror事件。如果你之前沒有關閉連接幸海,則會觸發(fā)onblocked事件蜡歹。
在上面的代碼片段里,我們創(chuàng)建了一個Object Store涕烧,叫做“students”,用“rollNo”做數據鍵名汗洒。
往ObjectStore里新增對象
為了往數據庫里新增數據议纯,我們首先需要創(chuàng)建一個事務,并要求具有讀寫權限溢谤。在indexedDB里任何的存取對象的操作都需要放在事務里執(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里刪除對象
刪除跟新增一樣,需要創(chuàng)建事務世杀,然后調用刪除接口阀参,通過key刪除對象。
db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);
我把語句合并到了一起瞻坝,變得更簡單蛛壳,但效果是一樣的。
通過key取出對象
往get()方法里傳入對象的key值所刀,取出相應的對象衙荐。
var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);
request.onsuccess = function(event){
? ? console.log("Name : "+request.result.name);? ?
};
更新一個對象
為了更新一個對象,首先要把它取出來浮创,修改忧吟,然后再放回去。
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.三層結構
????????所謂三層體系結構斩披,是在客戶端與數據庫之間加入了一個中間件層溜族,也叫組件層。這里所 說的三層體系垦沉,不是指物理上的三層煌抒,不是簡單地放置三臺機器就是三層體系結構,也 不僅僅有B/S應用才是三層體系結構乡话,三層是指邏輯上的三層摧玫,即使這三個層放置到一 臺機器上。 三層體系的應用程序將業(yè)務規(guī)則、數據訪問诬像、合法性校驗等工作放到了中 間層進行處理屋群。通常情況下,客戶端不直接與數據庫進行交互坏挠,而是通過COM/DCOM通 訊與中間層建立連接芍躏,再經由中間層與數據庫進行交換。
概念
表現層(UI):通俗講就是展現給用戶的界面降狠,即用戶在使用一個系統(tǒng)的時候他的所見所得对竣。
業(yè)務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作榜配,對數據業(yè)務邏輯處理否纬。
數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添蛋褥、刪除临燃、修改、查找等烙心。
?優(yōu)點
無需開發(fā)客戶端軟件膜廊,維護和升級方便。
可跨平臺操作淫茵。
具有良好的開放性和可擴充性爪瓜。
便于數據庫移植。
安全性好
資源重用性好匙瘪。
缺點
有時會導致級聯(lián)的修改铆铆。這種修改尤其體現在自上而下的方向。如果在表示層中需要增加一個功能丹喻,為保證其設計符合分層式結構算灸,可能需要在相應的業(yè)務邏輯層和數據訪問層中都增加相應的代碼。
相對于不分層的編程方法驻啤,使用三層或多層架構的應用于程序運行效率低菲驴,代碼量大,難度增加骑冗。