面試常見問題

網絡協議

TCP/IP對比OSI

  • 計算機網絡的五層協議:物理層、數據鏈路層、網絡層、運輸層、應用層

  • 計算機網絡的七層協議(OSI):物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層

  • TCP/IP(是一個協議族,非單個協議):網絡接口層、 IP層、傳輸層、應用層

      網線與集線器屬於物理層

      網卡與交換機屬於數據鏈路層

      路由器屬於網絡層

TCP和UDP

  • tcp面向連接的字節流服務,對系統資源要求較多,程序結構複雜,保證數據的正確性和順序性

  • udp是無連接的,面向數據報,對系統資源要求較少,程序結構簡單,不能保證數據的正確性和順序性

網站安全與防護

  • sql注入防治方法:使用例如PDO的預處理,使用或者編寫類似mysqli_real_escape_string的方法對sql的特殊字符進行轉義

  • xss(cross site script)跨站腳本攻擊:將外部腳本植入到頁面中

      防治方法:htmlspecialchars()轉義特殊字符爲字符實體,strip_tags()過濾html標籤, addslashes(可轉義單雙引號反斜槓NULL) 在特殊字符前面加反斜槓進行轉義

  • csrf(cross-site request forgery)跨站請求僞造:僞造受信任的用戶信息來請求網站

      防治方法:請求附加隨機token進行校驗,或驗證碼

基礎算法相關

  • 基本排序算法:

  1. 冒泡排序(時間複雜度:o(n方))

    for($i = 0; $i < count($arr); $i++)
        for($j = 0; $j < count($arr) - 1 - $i; $j++)
            if($arr[$j] < $arr[$j+1]) 兩者交換
  2. 選擇排序(時間複雜度:o(n方))

    for($i = 0; $i < count($arr) - 1, $i++)
        $min = $i;
        for($j = $i + 1; $j < count($arr); $j++)
            if($arr[$min] > $arr[$j])
                $min = $j;
            將最小值與當前的第i位置內容交換
  3. 快速排序思想:通過一趟排序將序列分成兩部分,一部分所有數據比另一部分所有數據小,然後在這兩個序列的內部再分別進行快速排序操作,直到最後形成一個有序序列
  4. 二分插入排序思想(之前的序列爲有序):插入第i個元素時,對前面的0~i-1進行折半,當前元素與中間元素比較,如果小,前半部分再次折半,如果大,後半部分進行折半,直到最後left>right,然後把目標位置到i-1的所有元素整體後移,把當前元素放進去
  • 基本查找算法:

  1. 順序查找
  2. 二分法查找(折半查找):將序列分爲兩部分,找到序列的中間值,如果查找值大於中間值,繼續對右半部分進行折半,如果查找值小於中間值,對左半部分進行折半,直到找到或front>end結束,時間複雜度O(log2n)以2爲底n的對數

設計模式

  • MVC是一種設計框架,而不是設計模式,框架是比模式更高的概念

    model負責數據邏輯

    controller負責用戶交互

    view負責數據顯示

    流程:用戶對控制器的某個方法發出請求,控制器調用相應的模型返回數據,然後將數據渲染到視圖中返回給用戶

  • 1) 單例模式

    i. 私有化構造方法和__clone方法

    ii. 提供公有的靜態的方法返回實例

    iii. 提供私有的靜態屬性保存實例

  • 2) 簡單工廠模式(重點在創建不同對象,作用就是用來創建對象的) - 例如一個計算器的加減乘除求餘取整

    i. 定義抽象基類讓子類分別繼承並實現相應方法

    ii. 定義Factory工廠類裏面提供靜態方法用於根據不同的參數實例化相應的子類對象

  • 3) 策略模式(重點在於實例化不同類的解決策略不同,作用是根據不同的情況調用相應的策略或算法) - 例如qq普通用戶 vip svip購買皮膚的優惠策略

    i. 定義抽象基類讓子類分別繼承並實現相應的方法

    ii. 根據不同的場景實例化相應的類,然後調用其中的方法獲取結果

  • 4) 觀察者模式

    i. 需要有一個抽象的主題接口和一個抽象的觀察者接口

    ii. 實現一個主題,實現多個觀察者

    iii. 實例化主題,然後調用主題的方法並將不同的觀察者對象實例化傳入,在主題的方法中保存傳入的觀察者對象到一個屬性,在主題中定義另外的方法通過保存觀察者對象調用觀察者的方法

