成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PHP面試知識(shí)梳理

archieyang / 3248人閱讀

摘要:三次握手所謂三次握手,是指簡(jiǎn)歷一個(gè)連接時(shí)需要客戶(hù)端和服務(wù)器總共發(fā)送三個(gè)包三次握手的目的是連接服務(wù)器指定端口,簡(jiǎn)歷連接,并同步連接雙方的序列號(hào)并交換窗口大小信息。

關(guān)于作者

昨天在思否上發(fā)了這篇整理,晚上10點(diǎn)多看到了很多贊收藏和關(guān)注,其實(shí)挺愧疚的,因?yàn)樽罱谡夜ぷ鬟@篇文章并沒(méi)有整理完??吹竭@個(gè)還挺受歡迎的,也因?yàn)樾鹿ぷ骰径ㄏ聛?lái)了,現(xiàn)在的公司正常交接中,打算下周末之前把這個(gè)知識(shí)梳理整理完,感謝各位的點(diǎn)贊、收藏和關(guān)注,大家一起努力。

另外,我自己的博客網(wǎng)站在這,哈哈:https://www.linganmin.cn

算法與數(shù)據(jù)結(jié)構(gòu) BTree和B+tree

BTree
B樹(shù)是為了磁盤(pán)或者其他存儲(chǔ)設(shè)備而設(shè)計(jì)的一種多叉平衡查找樹(shù),相對(duì)于二叉樹(shù),B樹(shù)的每個(gè)內(nèi)節(jié)點(diǎn)有多個(gè)分支,即多叉。

參考文章:https://www.jianshu.com/p/da5...

B+Tree
B+樹(shù)是B樹(shù)的變體,也是一種多路搜索樹(shù)。

參考文章:https://www.jianshu.com/p/da5...

排序算法

快速排序
快速排序是十分常用的高效率的算法,其思想是:先選一個(gè)標(biāo)尺,用它把整個(gè)隊(duì)列過(guò)一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它

function quickSort($arr){

  // 獲取數(shù)組長(zhǎng)度
  $length = count($arr);

  // 判斷長(zhǎng)度是否需要繼續(xù)二分比較
  if($length <= 1){
    return $arr;
  }

  // 定義基準(zhǔn)元素
  $base = $arr[0];

  // 定義兩個(gè)空數(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ù)組中冒出一個(gè)最大的數(shù)
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4

function bubbleSort($arr){

  // 獲取數(shù)組長(zhǎng)度
  $length = count($arr);

  // 第一層循環(huán)控制冒泡輪次
  for ($i=0; $i < $length-1; $i++) { 
    
    // 內(nèi)層循環(huán)控制從第0個(gè)鍵值和后一個(gè)鍵值比較,每次冒出一個(gè)最大的數(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;
}

選擇排序
思路:每次選擇一個(gè)相應(yīng)的元素,然后將其放到指定的位置

    function selectSort($arr){
     
      // 實(shí)現(xiàn)思路
      // 雙重循環(huán)完成,外層控制輪數(shù),當(dāng)前的最小值,內(nèi)層控制比較次數(shù)

      // 獲取長(zhǎng)度
      $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ā)下更小的值時(shí)記錄下鍵,并進(jìn)行下一次比較
          if ($arr[$p] > $arr[$j]) {
            $p = $j; // 比假設(shè)的值更小
          }
        }
  
        // 通過(guò)內(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;
    }

計(jì)算機(jī)網(wǎng)絡(luò) TCP/UDP區(qū)別

TCP
TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議
TCP面向連接,提供可靠地?cái)?shù)據(jù)服務(wù)
TCP首部開(kāi)銷(xiāo)20字節(jié)
TCP邏輯通信信道是全雙工的可靠信道
TCP連接只能是點(diǎn)到點(diǎn)的

UDP
UDP是參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠的信息傳遞服務(wù)
UDP無(wú)連接,不可靠
UDP首部開(kāi)銷(xiāo)8字節(jié)
UDP邏輯通信信道是不可靠信道
UDP沒(méi)有擁塞機(jī)制,因此網(wǎng)絡(luò)出現(xiàn)擁堵不會(huì)使源主機(jī)的發(fā)送效率降低
UDP支持一對(duì)一,多對(duì)一,多對(duì)多的交互通信

