天天看點

國中級PHP面試基礎彙總(收藏)說幾個你所知道的設計模式

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

概述

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

10年架構師領你架構-成長之路-(附面試題(含答案))

(騰訊T3-T4)打造網際網路PHP架構師教程目錄大全,隻要你看完,薪資立馬提升2倍(持續更新)

點選與我交流企鵝群

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

單例模式

保證一個類僅有一個執行個體,并提供一個通路他的全局通路點例如架構中的資料庫連接配接 - 類似DB類
           

政策模式

針對一組算法,将每一個算法封裝到具有共同接口的獨立的類中,例如進入個人首頁時,根據浏覽者的不同,給予不同的顯示與操作 - 類似不同使用者呈現不同效果
           

注冊模式

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

擴充卡模式

将不同接口适配成統一的API接口,例如資料操作有mysql、mysqli、pdo等,可利用擴充卡模式統一接口

觀察者模式

一個對象通過添加一個方法使本身變得可觀察。當可觀察的對象更改時,它會将消息發送到已注冊的觀察者。例如實作實作消息推送 - 将所有類的執行個體化注冊到一個數組,通過循環批量執行類

裝飾器模式

不修改原類代碼和繼承的情況下動态擴充類的功能,例如架構的每個Controller檔案會提供before和after方法 - 在某個方法或輸出之前執行或之後執行,用于修飾

疊代器模式

提供一個方法順序通路一個聚合對象中各個元素,在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存儲在用戶端

資料庫中的事務是什麼?

指作為一個單元的一組有序的資料庫操作,如果組中的所有操作都成功,則認為事務成功,即使有一個操作失敗。事務也不成功,如果所有操作完成,事務送出,其修改将作用于所有其他資料庫程序,如果有一個操作失敗,則事務復原,該事務影響到的操作都會取消。

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

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

MYSQL優化方案有哪些?

  1. 選用适合的字段類型,避免資料庫增加不必要的空間,字段盡量設定為NOTNULL,類似性别,省份盡量使用枚舉類型ENUM
  2. 使用JOIN查詢代替子查詢
  3. 使用UNION代替臨時表
  4. 盡量不使用外鍵、除非必須保持資料表與表之間的一緻性、完整性
  5. 盡量不使用視圖
  6. 分表分庫,讀寫分離
  7. 合理設定主鍵及索引 索引分為:普通索引、唯一索引、全文索引、主鍵(也是一種唯一索引)
  8. .後期演變的資料表優化 - 垂直拆分:表資料拆分到不同表中,按照業務拆分 - 水準拆分:行資料拆分到不同表中,按照時間、類型、身份等因素拆分表 - 水準垂直聯合拆分

9.索引建立原則

- 最左字首比對原則 - 索引列盡量不參與計算 - 盡量擴充索引不要建立索引
           

面向對象程式設計的五個基本原則 (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的程序管理器,支援平滑重新開機可以啟動的時候預先生成多個程序。

感謝大家一直來支援,這是我準備的1000粉絲福利

【1000粉絲福利】10年架構師分享PHP進階架構資料,助力大家都能30K

什麼是 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. 您這邊有什麼要了解的嗎?
非技術問題沒有正确答案

喜歡我的文章就關注我吧,持續更新中.....

以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家,需要的可以點選進入暗号:知乎。