摘要:三次握手所謂三次握手,是指簡歷一個連接時需要客戶端和服務(wù)器總共發(fā)送三個包三次握手的目的是連接服務(wù)器指定端口,簡歷連接,并同步連接雙方的序列號并交換窗口大小信息。
關(guān)于作者
昨天在思否上發(fā)了這篇整理,晚上10點多看到了很多贊收藏和關(guān)注,其實挺愧疚的,因為最近在找工作這篇文章并沒有整理完??吹竭@個還挺受歡迎的,也因為新工作基本定下來了,現(xiàn)在的公司正常交接中,打算下周末之前把這個知識梳理整理完,感謝各位的點贊、收藏和關(guān)注,大家一起努力。
另外,我自己的博客網(wǎng)站在這,哈哈:https://www.linganmin.cn
算法與數(shù)據(jù)結(jié)構(gòu) BTree和B+treeBTree
B樹是為了磁盤或者其他存儲設(shè)備而設(shè)計的一種多叉平衡查找樹,相對于二叉樹,B樹的每個內(nèi)節(jié)點有多個分支,即多叉。
參考文章:https://www.jianshu.com/p/da5...
B+Tree
B+樹是B樹的變體,也是一種多路搜索樹。
參考文章:https://www.jianshu.com/p/da5...
排序算法
快速排序
快速排序是十分常用的高效率的算法,其思想是:先選一個標(biāo)尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它
function quickSort($arr){ // 獲取數(shù)組長度 $length = count($arr); // 判斷長度是否需要繼續(xù)二分比較 if($length <= 1){ return $arr; } // 定義基準(zhǔn)元素 $base = $arr[0]; // 定義兩個空數(shù)組,用于存放和基準(zhǔn)元素的比較后的結(jié)果 $left = []; $right = []; // 遍歷數(shù)組 for ($i=1; $i < $length; $i++) { // 和基準(zhǔn)元素作比較 if ($arr[$i] > $base) { $right[] = $arr[$i]; }else { $left[] = $arr[$i]; } } // 然后遞歸分別處理left和right $left = quickSort($left); $right = quickSort($right); // 合并 return array_merge($left,[$base],$right); }
冒泡排序
思路:法如其名,就像冒泡一樣,每次從數(shù)組中冒出一個最大的數(shù)
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){ // 獲取數(shù)組長度 $length = count($arr); // 第一層循環(huán)控制冒泡輪次 for ($i=0; $i < $length-1; $i++) { // 內(nèi)層循環(huán)控制從第0個鍵值和后一個鍵值比較,每次冒出一個最大的數(shù) for ($k=0; $k < $length-$i-1; $k++) { if($arr[$k] > $arr[$k+1]){ $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; }
選擇排序
思路:每次選擇一個相應(yīng)的元素,然后將其放到指定的位置
function selectSort($arr){ // 實現(xiàn)思路 // 雙重循環(huán)完成,外層控制輪數(shù),當(dāng)前的最小值,內(nèi)層控制比較次數(shù) // 獲取長度 $length = count($arr); for ($i=0; $i < $length - 1; $i++) { // 假設(shè)最小值的位置 $p = $i; // 使用假設(shè)的最小值和其他值比較,找到當(dāng)前的最小值 for ($j=$i+1; $j < $length; $j++) { // $arr[$p] 是已知的當(dāng)前最小值 // 判斷當(dāng)前循環(huán)值和已知最小值的比較,當(dāng)發(fā)下更小的值時記錄下鍵,并進行下一次比較 if ($arr[$p] > $arr[$j]) { $p = $j; // 比假設(shè)的值更小 } } // 通過內(nèi)部for循環(huán)找到了當(dāng)前最小值的key,并保存在$p中 // 判斷 日光當(dāng)前$p 中的鍵和假設(shè)的最小值的鍵不一致增將其互換 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } // 返回最終結(jié)果 return $arr; }計算機網(wǎng)絡(luò) TCP/UDP區(qū)別
TCP
TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議
TCP面向連接,提供可靠地數(shù)據(jù)服務(wù)
TCP首部開銷20字節(jié)
TCP邏輯通信信道是全雙工的可靠信道
TCP連接只能是點到點的
UDP
UDP是參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠的信息傳遞服務(wù)
UDP無連接,不可靠
UDP首部開銷8字節(jié)
UDP邏輯通信信道是不可靠信道
UDP沒有擁塞機制,因此網(wǎng)絡(luò)出現(xiàn)擁堵不會使源主機的發(fā)送效率降低
UDP支持一對一,多對一,多對多的交互通信
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個連接,完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)。
簡單點說:A與B建立TCP連接時,首先A向B發(fā)送SYN(同步請求),然后B回復(fù)SYN+ACK(同步請求應(yīng)答),最后A回復(fù)ACK確認(rèn),這樣TCP的一次連接(三次握手)就完成了。
TCP三次握手
所謂三次握手,是指簡歷一個TCP連接時需要客戶端和服務(wù)器總共發(fā)送三個包
三次握手的目的是連接服務(wù)器指定端口,簡歷TCP連接,并同步連接雙方的序列號并交換TCP窗口大小信息。
TCP三次握手圖解:
第一次握手
客戶端發(fā)送一個TCP的SYN標(biāo)志位置1的包,指明客戶打算連接的服務(wù)器的端口,以及初始化序號,保存在包頭的序列號字段里
第二次握手
服務(wù)器發(fā)揮確認(rèn)包應(yīng)答,即SYN標(biāo)志位和ACK標(biāo)志均為1,同時將確認(rèn)序號設(shè)置為客戶的ISN加1,即X+1
第三次握手
客戶端再次發(fā)送確認(rèn)包,SYN標(biāo)識為0,ACK標(biāo)識為1,并且把服務(wù)器發(fā)來的序號字段+1,放在確定字段中發(fā)送給對方,并且在數(shù)據(jù)字段寫入ISN的+1
簡單解釋TCP三次握手:
參考:https://github.com/jawil/blog...
四次揮手
TCP的連接的拆除需要發(fā)送四個包,因此稱為四次揮手??蛻舳嘶蚍?wù)器均可主動發(fā)起揮手動作。
由于TCP連接時全雙工的,因此每個方向都必須多帶帶進行關(guān)閉。這個原則是當(dāng)一方完成他的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接。收到一個FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。
為什么是三次握手四次揮手
這是因為服務(wù)端的LISTEN狀態(tài)下的socket當(dāng)收到SKY報文的簡歷連接的請求后,它可以把ACK和SYN放在一個報文里來發(fā)送。但關(guān)閉連接時,當(dāng)收到對方的FIN報文通知時,他僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了,但未必你的所有數(shù)據(jù)都全部發(fā)送給對方了,所以你可以不是馬上回關(guān)閉socket,即你可能還會發(fā)送一些數(shù)據(jù)給對方之后,在發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以這里的ACK和FIN報文多情況下都是分開發(fā)送的。
TCP在真正的讀寫操作之前,server和client之間必須建立一個連接,當(dāng)讀寫操作完成后,雙方不再需要這個鏈接時他們可能釋放這個連接,連接的建立是通過三次握手,釋放則需要四次揮手,所以說每個連接的建立都是需要消耗資源和時間的。
TCP短連接
client向server發(fā)起連接請求
server接到請求,雙方建立連接
client向server發(fā)消息
server回應(yīng)client
一次讀寫完成,此時雙方任何一個都可以發(fā)起close操作
一般都是client先發(fā)起close操作,因為一般的server不會回復(fù)完client就立即關(guān)閉連接
所以短連接一般只會在client和server間傳遞一次讀寫操作,短連接管理起來比較簡單,存在的連接都是有用的連接,不需要額外的控制手段
長連接
client向server發(fā)起連接
server接到請求后,雙方建立連接
client向server發(fā)送消息
server回應(yīng)client
一次讀寫完成,連接不關(guān)閉
后續(xù)讀寫操作
長/短連接的操作過程
短連接的操作步驟:
建立連接 -> 數(shù)據(jù)傳輸 -> 關(guān)閉連接
長連接的操作步驟:
建立連接 -> 數(shù)據(jù)傳輸 -> (保持連接) -> 數(shù)據(jù)傳輸 -> 關(guān)閉連接
長/短連接的優(yōu)缺點
長連接可以省去較多的TCP建立和關(guān)閉操作,減少資源浪費,節(jié)省時間,對于比較頻繁的請求資源的客戶端比較適用于長連接
短連接對于服務(wù)器來說管理較為簡單,存在的連接都是有用的連接,不需要額外的控制手段
從瀏覽器輸入域名到展示頁面都發(fā)生了什么DNS域名解析
先找本地hosts文件,檢查對應(yīng)域名ip的關(guān)系,有則想ip地址發(fā)送請求,沒有再去找DNS服務(wù)器
建立TCP連接
拿到服務(wù)器IP后,向服務(wù)器發(fā)送求求,三次握手,建立TCP連接
簡單理解三次握手:
客戶端:您好,在家不,有你快遞
服務(wù)端:在的,送來吧
客戶端:好滴,來了
發(fā)送HTTP請求
與服務(wù)器建立連接后,就可以向服務(wù)器發(fā)起請求了。具體請求內(nèi)容可以在瀏覽器中查看
服務(wù)器處理請求
服務(wù)器收到請求后由web服務(wù)器(Apache,Nginx)處理請求,web服務(wù)器解析用戶請求,知道了需要調(diào)用那些資源文件,再通過相應(yīng)的這些資源文件處理用戶請求和參數(shù),并調(diào)用數(shù)據(jù)庫等,然后將結(jié)果通過web服務(wù)器返回給瀏覽器
返回響應(yīng)結(jié)果
在響應(yīng)結(jié)果中都會有一個HTTP狀態(tài)碼,諸如我們熟知的200、404、500等
狀態(tài)碼都是由三位數(shù)字和原因短語組成,大致為五類:
1XX 信息性狀態(tài)碼 接收的請求正在處理
2XX 成功狀態(tài)碼 請求正常處理完畢
3XX 重定向狀態(tài)碼 需要附加操作以完成請求
4XX 客戶端錯誤狀態(tài)碼 服務(wù)器也無法處理的請求
5XX 服務(wù)器錯誤狀態(tài)碼 服務(wù)器請求處理出錯
關(guān)閉TCP連接
為了避免服務(wù)器與客戶端雙方資源占用和消耗,當(dāng)雙方?jīng)]有請求或者響應(yīng)傳遞時,任意一方都可以發(fā)起關(guān)閉請求,與創(chuàng)建TCP連接的三次握手類似,關(guān)閉TCP連接需要4次揮手
簡單比喻為:
客戶端:哥們,我這邊沒有數(shù)據(jù)要傳了,咱們關(guān)閉連接吧
服務(wù)端:好的,我看看我這邊還有數(shù)據(jù)不
服務(wù)端:兄弟,我這邊也沒數(shù)據(jù)要傳給你了,咱們可以關(guān)閉連接了
客戶端:好嘞
瀏覽器解析HTML
瀏覽器布局渲染
設(shè)計模式設(shè)計模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
單例模式當(dāng)需要保證對象只有一個實例的時候,單例模式是非常有用的。他把創(chuàng)建對象的控制權(quán)交給一個單一的點上,任何時候應(yīng)用程序都只會存在且僅存在一個實例。單例類不應(yīng)該能在類的外部進行實例化。
一個單例類應(yīng)該具備以下幾個因素:
必須擁有一個訪問級別為private的構(gòu)造函數(shù),用于阻止類被隨意實例化
必須擁有一個保存類的實例的靜態(tài)變量
必須擁有一個訪問這個實例的公共靜態(tài)方法,該方法通常被命名為getInstance()
必須擁有一個私有的空的clone方法,防止實例被克隆復(fù)制
簡單實例:
class Single { public static $_instance; private function __construct() { } private function __clone() { } public static function getInstance() { if (!self::$_instance) { self::$_instance = new self(); } return self::$_instance; } public function sayHi() { echo "Hi "; } } $single = Single::getInstance(); $single->sayHi();工廠模式
工廠模式解決的是如何不通過new建立實例對象的方法
工廠模式是一種類,它具有為你創(chuàng)建對象的某些方法,你可以使用工廠類創(chuàng)建對象而不使用new。這樣,如果你想要更改所創(chuàng)建的對象類型只需要更改工廠即可,使用該工廠的所有代碼會自動更改。
工廠模式往往配合接口一起使用,這樣應(yīng)用程序就不必要知道這些被實例化的類的具體細(xì)節(jié),只要知道工廠返回的是支持某個接口的類就可以方便的使用了。
簡單舉例:
/** * 抽象出一個人的接口 * Interface Person */ interface Person { public function showInfo(); } /** * 一個繼承于抽象人接口的學(xué)生類 * Class Student */ class Student implements Person { public function showInfo() { echo "這是一個學(xué)生 "; } } /** * 一個繼承于抽象人接口的老師類 * Class Teacher */ class Teacher implements Person { public function showInfo() { echo "這是一個老師 "; } } /** * 人類工廠 * Class PersonFactory */ class PersonFactory { public static function factory($person_type) { // 將傳入的類型首字母大寫 $class_name = ucfirst($person_type); if(class_exists($class_name)){ return new $class_name; }else{ throw new Exception("類:$class_name 不存在",1); } } } // 需要一個學(xué)生 $student = PersonFactory::factory("student"); echo $student->showInfo(); // 需要一個老師的時候 $teacher = PersonFactory::factory("teacher"); echo $teacher->showInfo();緩存相關(guān) Redis和Memcached的區(qū)別
Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。但是Memcache還可以緩存其他東西,比如圖片、視頻
Redis不只支持簡單的k/v類型的數(shù)據(jù),同時還提供list、set、hash等數(shù)據(jù)結(jié)構(gòu)的存儲
虛擬內(nèi)存,當(dāng)物理內(nèi)存用完時Redis可以將一些很久沒有用到的value交換到磁盤
過期策略,memcache在set時就指定,例如set key1 0 0 8即永不過期,redis可以通過expire設(shè)定,例如:expire name 10
分布式,設(shè)定memcache集群,利用magent做一主多從;redis也可以做一主多從。
存儲安全,memcache掛掉后,數(shù)據(jù)沒了;redis可以定期保存在磁盤(持久化)
災(zāi)難恢復(fù),memcache掛掉后數(shù)據(jù)不可恢復(fù);redis數(shù)據(jù)丟失后可以通過aof恢復(fù)
redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份
應(yīng)用場景不同:redis除了可以做nosql數(shù)據(jù)庫之外,還能做消息隊列、數(shù)據(jù)堆棧和數(shù)據(jù)緩存等。memcache適合于緩存sql語句、數(shù)據(jù)集、用戶臨時性數(shù)據(jù)、延遲查詢數(shù)據(jù)和session等
redis有哪些數(shù)據(jù)結(jié)構(gòu)
String
字符串類型是redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),首先鍵是字符串類型,而且其他幾種結(jié)構(gòu)都是在字符串類型基礎(chǔ)上構(gòu)建的
字符串類型實際上可以是字符串、數(shù)字、二進制(圖片、音頻),單最大不能超過512M
使用場景:
緩存
字符串最經(jīng)典的使用場景,redis作為緩存層,mysql作為存儲層,絕大部分請求數(shù)據(jù)都是redis中獲取,由于redis具有支撐高并發(fā)特性,所以緩存通常能起到加速讀寫和降低后端壓力的作用
計數(shù)器
許多應(yīng)用都會使用redis作為技術(shù)的基礎(chǔ)工具,它可以實現(xiàn)快速技術(shù)、查詢緩存的功能。
共享session
處于負(fù)載均衡的考慮,分布式服務(wù)會將用戶信息的訪問均衡到不同服務(wù)器,用戶刷新一次訪問可訥訥個會需要重新登錄,為了避免這個問題可以使用redis將用戶session集中管理,在這種模式下只要保證redis的高可用和擴展性,每次獲取用戶更新或查詢登錄信息都直接從redis中集中獲取
限速
出于安全考慮,每次進行登錄時讓用戶輸入手機驗證碼,為了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率
Hash
在redis中哈希類型是指鍵本身又是一種鍵值對結(jié)構(gòu),如 value = {{field1,value1}...{fieldn,valuen}}
使用場景:
哈希結(jié)構(gòu)相對于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。
list
列表類型是用來存儲多個有序的字符串,列表的每個字符串成為一個元素,一個列表最多可以存儲2的32次方減1個元素。在redis中,可以對列表插入(push)和彈出(pop),還可以獲取指定范圍的元素列表。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng)棧和隊列的角色。
使用場景:
消息隊列
redis的lpush+brpop命令組合就可以實現(xiàn)阻塞隊列,生產(chǎn)者客戶端是用lpush從列表左側(cè)插入元素,多個消費者客戶端使用brpop命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費的負(fù)載均衡的高可用性。
使用技巧列表
lpush+lpop=Stack(棧) lpush+rpop=Queue(隊列) lpush+ltrim=Capped Collection(有限集合) lpush+brpop=Message Queue(消息隊列)
set
sortedset
redis是單線程的么,為什么因為CPU并不是Redis的瓶頸,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶寬。既然單線程容易實現(xiàn),而且CPU不會成為瓶頸,那么久順理成章的采用了單線程的方案。
當(dāng)然單個Redis進程是沒辦法使用多核的 ,但是它來就不是非常計算密集型的服務(wù)。如果單核性能不夠用,可以多開幾個進程。
redis的部署方式,主從、集群參考文章:https://segmentfault.com/a/11...
redis的哨兵模式參考文章:https://www.cnblogs.com/xifen...
redis的持久化策略RDB(快照持久化)
AOF(只追加文件持久化)
參考文章:https://segmentfault.com/a/11...
隊列和棧的區(qū)別
什么是隊列?什么是棧?
隊列(Queue):是限定只能在表的一端進行插入和在另一端刪除操作的線性表。
棧(Stack):是限定之能在表的一端進行插入和刪除操作的線性表。
隊列和棧的規(guī)則
隊列:先進先出
棧:先進后出
隊列和棧的遍歷數(shù)據(jù)速度
隊列:基于地址指針進行遍歷,而且可以從頭部或者尾部進行遍歷,但不能同時遍歷,無需開辟空間,因為在遍歷的過程中不影響數(shù)據(jù)結(jié)構(gòu),所以遍歷速度要快。
棧:只能從頂部取數(shù)據(jù),也就是說最先進入棧底的,需要遍歷整個棧才能取出來,而且在遍歷數(shù)據(jù)的同事需要微數(shù)據(jù)開辟臨時空間,保持?jǐn)?shù)據(jù)在遍歷前的一致性。
PHP基礎(chǔ)
雙引號單引號區(qū)別
雙引號解釋變量,單引號不解釋變量
雙引號里插入單引號,其中單引號里如果有變量的話,變量解釋
雙引號的變量名后面必須要有一個非數(shù)字、字母、下劃線的特殊字符,或者用{}講變量括起來,否則會將變量名后面的部分當(dāng)做一個整體,引起語法錯誤
能使單引號字符盡量使用單引號,單引號的效率比雙引號要高
GET和POST提交方式的區(qū)別
GET產(chǎn)生一個TCP數(shù)據(jù)包;POST產(chǎn)生兩個TCP數(shù)據(jù)包;
對于GET方式的請求,瀏覽器會把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回數(shù)據(jù))
對于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回數(shù)據(jù))。
GET在瀏覽器回退時是無害的,而POST會再次提交請求
GET請求會被瀏覽器主動cache,而POST不會,除非手動設(shè)置
GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留
GET請求只能進行url編碼,而POST支持多種編碼方式
GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息
如何獲取客戶端的真實ip
$_SERVER["REMOTE_ADDR"]或getenv("REMOTE_ADDR")
可以使用ip2long()轉(zhuǎn)成數(shù)字
include和require的區(qū)別
require是無條件包含,也就是如果一個流程里加入require,無論條件成立與否都會先執(zhí)行require,當(dāng)文件不存在或者無法打開的時候,會提示錯誤,并且會終止程序執(zhí)行
include有返回值,而require沒有(可能因為如此require的速度比include快),如果被包含的文件不存在的化,那么會提示一個錯誤,但是程序會繼續(xù)執(zhí)行下去
注意:包含文件不存在或者語法錯誤的時候require是致命的,而include不是
AJAX的優(yōu)勢是什么
ajax是異步傳輸技術(shù),可以通過javascript實現(xiàn),也可以通過JQuery框架實現(xiàn),實現(xiàn)局部刷新,減輕了服務(wù)器的壓力,也提高了用戶體驗
在程序的開發(fā)中,如何提高程序的運行效率
優(yōu)化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;
少用子查詢可用表連接代替;
少用模糊查詢;
數(shù)據(jù)表中創(chuàng)建索引;
對程序中經(jīng)常用到的數(shù)據(jù)生成緩存;
SESSION與COOKIE的區(qū)別
存儲位置:session存儲在服務(wù)器,cookie存儲在瀏覽器
安全性:session安全性高于cookie
參考鏈接:https://www.zhihu.com/questio...
isset和empty的區(qū)別
isset()函數(shù) 一般用來檢測變量是否設(shè)置
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE
empty()函數(shù)是檢查變量是否為空
若變量不存在則返回 TRUE
若變量存在且其值為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 TURE
若變量存在且值不為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 FALSE
數(shù)據(jù)庫三范式
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標(biāo)識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
主鍵、外鍵和索引的區(qū)別
定義
主鍵--唯一標(biāo)識一條記錄,不能有重復(fù)的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引--該字段沒有重復(fù)值,但可以有一個空值
作用
主鍵--用來保證數(shù)據(jù)完整性
外鍵--用來和其他表建立聯(lián)系用的
索引--是提高查詢排序的速度
個數(shù)
主鍵--主鍵只能有一個
外鍵--一個表可以有多個外鍵
索引--一個表可以有多個唯一索引
堆和棧的區(qū)別
棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運行情況確定要分配的堆內(nèi)存的大小。
composer學(xué)習(xí)地址:http://docs.phpcomposer.com/0...
composer.json中的自動加載映射目前PSR-0自動加載、PSR-4自動加載、classmap生成和files引入都是被支持的,PSR-4是首推的方法,因為它提供了更大的易用性。
PSR-4
PSR-4規(guī)范了如何指定文件路徑從而自動加載類,同時規(guī)范了自動加載文件的位置。乍一看這是和PSR-0重復(fù)了,實際上,在功能上確實有一部分重復(fù)。區(qū)別在于,PSR-4的規(guī)范比較干凈,去除了兼容PHP5.3以前版本的內(nèi)容。
PSR-4和PSR-0最大的區(qū)別是對下劃線的定義不同,PSR-4中,在類名中使用下劃線是沒有特殊含義的,而在PSR-0的規(guī)則中,下劃線或被轉(zhuǎn)化為目錄分隔符
在PSR-4的鍵下,你可以定義命名空間和路徑的映射關(guān)系,當(dāng)自動加載類如FooBarBaz時,命名空間Foo指向一個名為src/的目錄意味著自動加載器將查找名為src/Bar/Baz.php文件并引用它。
命名空間的前綴必須以結(jié)尾,以避免類似前綴之間的沖突。在安裝和更新期間,PSR-4引用全部組合到一個key=>value數(shù)組中,該數(shù)組可以在生成的文件vendor/composer/autoload_psr4.php中找到。
例子:
{ "autoload": { "psr-4": { "App": "App/" // 命名空間App映射到目錄App } } }
classmap
classmap引用的所有組合,都會在安裝、更新的過程中生成并存儲到vendor/composer/autoload_classmap.php文件中。
你可以使用classmap生成支持自定義加載的不遵循PSR-4規(guī)范的類庫,要配置它指向的目錄,以便能夠準(zhǔn)確的搜索到類文件
例子:
{ "autoload": { "classmap": ["src/", "lib/", "Something.php"] } }
Files
如果你想要明確指定,在每次請求時都要載入某些文件,那么你可以使用files字段加載。通常作為函數(shù)庫的載入方式。
例子:
{ "autoload": { "files": ["src/MyLibrary/functions"] } }PHP框架 Laravel相關(guān)
Laravel是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你構(gòu)建一個完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡潔、富于表達力。
因為Laravel對底層的封裝很深,所以你可能需要先去了解什么是依賴注入,什么是Laravel的服務(wù)容器,關(guān)于這兩點我整理了下面兩個鏈接,一個是(Symfony框架作者)寫的什么是依賴注入,一個是深入研究Laravel的依賴注入容器(是我翻譯的國外一大神的)
什么是依賴注入
譯文深入研究Laravel的依賴注入容器
前端相關(guān) 參考復(fù)習(xí)資料面試的信心來源于過硬的基礎(chǔ)
前端筆試題面試題記錄(上)
JavaScript 值傳遞 VS 引用傳遞參考文章:數(shù)值類型vs引用類型
JavaScript有5種通過復(fù)制數(shù)值傳值的數(shù)據(jù)類型:Boolean、null、undefind、String、Number,稱之為基本數(shù)據(jù)類型。
JavaScript還有三種通過引用傳值的數(shù)據(jù)類型:Array、Function、Object,他們統(tǒng)稱為Objects,故而稱為對象。
基本數(shù)據(jù)類型
如果為一個基本數(shù)據(jù)類型變量賦值,我們可以認(rèn)為變量包含這個原始值
var x = 100; var y = "abx"; var z = null; var is_login = false;
當(dāng)我們使用=將這些變量賦值給其他變量時,我們把這些值拷貝給了這些新變量,他們是通過值復(fù)制的,也就是說在內(nèi)存中會同時存在兩個值相同的變量,并指向不同的內(nèi)存空間:
var x = 100; var name = "saboran"; var a = x; var b = name;
值傳遞的好處是:當(dāng)改變其中一個變量的值時并不會影響另一個變量的值。
對象
非基本數(shù)據(jù)類型的變量會保存對值(地址)的引用。該引用指向內(nèi)存中對象的地址,變量實際不包含該實際值。對象創(chuàng)建于計算機內(nèi)存中,當(dāng)我們寫下代碼var arr = [],我們實際上是在內(nèi)存中創(chuàng)建了一個新數(shù)組,arr中現(xiàn)在包含了新數(shù)組在內(nèi)存中的地址。
引用賦值
當(dāng)一個對象被用=賦值給另一個變量,實際上是復(fù)制過去的是那個對象在內(nèi)存中的地址。對象通過引用賦值而不是直接傳值,對象本身是靜態(tài)不變的、唯一改變的是對象的引用地址。
參考文章:理解 JavaScript 作用域
聲明提升參考文章:JavaScript 變量聲明提升
閉包參考文檔:JavaScript閉包
this參考文章:javascript中的this作用域詳解
apply、call、bind參考文章:javascript中call()、apply()、bind()的用法終于理解
參考文章:獨家解析Javascript原型繼承
教程廖雪峰的JavaScript全棧教程
參考文章20個必會的JavaScript面試題
VueJSVueJs雙向數(shù)據(jù)綁定原理
Linux Cors跨域CORS的基本原理是通過設(shè)置HTTP請求和返回中header,告知瀏覽器該請求是合法的。這涉及到服務(wù)器端和瀏覽器端雙方的設(shè)置:請求的發(fā)起(Http Request Header)和服務(wù)器對請求正確的響應(yīng)(Http response header)。
參考文章:https://zhuanlan.zhihu.com/p/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/28400.html
思維導(dǎo)圖地址:https://www.processon.com/vie... showImg(https://segmentfault.com/img/bVbqOVZ?w=1351&h=10849); 前段時間復(fù)習(xí)的時候總結(jié)的,在此分享給大家。
思維導(dǎo)圖地址:https://www.processon.com/vie... showImg(https://segmentfault.com/img/bVbqOVZ?w=1351&h=10849); 前段時間復(fù)習(xí)的時候總結(jié)的,在此分享給大家。
閱讀 3068·2021-10-14 09:42
閱讀 1433·2021-09-24 10:32
閱讀 3237·2021-09-23 11:21
閱讀 3004·2021-08-27 13:10
閱讀 3488·2019-08-29 18:41
閱讀 2349·2019-08-29 15:16
閱讀 1378·2019-08-29 13:17
閱讀 1044·2019-08-29 11:22