三次握手,四次揮手,為什么是三次握手四次揮手

在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接,完成三次握手,客戶(hù)端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。
簡(jiǎn)單點(diǎn)說(shuō):A與B建立TCP連接時(shí),首先A向B發(fā)送SYN(同步請(qǐng)求),然后B回復(fù)SYN+ACK(同步請(qǐng)求應(yīng)答),最后A回復(fù)ACK確認(rèn),這樣TCP的一次連接(三次握手)就完成了。

TCP三次握手

所謂三次握手,是指簡(jiǎn)歷一個(gè)TCP連接時(shí)需要客戶(hù)端和服務(wù)器總共發(fā)送三個(gè)包
三次握手的目的是連接服務(wù)器指定端口,簡(jiǎn)歷TCP連接,并同步連接雙方的序列號(hào)并交換TCP窗口大小信息。
TCP三次握手圖解:

第一次握手
客戶(hù)端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包,指明客戶(hù)打算連接的服務(wù)器的端口,以及初始化序號(hào),保存在包頭的序列號(hào)字段里

第二次握手
服務(wù)器發(fā)揮確認(rèn)包應(yīng)答,即SYN標(biāo)志位和ACK標(biāo)志均為1,同時(shí)將確認(rèn)序號(hào)設(shè)置為客戶(hù)的ISN加1,即X+1

第三次握手
客戶(hù)端再次發(fā)送確認(rèn)包,SYN標(biāo)識(shí)為0,ACK標(biāo)識(shí)為1,并且把服務(wù)器發(fā)來(lái)的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方,并且在數(shù)據(jù)字段寫(xiě)入ISN的+1

簡(jiǎn)單解釋TCP三次握手:
參考:https://github.com/jawil/blog...

四次揮手

TCP的連接的拆除需要發(fā)送四個(gè)包,因此稱(chēng)為四次揮手??蛻?hù)端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作。
由于TCP連接時(shí)全雙工的,因此每個(gè)方向都必須多帶帶進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成他的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè)FIN只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。

為什么是三次握手四次揮手
這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的socket當(dāng)收到SKY報(bào)文的簡(jiǎn)歷連接的請(qǐng)求后,它可以把ACK和SYN放在一個(gè)報(bào)文里來(lái)發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文通知時(shí),他僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了,但未必你的所有數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以不是馬上回關(guān)閉socket,即你可能還會(huì)發(fā)送一些數(shù)據(jù)給對(duì)方之后,在發(fā)送FIN報(bào)文給對(duì)方來(lái)表示你同意現(xiàn)在可以關(guān)閉連接了,所以這里的ACK和FIN報(bào)文多情況下都是分開(kāi)發(fā)送的。

長(zhǎng)連接和短連接

TCP在真正的讀寫(xiě)操作之前,server和client之間必須建立一個(gè)連接,當(dāng)讀寫(xiě)操作完成后,雙方不再需要這個(gè)鏈接時(shí)他們可能釋放這個(gè)連接,連接的建立是通過(guò)三次握手,釋放則需要四次揮手,所以說(shuō)每個(gè)連接的建立都是需要消耗資源和時(shí)間的。

TCP短連接

client向server發(fā)起連接請(qǐng)求

server接到請(qǐng)求,雙方建立連接

client向server發(fā)消息

server回應(yīng)client

一次讀寫(xiě)完成,此時(shí)雙方任何一個(gè)都可以發(fā)起close操作
一般都是client先發(fā)起close操作,因?yàn)橐话愕膕erver不會(huì)回復(fù)完client就立即關(guān)閉連接

所以短連接一般只會(huì)在client和server間傳遞一次讀寫(xiě)操作,短連接管理起來(lái)比較簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制手段

長(zhǎng)連接

client向server發(fā)起連接

server接到請(qǐng)求后,雙方建立連接

client向server發(fā)送消息

server回應(yīng)client

一次讀寫(xiě)完成,連接不關(guān)閉

后續(xù)讀寫(xiě)操作

長(zhǎng)/短連接的操作過(guò)程

短連接的操作步驟:
建立連接 -> 數(shù)據(jù)傳輸 -> 關(guān)閉連接

長(zhǎng)連接的操作步驟:
建立連接 -> 數(shù)據(jù)傳輸 -> (保持連接) -> 數(shù)據(jù)傳輸 -> 關(guān)閉連接