名詞解釋

  • ORM模型:將表映射到類,將行記錄映射到實例對象,將字段映射到對象的屬性

  • OOP:面向對象編程

  • nosql:redis、MongoDB、memcached

大流量高併發網站解決思路

  • 防盜鏈(別人網站上鍊接着你的服務器上的的資源),驗證來源:$_SERVER['HTTP_REFERER'] apache或者nginx進行相關配置

  • CDN加速

  • 減少http請求,添加異步請求

  • 啓用瀏覽器緩存

  • 代碼壓縮(去除空白符)

  • 頁面靜態化:信息變更不是很頻繁的頁面進行靜態化處理,生成html文件

  • 數據緩存(數據庫緩存redis,文件緩存)

  • 使用Nginx,負載均衡

  • mysql數據庫優化

    • 字段數據類型優化

    • 索引優化

    • SQL語句優化

    • 存儲引擎優化

    • 表結構設計優化

    • 分表分庫分區

    • 主從複製,讀寫分離

COOKIE 和 SESSION

  • session與cookie都是會話技術,默認情況下session在客戶端依賴於cookie


  • cookie保存在客戶端,保存的是字符串,session保存在服務端,保存的是對象

  • cookie安全性低,可被攔截或從本地分析得到,session安全性高

  • session保存在服務器上,會佔用服務器的資源,理論上大小沒有限制,和服務器內存有關

  • 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多20個cookie

  • 登錄信息等重要信息存放爲session,其他信息如需保留,可以存在cookie中

include 和 require

  • 引入文件,include在用到時加載,require在一開始就加載

  • include引入文件出現錯誤,會給出警告,並繼續執行下面代碼,require引入文件出現錯誤,報出致命錯誤並終止當前程序運行

MyISAM 和 InnoDB

  • MyISAM不支持事務和外鍵操作,InnoDB支持事務處理和外鍵

  • MyISAM是表級鎖,InnoDB是行級鎖

  • 執行大量的select MyISAM更好,執行大量的insert update用InnoDB更好

global 和 $GLOBALS

  • $GLOBALS['var'] 是外部的全局變量$var本身。

  • global $var 是外部$var的同名引用或者指針

empty 和 isset

  • empty以下條件會被認爲空

    • "" (空字符串)

    • 0 (作爲整數的0)

    • 0.0 (作爲浮點數的0)

    • "0" (作爲字符串的0)

    • NULL

    • FALSE

    • array() (一個空數組)

    • $var; (一個聲明瞭,但是沒有值的變量)

  • isset以下條件會被認爲存在

    • 變量存在並且值不是 NULL,則返回 TRUE

一次完整的HTTP請求過程

1.首先域名解析(DNS解析):瀏覽器解析域名(主機名)爲相應的IP地址

2.建立TCP連接:三次握手

客戶端:你能聽到我說話嗎?
服務器:我能聽到,你能聽到我說話嗎?
客戶端:我也能,那我開始發送數據嘍。。

3.瀏覽器向服務器發起http請求

4.服務器響應http請求,返回html代碼

5.瀏覽器解析html代碼並請求html中的資源

6.瀏覽器對頁面進行渲染然後展示給用戶

7.關閉TCP連接:四次揮手

    - 客戶端:“兄弟,我這邊沒數據要傳了,咱關閉連接吧。”
    - 服務端:“收到,我看看我這邊有木有數據了。”
    - 服務端:“兄弟,我這邊也沒數據要傳你了,咱可以關閉連接了。”
    - 客戶端:“好嘞。”

瀏覽器輸入URL之後發生了什麼
http請求圖解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章