初中級PHP面試基礎彙總

timg.jpeg

這是我整理的一套面試題,老鐵們看看就當複習了哦

概述

感受如今發麪試題有些冷門,就跟昨天德國那場似的,不過看看當提早複習了。提早備戰。這2個月出門面試的童鞋可注意不要中暑哦。php

說幾個你所知道的設計模式

單例模式

保證一個類僅有一個實例,並提供一個訪問他的全局訪問點例如框架中的數據庫鏈接 - 相似DB類

策略模式

針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,例如進入我的主頁時,根據瀏覽者的不一樣,給予不一樣的顯示與操做 - 相似不一樣用戶呈現不一樣效果

註冊模式

提供了在程序中有條理的存放並管理一組全局對象 (object) - 相似服務提供者的注入

適配器模式

將不一樣接口適配成統一的API接口,例如數據操做有mysql、mysqli、pdo等,可利用適配器模式統一接口mysql

觀察者模式

一個對象經過添加一個方法使自己變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。例如實現實現消息推送 - 將全部類的實例化註冊到一個數組,經過循環批量執行類面試

裝飾器模式

不修改原類代碼和繼承的狀況下動態擴展類的功能,例如框架的每一個Controller文件會提供before和after方法 - 在某個方法或輸出以前執行或以後執行,用於修飾redis

迭代器模式

提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承 Iterator 類 - yield算法

POST和GET有什麼區別

  1. GET是從服務器上獲取數據,POST是向服務器傳送數據
  2. GET是經過發送HTTP協議經過URl參數傳遞進行接收,而POST是實體數據,經過表單提交
  3. GET傳送的數據量較小,不能大於2KB。POST傳送的數據量較大,通常被默認爲不受限制。
  4. GET安全性很是低,POST安全性較高

session與cookie的區別

  1. session存儲在服務器上的php指定目錄中(session_dir)的位置
  2. cookie存儲在客戶端

數據庫中的事務是什麼?

指做爲一個單元的一組有序的數據庫操做,若是組中的全部操做都成功,則認爲事務成功,即便有一個操做失敗。事務也不成功,若是全部操做完成,事務提交,其修改將做用於全部其餘數據庫進程,若是有一個操做失敗,則事務回滾,該事務影響到的操做都會取消。sql

PHP中傳引用與傳值的區別?

按值傳遞:函數內對值的內容改變對函數外部無影響
引用傳遞:函數內對值的內容改變在函數外部也會作出相應修改數據庫

MYSQL優化方案有哪些?

  1. 選用適合的字段類型,避免數據庫增長沒必要要的空間,字段儘可能設定爲NOTNULL,相似性別,省份儘可能使用枚舉類型ENUM
  2. 使用JOIN查詢代替子查詢
  3. 使用UNION代替臨時表
  4. 儘可能不使用外鍵、除非必須保持數據表與表之間的一致性、完整性
  5. 儘可能不使用視圖
  6. 分表分庫,讀寫分離
  7. 合理設置主鍵及索引編程

    • 索引分爲:普通索引、惟一索引、全文索引、主鍵(也是一種惟一索引)
  8. 後期演變的數據表優化設計模式

    - 垂直拆分:表數據拆分到不一樣表中,按照業務拆分
    - 水平拆分:行數據拆分到不一樣表中,按照時間、類型、身份等因素拆分表
    - 水平垂直聯合拆分

9.索引創建原則api

- 最左前綴匹配原則
  - 索引列儘可能不參與計算
  - 儘可能擴展索引不要新建索引

面向對象編程的五個基本原則 (S.O.L.I.D)

  1. SRP 單一功能原則 (你能夠這樣幹,並非說你應該這樣幹)

    - 引發類變化的因素永遠不要多餘一個,保證類的有且只有一個責任
  2. OCP 開閉原則 (開胸手術時不須要穿一件外套)

    - 對擴展開放,對修改閉合
  3. LSP 里氏替換原則

    - 當一個子類的實例應該可以替換任何其父類的實例時,它們之間才具備IS-A關係
  4. ISP 接口隔離原則

    - 不要強迫客戶端(泛指調用者)去依賴那些他們不使用的接口
  5. DIP 依賴反轉原則

    • 高層模塊不該該依賴底層模塊,二者都應該依賴其抽象
    • 抽象不該該依賴於細節,細節應該依賴於抽象

