這是我整理的一套面試題,老鐵們看看就當複習了哦
概述
感覺現在發面試題有些冷門,就跟昨天德國那場似的,不過看看當提前複習了。提前備戰。這2個月出門面試的童鞋可注意不要中暑哦。
10年架構師領你架構-成長之路-(附面試題(含答案))
(騰訊T3-T4)打造網際網路PHP架構師教程目錄大全,隻要你看完,薪資立馬提升2倍(持續更新)
點選與我交流企鵝群
說幾個你所知道的設計模式
單例模式
保證一個類僅有一個執行個體,并提供一個通路他的全局通路點例如架構中的資料庫連接配接 - 類似DB類
政策模式
針對一組算法,将每一個算法封裝到具有共同接口的獨立的類中,例如進入個人首頁時,根據浏覽者的不同,給予不同的顯示與操作 - 類似不同使用者呈現不同效果
注冊模式
提供了在程式中有條理的存放并管理一組全局對象 (object) - 類似服務提供者的注入
擴充卡模式
将不同接口适配成統一的API接口,例如資料操作有mysql、mysqli、pdo等,可利用擴充卡模式統一接口
觀察者模式
一個對象通過添加一個方法使本身變得可觀察。當可觀察的對象更改時,它會将消息發送到已注冊的觀察者。例如實作實作消息推送 - 将所有類的執行個體化注冊到一個數組,通過循環批量執行類
裝飾器模式
不修改原類代碼和繼承的情況下動态擴充類的功能,例如架構的每個Controller檔案會提供before和after方法 - 在某個方法或輸出之前執行或之後執行,用于修飾
疊代器模式
提供一個方法順序通路一個聚合對象中各個元素,在PHP中将繼承 Iterator 類 - yield
POST和GET有什麼差別
- GET是從伺服器上擷取資料,POST是向伺服器傳送資料
- GET是通過發送HTTP協定通過URl參數傳遞進行接收,而POST是實體資料,通過表單送出
- GET傳送的資料量較小,不能大于2KB。POST傳送的資料量較大,一般被預設為不受限制。
- GET安全性非常低,POST安全性較高
session與cookie的差別
- session存儲在伺服器上的php指定目錄中(session_dir)的位置
- cookie存儲在用戶端
資料庫中的事務是什麼?
指作為一個單元的一組有序的資料庫操作,如果組中的所有操作都成功,則認為事務成功,即使有一個操作失敗。事務也不成功,如果所有操作完成,事務送出,其修改将作用于所有其他資料庫程序,如果有一個操作失敗,則事務復原,該事務影響到的操作都會取消。
PHP中傳引用與傳值的差別?
按值傳遞:函數内對值的内容改變對函數外部無影響 引用傳遞:函數内對值的内容改變在函數外部也會做出相應修改
MYSQL優化方案有哪些?
- 選用适合的字段類型,避免資料庫增加不必要的空間,字段盡量設定為NOTNULL,類似性别,省份盡量使用枚舉類型ENUM
- 使用JOIN查詢代替子查詢
- 使用UNION代替臨時表
- 盡量不使用外鍵、除非必須保持資料表與表之間的一緻性、完整性
- 盡量不使用視圖
- 分表分庫,讀寫分離
- 合理設定主鍵及索引 索引分為:普通索引、唯一索引、全文索引、主鍵(也是一種唯一索引)
- .後期演變的資料表優化 - 垂直拆分:表資料拆分到不同表中,按照業務拆分 - 水準拆分:行資料拆分到不同表中,按照時間、類型、身份等因素拆分表 - 水準垂直聯合拆分
9.索引建立原則
- 最左字首比對原則 - 索引列盡量不參與計算 - 盡量擴充索引不要建立索引
面向對象程式設計的五個基本原則 (S.O.L.I.D)
- SRP 單一功能原則 (你可以這樣幹,并不是說你應該這樣幹) - 引起類變化的因素永遠不要多餘一個,保證類的有且隻有一個責任
- OCP 開閉原則 (開胸手術時不需要穿一件外套) - 對擴充開放,對修改閉合
- LSP 裡氏替換原則 - 當一個子類的執行個體應該能夠替換任何其父類的執行個體時,它們之間才具有IS-A關系
- ISP 接口隔離原則 - 不要強迫用戶端(泛指調用者)去依賴那些他們不使用的接口
- DIP 依賴反轉原則
- 高層子產品不應該依賴底層子產品,兩者都應該依賴其抽象
- 抽象不應該依賴于細節,細節應該依賴于抽象
yield的使用
生成器提供了一種更容易的方法來實作簡單的對象疊代,相比較定義類實作 Iterator 接口的方式,性能開銷和複雜性大大降低。
子類重寫父類的protected方法有什麼限制?
- final修飾的類方法不可被子類重寫
- 5.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,跨站請求僞造,攻擊方僞裝使用者身份發送請求進而竊取資訊或者破壞系統。 防範
- 合理規範api請求方式,GET,POST
- 對POST請求加token令牌驗證,生成一個随機碼并存入session,表單中帶上這個随機碼,送出的時候服務端進行驗證随機碼是否相同。
XSS,跨站腳本攻擊。 防範
- 不相信任何輸入,過濾輸入。
基本算法
順序查找
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 這兩者有什麼差別?
- Redis 支援更加豐富的資料存儲類型,String、Hash、List、Set 和 Sorted Set。Memcached 僅支援簡單的 key-value 結構。
- Memcached key-value存儲比 Redis 采用 hash 結構來做 key-value 存儲的記憶體使用率更高。
- Redis 提供了事務的功能,可以保證一系列指令的原子性
- Redis 支援資料的持久化,可以将記憶體中的資料保持在磁盤中
- Redis 隻使用單核,而 Memcached 可以使用多核,是以平均每一個核上 Redis 在存儲小資料時比 Memcached 性能更高。
Redis 如何實作持久化?
- RDB 持久化,将 redis 在記憶體中的的狀态儲存到硬碟中,相當于備份資料庫狀态
- 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更輕量,沒有高低之分,隻是應用的場景不同。
非技術問題
- 為什麼要在上家公司離職?
- 未來三年的職業規劃的怎樣的?
- 您這邊有什麼要了解的嗎?
非技術問題沒有正确答案
喜歡我的文章就關注我吧,持續更新中.....
以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家,需要的可以點選進入暗号:知乎。