長(zhǎng)/短連接的優(yōu)缺點(diǎn)

長(zhǎng)連接可以省去較多的TCP建立和關(guān)閉操作,減少資源浪費(fèi),節(jié)省時(shí)間,對(duì)于比較頻繁的請(qǐng)求資源的客戶(hù)端比較適用于長(zhǎng)連接

短連接對(duì)于服務(wù)器來(lái)說(shuō)管理較為簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制手段

從瀏覽器輸入域名到展示頁(yè)面都發(fā)生了什么

DNS域名解析
先找本地hosts文件,檢查對(duì)應(yīng)域名ip的關(guān)系,有則想ip地址發(fā)送請(qǐng)求,沒(méi)有再去找DNS服務(wù)器

建立TCP連接
拿到服務(wù)器IP后,向服務(wù)器發(fā)送求求,三次握手,建立TCP連接
簡(jiǎn)單理解三次握手:
客戶(hù)端:您好,在家不,有你快遞
服務(wù)端:在的,送來(lái)吧
客戶(hù)端:好滴,來(lái)了

發(fā)送HTTP請(qǐng)求
與服務(wù)器建立連接后,就可以向服務(wù)器發(fā)起請(qǐng)求了。具體請(qǐng)求內(nèi)容可以在瀏覽器中查看

服務(wù)器處理請(qǐng)求
服務(wù)器收到請(qǐng)求后由web服務(wù)器(Apache,Nginx)處理請(qǐng)求,web服務(wù)器解析用戶(hù)請(qǐng)求,知道了需要調(diào)用那些資源文件,再通過(guò)相應(yīng)的這些資源文件處理用戶(hù)請(qǐng)求和參數(shù),并調(diào)用數(shù)據(jù)庫(kù)等,然后將結(jié)果通過(guò)web服務(wù)器返回給瀏覽器

返回響應(yīng)結(jié)果
在響應(yīng)結(jié)果中都會(huì)有一個(gè)HTTP狀態(tài)碼,諸如我們熟知的200、404、500等
狀態(tài)碼都是由三位數(shù)字和原因短語(yǔ)組成,大致為五類(lèi):
1XX 信息性狀態(tài)碼 接收的請(qǐng)求正在處理
2XX 成功狀態(tài)碼 請(qǐng)求正常處理完畢
3XX 重定向狀態(tài)碼 需要附加操作以完成請(qǐng)求
4XX 客戶(hù)端錯(cuò)誤狀態(tài)碼 服務(wù)器也無(wú)法處理的請(qǐng)求
5XX 服務(wù)器錯(cuò)誤狀態(tài)碼 服務(wù)器請(qǐng)求處理出錯(cuò)

關(guān)閉TCP連接
為了避免服務(wù)器與客戶(hù)端雙方資源占用和消耗,當(dāng)雙方?jīng)]有請(qǐng)求或者響應(yīng)傳遞時(shí),任意一方都可以發(fā)起關(guān)閉請(qǐng)求,與創(chuàng)建TCP連接的三次握手類(lèi)似,關(guān)閉TCP連接需要4次揮手
簡(jiǎn)單比喻為:
客戶(hù)端:哥們,我這邊沒(méi)有數(shù)據(jù)要傳了,咱們關(guān)閉連接吧
服務(wù)端:好的,我看看我這邊還有數(shù)據(jù)不
服務(wù)端:兄弟,我這邊也沒(méi)數(shù)據(jù)要傳給你了,咱們可以關(guān)閉連接了
客戶(hù)端:好嘞

瀏覽器解析HTML

瀏覽器布局渲染

設(shè)計(jì)模式

設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

單例模式

當(dāng)需要保證對(duì)象只有一個(gè)實(shí)例的時(shí)候,單例模式是非常有用的。他把創(chuàng)建對(duì)象的控制權(quán)交給一個(gè)單一的點(diǎn)上,任何時(shí)候應(yīng)用程序都只會(huì)存在且僅存在一個(gè)實(shí)例。單例類(lèi)不應(yīng)該能在類(lèi)的外部進(jìn)行實(shí)例化。
一個(gè)單例類(lèi)應(yīng)該具備以下幾個(gè)因素:

必須擁有一個(gè)訪問(wèn)級(jí)別為private的構(gòu)造函數(shù),用于阻止類(lèi)被隨意實(shí)例化

必須擁有一個(gè)保存類(lèi)的實(shí)例的靜態(tài)變量

必須擁有一個(gè)訪問(wèn)這個(gè)實(shí)例的公共靜態(tài)方法,該方法通常被命名為getInstance()

必須擁有一個(gè)私有的空的clone方法,防止實(shí)例被克隆復(fù)制

簡(jiǎn)單實(shí)例:

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();
工廠模式

工廠模式解決的是如何不通過(guò)new建立實(shí)例對(duì)象的方法

工廠模式是一種類(lèi),它具有為你創(chuàng)建對(duì)象的某些方法,你可以使用工廠類(lèi)創(chuàng)建對(duì)象而不使用new。這樣,如果你想要更改所創(chuàng)建的對(duì)象類(lèi)型只需要更改工廠即可,使用該工廠的所有代碼會(huì)自動(dòng)更改。

工廠模式往往配合接口一起使用,這樣應(yīng)用程序就不必要知道這些被實(shí)例化的類(lèi)的具體細(xì)節(jié),只要知道工廠返回的是支持某個(gè)接口的類(lèi)就可以方便的使用了。

簡(jiǎn)單舉例:


/**
 * 抽象出一個(gè)人的接口
 * Interface Person
 */
interface Person
{
    public function showInfo();
}

/**
 * 一個(gè)繼承于抽象人接口的學(xué)生類(lèi)
 * Class Student
 */
class Student implements Person
{
    public function showInfo()
    {
        echo "這是一個(gè)學(xué)生 
";
    }
}

/**
 * 一個(gè)繼承于抽象人接口的老師類(lèi)
 * Class Teacher
 */
class Teacher implements Person
{
    public function showInfo()
    {
        echo "這是一個(gè)老師 
";
    }
}

/**
 * 人類(lèi)工廠
 * Class PersonFactory
 */
class PersonFactory
{
    public static function factory($person_type)
    {
        // 將傳入的類(lèi)型首字母大寫(xiě)
        $class_name = ucfirst($person_type);

        if(class_exists($class_name)){
            return new $class_name;
        }else{
            throw  new Exception("類(lèi):$class_name 不存在",1);
        }
    }
}

// 需要一個(gè)學(xué)生
$student = PersonFactory::factory("student");
echo $student->showInfo();

// 需要一個(gè)老師的時(shí)候
$teacher = PersonFactory::factory("teacher");
echo $teacher->showInfo();
緩存相關(guān) Redis和Memcached的區(qū)別

Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫(kù)。但是Memcache還可以緩存其他東西,比如圖片、視頻

Redis不只支持簡(jiǎn)單的k/v類(lèi)型的數(shù)據(jù),同時(shí)還提供list、set、hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)

虛擬內(nèi)存,當(dāng)物理內(nèi)存用完時(shí)Redis可以將一些很久沒(méi)有用到的value交換到磁盤(pán)

過(guò)期策略,memcache在set時(shí)就指定,例如set key1 0 0 8即永不過(guò)期,redis可以通過(guò)expire設(shè)定,例如:expire name 10

分布式,設(shè)定memcache集群,利用magent做一主多從;redis也可以做一主多從。

存儲(chǔ)安全,memcache掛掉后,數(shù)據(jù)沒(méi)了;redis可以定期保存在磁盤(pán)(持久化)

災(zāi)難恢復(fù),memcache掛掉后數(shù)據(jù)不可恢復(fù);redis數(shù)據(jù)丟失后可以通過(guò)aof恢復(fù)

redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份

應(yīng)用場(chǎng)景不同:redis除了可以做nosql數(shù)據(jù)庫(kù)之外,還能做消息隊(duì)列、數(shù)據(jù)堆棧和數(shù)據(jù)緩存等。memcache適合于緩存sql語(yǔ)句、數(shù)據(jù)集、用戶(hù)臨時(shí)性數(shù)據(jù)、延遲查詢(xún)數(shù)據(jù)和session等

redis有哪些數(shù)據(jù)結(jié)構(gòu)