yield的使用

生成器提供了一種更容易的方法來實現簡單的對象迭代,相比較定義類實現 Iterator 接口的方式,性能開銷和複雜性大大下降。

子類重寫父類的protected方法有什麼限制?

  1. final修飾的類方法不可被子類重寫
  2. 5.3之後方法參數個數必須一致
  3. 重寫時訪問級別只能夠等於或者寬鬆於當前重寫方法的訪問級別

什麼是CGI? 什麼是FastCGI? php-fpm , FastCGI,Nginx 之間是什麼關係?

CGI 是通用網關接口,用戶WEB服務器和應用程序間的交互,定義輸入輸出規範,用戶的請求經過WEB服務器轉發給FastCGI進程,FastCGI進程再調用應用程式進行處理,如PHP解析器,應用程序的處理結果如HTML返回給FastCGI,FastCGI返回給Nginx進行輸出,假設WEB服務器是NGINX,應用程序是PHP,而 php-fpm 是管理FastCGI的,這就是php-fpm,fastCGI與NGINX的關係.

FastCGI 用來提升cgi程序性能,啓動一個master,再啓動多個worker,不須要每次解析php.ini 而php-fpm實現了fastcgi協議,是fastcgi的進程管理器,支持平滑重啓能夠啓動的時候預先生成多個進程。

什麼是 CSRF 攻擊 ?XSS 攻擊?如何防範?

CSRF,跨站請求僞造,攻擊方假裝用戶身份發送請求從而竊取信息或者破壞系統。
防範

  1. 合理規範api請求方式,GET,POST
  2. 對POST請求加token令牌驗證,生成一個隨機碼並存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同。

XSS,跨站腳本攻擊。
防範

  1. 不相信任何輸入,過濾輸入。

基本算法

順序查找

function search($arr,$k){
  $n = count($arr);
    $arr[$n]= $k;
    for($i=0; $i<$n; $i++){
        if($arr[$i]==$k){
        break;
        }
    }
    if ($i<$n){
        return $i;
    }else{
        return -1;
    }
}

二分查找

function binaryRecursive($arr,$low,$top,$target){
        if($low<=$top){
            $mid = floor(($low+$top)/2);
            if($arr[$mid]==$target){
                return $arr[$mid];
            }elseif($arr[$mid]<$target){
                return binaryRecursive($arr,$mid+1,$top,$target);
            }else{
                return binaryRecursive($arr,$low,$top-1,$target);
            }
        }else{
            return -1;
        }
    }

冒泡排序

function _sort($arr)
    {
        $count = count ($arr) - 1;
        $temp  = 0;
        
        for ($i = 0; $i < $count; $i++) {
        
            for ($j = 0; $j < $count - $i; $j++) {
                if ($arr[$j] < $arr[$j + 1]) {
                    $temp        = $arr[$j];
                    $arr[$j]     = $arr[$j + 1];
                    $arr[$j + 1] = $temp;
                }
            }
        }
        
        return $arr;
    }

快速排序

function quick_sort($arr)
{
    //判斷參數是不是一個數組
    if(!is_array($arr)) {
        return false;
    }else{
        //遞歸出口:數組長度爲1,直接返回數組
        $length = count($arr);
        
        if($length<=1) return $arr;
            //數組元素有多個,則定義兩個空數組
            $left = $right = array();
            //使用for循環進行遍歷,把第一個元素當作比較的對象
            for($i=1; $i<$length; $i++)
            {
                //判斷當前元素的大小
                if($arr[$i]<$arr[0]){
                    $left[]=$arr[$i];
                }else{
                    $right[]=$arr[$i];
                }
            }
        //遞歸調用
        $left=quick_sort($left);
        $right=quick_sort($right);
        //將全部的結果合併
        return array_merge($left,array($arr[0]),$right);
    }
}

NOSQL