String
字符串類(lèi)型是redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),首先鍵是字符串類(lèi)型,而且其他幾種結(jié)構(gòu)都是在字符串類(lèi)型基礎(chǔ)上構(gòu)建的
字符串類(lèi)型實(shí)際上可以是字符串、數(shù)字、二進(jìn)制(圖片、音頻),單最大不能超過(guò)512M
使用場(chǎng)景:

緩存
字符串最經(jīng)典的使用場(chǎng)景,redis作為緩存層,mysql作為存儲(chǔ)層,絕大部分請(qǐng)求數(shù)據(jù)都是redis中獲取,由于redis具有支撐高并發(fā)特性,所以緩存通常能起到加速讀寫(xiě)和降低后端壓力的作用

計(jì)數(shù)器
許多應(yīng)用都會(huì)使用redis作為技術(shù)的基礎(chǔ)工具,它可以實(shí)現(xiàn)快速技術(shù)、查詢(xún)緩存的功能。

共享session
處于負(fù)載均衡的考慮,分布式服務(wù)會(huì)將用戶(hù)信息的訪問(wèn)均衡到不同服務(wù)器,用戶(hù)刷新一次訪問(wèn)可訥訥個(gè)會(huì)需要重新登錄,為了避免這個(gè)問(wèn)題可以使用redis將用戶(hù)session集中管理,在這種模式下只要保證redis的高可用和擴(kuò)展性,每次獲取用戶(hù)更新或查詢(xún)登錄信息都直接從redis中集中獲取

限速
出于安全考慮,每次進(jìn)行登錄時(shí)讓用戶(hù)輸入手機(jī)驗(yàn)證碼,為了短信接口不被頻繁訪問(wèn),會(huì)限制用戶(hù)每分鐘獲取驗(yàn)證碼的頻率

Hash
在redis中哈希類(lèi)型是指鍵本身又是一種鍵值對(duì)結(jié)構(gòu),如 value = {{field1,value1}...{fieldn,valuen}}
使用場(chǎng)景:

哈希結(jié)構(gòu)相對(duì)于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。

list
列表類(lèi)型是用來(lái)存儲(chǔ)多個(gè)有序的字符串,列表的每個(gè)字符串成為一個(gè)元素,一個(gè)列表最多可以存儲(chǔ)2的32次方減1個(gè)元素。在redis中,可以對(duì)列表插入(push)和彈出(pop),還可以獲取指定范圍的元素列表。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng)棧和隊(duì)列的角色。
使用場(chǎng)景:

消息隊(duì)列
redis的lpush+brpop命令組合就可以實(shí)現(xiàn)阻塞隊(duì)列,生產(chǎn)者客戶(hù)端是用lpush從列表左側(cè)插入元素,多個(gè)消費(fèi)者客戶(hù)端使用brpop命令阻塞式的搶列表尾部的元素,多個(gè)客戶(hù)端保證了消費(fèi)的負(fù)載均衡的高可用性。

使用技巧列表

lpush+lpop=Stack(棧)
lpush+rpop=Queue(隊(duì)列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息隊(duì)列)

set

sortedset

redis是單線程的么,為什么

因?yàn)镃PU并不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存或者網(wǎng)絡(luò)帶寬。既然單線程容易實(shí)現(xiàn),而且CPU不會(huì)成為瓶頸,那么久順理成章的采用了單線程的方案。

當(dāng)然單個(gè)Redis進(jìn)程是沒(méi)辦法使用多核的 ,但是它來(lái)就不是非常計(jì)算密集型的服務(wù)。如果單核性能不夠用,可以多開(kāi)幾個(gè)進(jìn)程。

redis的部署方式,主從、集群

參考文章:https://segmentfault.com/a/11...

redis的哨兵模式

參考文章:https://www.cnblogs.com/xifen...

redis的持久化策略

RDB(快照持久化)

AOF(只追加文件持久化)

參考文章:https://segmentfault.com/a/11...

隊(duì)列和棧的區(qū)別

什么是隊(duì)列?什么是棧?

隊(duì)列(Queue):是限定只能在表的一端進(jìn)行插入和在另一端刪除操作的線性表。

棧(Stack):是限定之能在表的一端進(jìn)行插入和刪除操作的線性表。

隊(duì)列和棧的規(guī)則

隊(duì)列:先進(jìn)先出

棧:先進(jìn)后出

隊(duì)列和棧的遍歷數(shù)據(jù)速度

隊(duì)列:基于地址指針進(jìn)行遍歷,而且可以從頭部或者尾部進(jìn)行遍歷,但不能同時(shí)遍歷,無(wú)需開(kāi)辟空間,因?yàn)樵诒闅v的過(guò)程中不影響數(shù)據(jù)結(jié)構(gòu),所以遍歷速度要快。

棧:只能從頂部取數(shù)據(jù),也就是說(shuō)最先進(jìn)入棧底的,需要遍歷整個(gè)棧才能取出來(lái),而且在遍歷數(shù)據(jù)的同事需要微數(shù)據(jù)開(kāi)辟臨時(shí)空間,保持?jǐn)?shù)據(jù)在遍歷前的一致性。

PHP基礎(chǔ)

雙引號(hào)單引號(hào)區(qū)別

雙引號(hào)解釋變量,單引號(hào)不解釋變量

雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話,變量解釋

雙引號(hào)的變量名后面必須要有一個(gè)非數(shù)字、字母、下劃線的特殊字符,或者用{}講變量括起來(lái),否則會(huì)將變量名后面的部分當(dāng)做一個(gè)整體,引起語(yǔ)法錯(cuò)誤

能使單引號(hào)字符盡量使用單引號(hào),單引號(hào)的效率比雙引號(hào)要高

GET和POST提交方式的區(qū)別

GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包;
對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))
對(duì)于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))。

GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求

GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置

GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留

GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式

GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息

如何獲取客戶(hù)端的真實(shí)ip
$_SERVER["REMOTE_ADDR"]或getenv("REMOTE_ADDR")
可以使用ip2long()轉(zhuǎn)成數(shù)字

include和require的區(qū)別
require是無(wú)條件包含,也就是如果一個(gè)流程里加入require,無(wú)論條件成立與否都會(huì)先執(zhí)行require,當(dāng)文件不存在或者無(wú)法打開(kāi)的時(shí)候,會(huì)提示錯(cuò)誤,并且會(huì)終止程序執(zhí)行
include有返回值,而require沒(méi)有(可能因?yàn)槿绱藃equire的速度比include快),如果被包含的文件不存在的化,那么會(huì)提示一個(gè)錯(cuò)誤,但是程序會(huì)繼續(xù)執(zhí)行下去

注意:包含文件不存在或者語(yǔ)法錯(cuò)誤的時(shí)候require是致命的,而include不是

AJAX的優(yōu)勢(shì)是什么
ajax是異步傳輸技術(shù),可以通過(guò)javascript實(shí)現(xiàn),也可以通過(guò)JQuery框架實(shí)現(xiàn),實(shí)現(xiàn)局部刷新,減輕了服務(wù)器的壓力,也提高了用戶(hù)體驗(yàn)

在程序的開(kāi)發(fā)中,如何提高程序的運(yùn)行效率

優(yōu)化SQL語(yǔ)句,查詢(xún)語(yǔ)句中盡量不使用select *,用哪個(gè)字段查哪個(gè)字段;

少用子查詢(xún)可用表連接代替;

少用模糊查詢(xún);

數(shù)據(jù)表中創(chuàng)建索引;

對(duì)程序中經(jīng)常用到的數(shù)據(jù)生成緩存;

SESSION與COOKIE的區(qū)別

存儲(chǔ)位置:session存儲(chǔ)在服務(wù)器,cookie存儲(chǔ)在瀏覽器

安全性:session安全性高于cookie
參考鏈接:https://www.zhihu.com/questio...

isset和empty的區(qū)別

isset()函數(shù) 一般用來(lái)檢測(cè)變量是否設(shè)置
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE

empty()函數(shù)是檢查變量是否為空
若變量不存在則返回 TRUE
若變量存在且其值為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒(méi)有任何屬性的對(duì)象,則返回 TURE
若變量存在且值不為""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒(méi)有任何屬性的對(duì)象,則返回 FALSE

數(shù)據(jù)庫(kù)三范式

第一范式:1NF是對(duì)屬性的原子性約束,要求屬性具有原子性,不可再分解;

第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;

第三范式:3NF是對(duì)字段冗余性的約束,即任何字段不能由其他字段派生出來(lái),它要求字段沒(méi)有冗余。