Redis、Memecached 這二者有什麼區別?

  1. Redis 支持更加豐富的數據存儲類型,String、Hash、List、Set 和 Sorted Set。Memcached 僅支持簡單的 key-value 結構。
  2. Memcached key-value存儲比 Redis 採用 hash 結構來作 key-value 存儲的內存利用率更高。
  3. Redis 提供了事務的功能,能夠保證一系列命令的原子性
  4. Redis 支持數據的持久化,能夠將內存中的數據保持在磁盤中
  5. Redis 只使用單核,而 Memcached 可使用多核,因此平均每個核上 Redis 在存儲小數據時比 Memcached 性能更高。

Redis 如何實現持久化?

  1. RDB 持久化,將 redis 在內存中的的狀態保存到硬盤中,至關於備份數據庫狀態
  2. AOF 持久化(Append-Only-File),AOF 持久化是經過保存 Redis 服務器鎖執行的寫狀態來記錄數據庫的。至關於備份數據庫接收到的命令,全部被寫入 AOF 的命令都是以 redis 的協議格式來保存的

Laravel 設計原理

服務提供者是什麼?

服務提供者是全部Laravel應用程序引導啓動的中心,Laravel的核心服務器、註冊服務、綁定服務、監聽器、中間件、路由註冊以及咱們應用程序都是由服務提供者引導啓動的。

IOC容器是什麼?

IOC就是控制反轉,也被叫作依賴注入(DI),對象A能夠依賴對象B,可是控制權在對象A中,因此叫作控制反轉,依賴注入則是在IOC容器運行時動態將某種依賴關係注入到對象中。
做用:解決代碼難易度,實現低耦合、高擴展

Facades 是什麼?

提供了一個"static"(靜態)接口去訪問註冊到 IoC 容器中的類。提供了簡單、易記的語法,而無需記住必須手動注入或配置的長長的類名。此外,因爲對 PHP 動態方法的獨特用法,也使測試起來很是容易。

Contract 是什麼?

Contract(契約)是 Laravel 定義框架提供的核心服務的接口。Contract 和 Facades 並無本質意義上的區別,其做用就是使接口低耦合、更簡單。

架構

Thrift 實現的基本原理及做用

經過使用RPC通訊協議,實現多語言開發場景下無感知的互相調用。
優勢

  • 數據包呈二進制發送,流量消耗小
  • 傳輸效率高
  • 語言之間無障礙

如何解決優化網站App大數據大流量高併發

  • 硬件方面
  • 軟件方面
  • 禁止外部盜鏈
  • 控制大文件的下載
  • 負載均衡
  • 分佈式
  • 集羣
  • 主從數據庫
  • 分佈式數據庫
  • 分佈式緩存

TCP 三次握手

三次握手就是客戶端與服務器端創建TCP鏈接時須要發送3個包進行鏈接的確認,在三次握手完成後便可創建鏈接。

  • 第一次握手。客戶端發送請求報文,標誌位SYN設置爲1,隨機產生seq值爲x,客戶端進入SYN_SENT狀態,等待服務器端的迴應。
  • 第二次握手。服務器端接收到請求報文,將SYN和ACK都設置爲1,ack爲x+1,隨機產生seq值爲y,而後將數據包發送給客戶端進行確認,服務器端進入SYN_RCVD狀態。
  • 第三次握手。客戶端收到迴應的數據包後,確認ack是否爲x+1,以及ACK是否爲1,若正確,則將ACK設置爲1,ack爲y+1,而後將數據發送給服務器端。服務器端在接受到數據後檢查ack是否爲y+1,ACK是否爲1,若正確則正確創建鏈接,雙方均進入ESTAB-LISHED狀態,完成三次握手。

TCP 與 UDP 的區別

除了TCP以外,咱們還常聽到的是UDP,那麼他倆有啥區別呢?
TCP對應的是可靠性要求高的應用,從上面的解釋能夠看出來,在真正通訊以前要三次握手,是面向鏈接的;而且TCP利用序列號保證消息的有序性。
而UDP對應的則是可靠性要求低,可是流量大、速度快的應用;和TCP相比,UDP是無鏈接的而且多是無序的。
TCP更重量,UDP更輕量,沒有高低之分,只是應用的場景不一樣。

非技術問題

  1. 爲何要在上家公司離職?
  2. 將來三年的職業規劃的怎樣的?
  3. 您這邊有什麼要理解的嗎?
非技術問題沒有正確答案
相關文章
相關標籤/搜索