主鍵、外鍵和索引的區(qū)別

定義
主鍵--唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引--該字段沒(méi)有重復(fù)值,但可以有一個(gè)空值

作用
主鍵--用來(lái)保證數(shù)據(jù)完整性
外鍵--用來(lái)和其他表建立聯(lián)系用的
索引--是提高查詢(xún)排序的速度

個(gè)數(shù)
主鍵--主鍵只能有一個(gè)
外鍵--一個(gè)表可以有多個(gè)外鍵
索引--一個(gè)表可以有多個(gè)唯一索引

堆和棧的區(qū)別
棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運(yùn)行期間動(dòng)態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運(yùn)行情況確定要分配的堆內(nèi)存的大小。

PHP包管理器Composer與自動(dòng)加載規(guī)范

composer學(xué)習(xí)地址:http://docs.phpcomposer.com/0...

composer.json中的自動(dòng)加載映射

目前PSR-0自動(dòng)加載、PSR-4自動(dòng)加載、classmap生成和files引入都是被支持的,PSR-4是首推的方法,因?yàn)樗峁┝烁蟮囊子眯浴?/p>

PSR-4
PSR-4規(guī)范了如何指定文件路徑從而自動(dòng)加載類(lèi),同時(shí)規(guī)范了自動(dòng)加載文件的位置。乍一看這是和PSR-0重復(fù)了,實(shí)際上,在功能上確實(shí)有一部分重復(fù)。區(qū)別在于,PSR-4的規(guī)范比較干凈,去除了兼容PHP5.3以前版本的內(nèi)容。
PSR-4和PSR-0最大的區(qū)別是對(duì)下劃線的定義不同,PSR-4中,在類(lèi)名中使用下劃線是沒(méi)有特殊含義的,而在PSR-0的規(guī)則中,下劃線或被轉(zhuǎn)化為目錄分隔符

在PSR-4的鍵下,你可以定義命名空間和路徑的映射關(guān)系,當(dāng)自動(dòng)加載類(lèi)如FooBarBaz時(shí),命名空間Foo指向一個(gè)名為src/的目錄意味著自動(dòng)加載器將查找名為src/Bar/Baz.php文件并引用它。

命名空間的前綴必須以結(jié)尾,以避免類(lèi)似前綴之間的沖突。在安裝和更新期間,PSR-4引用全部組合到一個(gè)key=>value數(shù)組中,該數(shù)組可以在生成的文件vendor/composer/autoload_psr4.php中找到。

例子:

{
  "autoload": {
    "psr-4": {
      "App": "App/" // 命名空間App映射到目錄App
    }
  }
}

classmap
classmap引用的所有組合,都會(huì)在安裝、更新的過(guò)程中生成并存儲(chǔ)到vendor/composer/autoload_classmap.php文件中。
你可以使用classmap生成支持自定義加載的不遵循PSR-4規(guī)范的類(lèi)庫(kù),要配置它指向的目錄,以便能夠準(zhǔn)確的搜索到類(lèi)文件

例子:

{
  "autoload": {
    "classmap": ["src/", "lib/", "Something.php"]
  }
}

Files
如果你想要明確指定,在每次請(qǐng)求時(shí)都要載入某些文件,那么你可以使用files字段加載。通常作為函數(shù)庫(kù)的載入方式。

例子:

{
  "autoload": {
    "files": ["src/MyLibrary/functions"]
  }
}

PHP框架 Laravel相關(guān)

Laravel是一套簡(jiǎn)潔、優(yōu)雅的PHP Web開(kāi)發(fā)框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來(lái);它可以幫你構(gòu)建一個(gè)完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡(jiǎn)潔、富于表達(dá)力。

因?yàn)長(zhǎng)aravel對(duì)底層的封裝很深,所以你可能需要先去了解什么是依賴(lài)注入,什么是Laravel的服務(wù)容器,關(guān)于這兩點(diǎn)我整理了下面兩個(gè)鏈接,一個(gè)是(Symfony框架作者)寫(xiě)的什么是依賴(lài)注入,一個(gè)是深入研究Laravel的依賴(lài)注入容器(是我翻譯的國(guó)外一大神的)

什么是依賴(lài)注入

譯文深入研究Laravel的依賴(lài)注入容器

前端相關(guān) 參考復(fù)習(xí)資料

面試的信心來(lái)源于過(guò)硬的基礎(chǔ)

前端筆試題面試題記錄(上)

JavaScript 值傳遞 VS 引用傳遞
參考文章:數(shù)值類(lèi)型vs引用類(lèi)型

JavaScript有5種通過(guò)復(fù)制數(shù)值傳值的數(shù)據(jù)類(lèi)型:Boolean、null、undefindString、Number,稱(chēng)之為基本數(shù)據(jù)類(lèi)型
JavaScript還有三種通過(guò)引用傳值的數(shù)據(jù)類(lèi)型:Array、FunctionObject,他們統(tǒng)稱(chēng)為Objects,故而稱(chēng)為對(duì)象。

基本數(shù)據(jù)類(lèi)型
如果為一個(gè)基本數(shù)據(jù)類(lèi)型變量賦值,我們可以認(rèn)為變量包含這個(gè)原始值

var x = 100;
var y = "abx";
var z = null;
var is_login = false;

當(dāng)我們使用=將這些變量賦值給其他變量時(shí),我們把這些值拷貝給了這些新變量,他們是通過(guò)值復(fù)制的,也就是說(shuō)在內(nèi)存中會(huì)同時(shí)存在兩個(gè)值相同的變量,并指向不同的內(nèi)存空間:

var x = 100;
var name = "saboran";

var a = x;
var b = name;

值傳遞的好處是:當(dāng)改變其中一個(gè)變量的值時(shí)并不會(huì)影響另一個(gè)變量的值。

對(duì)象
非基本數(shù)據(jù)類(lèi)型的變量會(huì)保存對(duì)值(地址)的引用。該引用指向內(nèi)存中對(duì)象的地址,變量實(shí)際不包含該實(shí)際值。對(duì)象創(chuàng)建于計(jì)算機(jī)內(nèi)存中,當(dāng)我們寫(xiě)下代碼var arr = [],我們實(shí)際上是在內(nèi)存中創(chuàng)建了一個(gè)新數(shù)組,arr中現(xiàn)在包含了新數(shù)組在內(nèi)存中的地址。

引用賦值
當(dāng)一個(gè)對(duì)象被用=賦值給另一個(gè)變量,實(shí)際上是復(fù)制過(guò)去的是那個(gè)對(duì)象在內(nèi)存中的地址。對(duì)象通過(guò)引用賦值而不是直接傳值,對(duì)象本身是靜態(tài)不變的、唯一改變的是對(duì)象的引用地址。

作用域

參考文章:理解 JavaScript 作用域

聲明提升

參考文章:JavaScript 變量聲明提升

閉包

參考文檔:JavaScript閉包

this

參考文章:javascript中的this作用域詳解

apply、call、bind

參考文章:javascript中call()、apply()、bind()的用法終于理解

參考文章:獨(dú)家解析Javascript原型繼承

教程

廖雪峰的JavaScript全棧教程

參考文章

20個(gè)必會(huì)的JavaScript面試題

VueJS

VueJs雙向數(shù)據(jù)綁定原理

Linux Cors跨域

CORS的基本原理是通過(guò)設(shè)置HTTP請(qǐng)求和返回中header,告知瀏覽器該請(qǐng)求是合法的。這涉及到服務(wù)器端和瀏覽器端雙方的設(shè)置:請(qǐng)求的發(fā)起(Http Request Header)和服務(wù)器對(duì)請(qǐng)求正確的響應(yīng)(Http response header)。

參考文章:https://zhuanlan.zhihu.com/p/...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28400.html

相關(guān)文章

  • PHP面試知識(shí)點(diǎn)梳理

    思維導(dǎo)圖地址:https://www.processon.com/vie... showImg(https://segmentfault.com/img/bVbqOVZ?w=1351&h=10849); 前段時(shí)間復(fù)習(xí)的時(shí)候總結(jié)的,在此分享給大家。

    googollee 評(píng)論0 收藏0
  • PHP面試知識(shí)點(diǎn)梳理

    思維導(dǎo)圖地址:https://www.processon.com/vie... showImg(https://segmentfault.com/img/bVbqOVZ?w=1351&h=10849); 前段時(shí)間復(fù)習(xí)的時(shí)候總結(jié)的,在此分享給大家。

    nanfeiyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<