這是我整理的一套面試題,老鐵們看看就當復習了哦
概述
感覺現(xiàn)在發(fā)面試題有些冷門,就跟昨天德國那場似的蘸朋,不過看看當提前復習了熏纯。提前備戰(zhàn)。這2個月出門面試的童鞋可注意不要中暑哦款违。
10年架構(gòu)師領(lǐng)你架構(gòu)-成長之路-(附面試題(含答案))
(騰訊T3-T4)打造互聯(lián)網(wǎng)PHP架構(gòu)師教程目錄大全伍纫,只要你看完,薪資立馬提升2倍(持續(xù)更新)
說幾個你所知道的設(shè)計模式
單例模式
<pre class="public-DraftStyleDefault-pre" data-offset-key="2tl51-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="2tl51-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
保證一個類僅有一個實例钳恕,并提供一個訪問他的全局訪問點例如框架中的數(shù)據(jù)庫連接 - 類似DB類
</pre>
</pre>
策略模式
<pre class="public-DraftStyleDefault-pre" data-offset-key="9p33g-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="9p33g-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
針對一組算法别伏,將每一個算法封裝到具有共同接口的獨立的類中,例如進入個人主頁時忧额,根據(jù)瀏覽者的不同厘肮,給予不同的顯示與操作 - 類似不同用戶呈現(xiàn)不同效果
</pre>
</pre>
注冊模式
<pre class="public-DraftStyleDefault-pre" data-offset-key="211nb-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="211nb-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
提供了在程序中有條理的存放并管理一組全局對象 (object) - 類似服務(wù)提供者的注入
</pre>
</pre>
適配器模式
將不同接口適配成統(tǒng)一的API接口,例如數(shù)據(jù)操作有mysql睦番、mysqli类茂、pdo等,可利用適配器模式統(tǒng)一接口
觀察者模式
一個對象通過添加一個方法使本身變得可觀察托嚣。當可觀察的對象更改時巩检,它會將消息發(fā)送到已注冊的觀察者。例如實現(xiàn)實現(xiàn)消息推送 - 將所有類的實例化注冊到一個數(shù)組示启,通過循環(huán)批量執(zhí)行類
裝飾器模式
不修改原類代碼和繼承的情況下動態(tài)擴展類的功能兢哭,例如框架的每個Controller文件會提供before和after方法 - 在某個方法或輸出之前執(zhí)行或之后執(zhí)行,用于修飾
迭代器模式
提供一個方法順序訪問一個聚合對象中各個元素夫嗓,在PHP中將繼承 Iterator 類 - yield
POST和GET有什么區(qū)別
GET是從服務(wù)器上獲取數(shù)據(jù)迟螺,POST是向服務(wù)器傳送數(shù)據(jù)
GET是通過發(fā)送HTTP協(xié)議通過URl參數(shù)傳遞進行接收,而POST是實體數(shù)據(jù)舍咖,通過表單提交
GET傳送的數(shù)據(jù)量較小煮仇,不能大于2KB。POST傳送的數(shù)據(jù)量較大谎仲,一般被默認為不受限制浙垫。
GET安全性非常低,POST安全性較高
session與cookie的區(qū)別
session存儲在服務(wù)器上的php指定目錄中(session_dir)的位置
cookie存儲在客戶端
數(shù)據(jù)庫中的事務(wù)是什么?
指作為一個單元的一組有序的數(shù)據(jù)庫操作夹姥,如果組中的所有操作都成功杉武,則認為事務(wù)成功,即使有一個操作失敗辙售。事務(wù)也不成功轻抱,如果所有操作完成,事務(wù)提交旦部,其修改將作用于所有其他數(shù)據(jù)庫進程祈搜,如果有一個操作失敗,則事務(wù)回滾士八,該事務(wù)影響到的操作都會取消容燕。
PHP中傳引用與傳值的區(qū)別?
按值傳遞:函數(shù)內(nèi)對值的內(nèi)容改變對函數(shù)外部無影響 引用傳遞:函數(shù)內(nèi)對值的內(nèi)容改變在函數(shù)外部也會做出相應(yīng)修改
MYSQL優(yōu)化方案有哪些婚度?
選用適合的字段類型蘸秘,避免數(shù)據(jù)庫增加不必要的空間,字段盡量設(shè)定為NOTNULL蝗茁,類似性別醋虏,省份盡量使用枚舉類型ENUM
使用JOIN查詢代替子查詢
使用UNION代替臨時表
盡量不使用外鍵、除非必須保持數(shù)據(jù)表與表之間的一致性哮翘、完整性
盡量不使用視圖
分表分庫颈嚼,讀寫分離
合理設(shè)置主鍵及索引 索引分為:普通索引、唯一索引饭寺、全文索引粘舟、主鍵(也是一種唯一索引)
.后期演變的數(shù)據(jù)表優(yōu)化 - 垂直拆分:表數(shù)據(jù)拆分到不同表中,按照業(yè)務(wù)拆分 - 水平拆分:行數(shù)據(jù)拆分到不同表中佩研,按照時間柑肴、類型、身份等因素拆分表 - 水平垂直聯(lián)合拆分
9.索引建立原則
<pre class="public-DraftStyleDefault-pre" data-offset-key="b6ii1-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="b6ii1-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
- 最左前綴匹配原則
- 索引列盡量不參與計算
- 盡量擴展索引不要新建索引
</pre>
</pre>
面向?qū)ο缶幊痰奈鍌€基本原則 (S.O.L.I.D)
SRP 單一功能原則 (你可以這樣干旬薯,并不是說你應(yīng)該這樣干) - 引起類變化的因素永遠不要多余一個晰骑,保證類的有且只有一個責任
OCP 開閉原則 (開胸手術(shù)時不需要穿一件外套) - 對擴展開放,對修改閉合
LSP 里氏替換原則 - 當一個子類的實例應(yīng)該能夠替換任何其父類的實例時绊序,它們之間才具有IS-A關(guān)系
ISP 接口隔離原則 - 不要強迫客戶端(泛指調(diào)用者)去依賴那些他們不使用的接口
DIP 依賴反轉(zhuǎn)原則
高層模塊不應(yīng)該依賴底層模塊硕舆,兩者都應(yīng)該依賴其抽象
抽象不應(yīng)該依賴于細節(jié),細節(jié)應(yīng)該依賴于抽象
yield的使用
生成器提供了一種更容易的方法來實現(xiàn)簡單的對象迭代骤公,相比較定義類實現(xiàn) Iterator 接口的方式抚官,性能開銷和復雜性大大降低。
子類重寫父類的protected方法有什么限制阶捆?
final修飾的類方法不可被子類重寫
5.3以后方法參數(shù)個數(shù)必須一致
重寫時訪問級別只可以等于或者寬松于當前重寫方法的訪問級別
什么是CGI? 什么是FastCGI? php-fpm , FastCGI,Nginx 之間是什么關(guān)系凌节?
CGI 是通用網(wǎng)關(guān)接口钦听,用戶WEB服務(wù)器和應(yīng)用程序間的交互,定義輸入輸出規(guī)范倍奢,用戶的請求通過WEB服務(wù)器轉(zhuǎn)發(fā)給FastCGI進程朴上,F(xiàn)astCGI進程再調(diào)用應(yīng)用程式進行處理,如PHP解析器卒煞,應(yīng)用程序的處理結(jié)果如HTML返回給FastCGI,FastCGI返回給Nginx進行輸出痪宰,假設(shè)WEB服務(wù)器是NGINX,應(yīng)用程序是PHP,而 php-fpm 是管理FastCGI的,這就是php-fpm,fastCGI與NGINX的關(guān)系.
FastCGI 用來提高cgi程序性能畔裕,啟動一個master,再啟動多個worker,不需要每次解析php.ini 而php-fpm實現(xiàn)了fastcgi協(xié)議衣撬,是fastcgi的進程管理器,支持平滑重啟可以啟動的時候預先生成多個進程扮饶。
感謝大家一直來支持具练,這是我準備的1000粉絲福利
【1000粉絲福利】10年架構(gòu)師分享PHP進階架構(gòu)資料,助力大家都能30K
什么是 CSRF 攻擊 贴届?XSS 攻擊?如何防范蜡吧?
CSRF毫蚓,跨站請求偽造,攻擊方偽裝用戶身份發(fā)送請求從而竊取信息或者破壞系統(tǒng)昔善。 防范
合理規(guī)范api請求方式元潘,GET,POST
對POST請求加token令牌驗證君仆,生成一個隨機碼并存入session翩概,表單中帶上這個隨機碼,提交的時候服務(wù)端進行驗證隨機碼是否相同返咱。
XSS钥庇,跨站腳本攻擊。 防范
- 不相信任何輸入咖摹,過濾輸入评姨。
基本算法
順序查找
<pre class="public-DraftStyleDefault-pre" data-offset-key="6fj95-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="6fj95-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
function search(k){
arr);
n]= i=0; n; arr[k){
break;
}
}
if (n){
return $i;
}else{
return -1;
}
}
</pre>
</pre>
二分查找
<pre class="public-DraftStyleDefault-pre" data-offset-key="neo4-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="neo4-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
function binaryRecursive(low,target){
if(top){
low+arr[target){
return mid];
}elseif(mid]<arr,top,arr,top-1,$target);
}
}else{
return -1;
}
}
</pre>
</pre>
冒泡排序
<pre class="public-DraftStyleDefault-pre" data-offset-key="8rotg-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="8rotg-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
function _sort(count = count (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;
}
</pre>
</pre>
快速排序
<pre class="public-DraftStyleDefault-pre" data-offset-key="1ikqg-0-0" style="margin: 1.4em 0px; padding: 0.88889em; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: auto; background: rgb(246, 246, 246); border-radius: 4px; color: rgb(18, 18, 18); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
<pre class="Editable-styled" data-block="true" data-editor="5sdnm" data-offset-key="1ikqg-0-0" style="margin: 0px; padding: 0px; font-size: 0.9em; word-break: normal; overflow-wrap: normal; white-space: pre; overflow: initial; background: rgb(246, 246, 246); border-radius: 0px;">
function quick_sort(arr)) {
return false;
}else{
//遞歸出口:數(shù)組長度為1,直接返回數(shù)組
arr);
if($length<=1) return $arr;
//數(shù)組元素有多個,則定義兩個空數(shù)組
$left = $right = array();
//使用for循環(huán)進行遍歷萤晴,把第一個元素當做比較的對象
for($i=1; $i<$length; $i++)
{
//判斷當前元素的大小
if($arr[$i]<$arr[0]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
//遞歸調(diào)用
$left=quick_sort($left);
$right=quick_sort($right);
//將所有的結(jié)果合并
return array_merge($left,array($arr[0]),$right);
}
}
</pre>
</pre>
NOSQL
Redis吐句、Memecached 這兩者有什么區(qū)別?
Redis 支持更加豐富的數(shù)據(jù)存儲類型店读,String嗦枢、Hash、List屯断、Set 和 Sorted Set文虏。Memcached 僅支持簡單的 key-value 結(jié)構(gòu)侣诺。
Memcached key-value存儲比 Redis 采用 hash 結(jié)構(gòu)來做 key-value 存儲的內(nèi)存利用率更高。
Redis 提供了事務(wù)的功能择葡,可以保證一系列命令的原子性
Redis 支持數(shù)據(jù)的持久化紧武,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中
Redis 只使用單核,而 Memcached 可以使用多核敏储,所以平均每一個核上 Redis 在存儲小數(shù)據(jù)時比 Memcached 性能更高阻星。
Redis 如何實現(xiàn)持久化?
RDB 持久化已添,將 redis 在內(nèi)存中的的狀態(tài)保存到硬盤中妥箕,相當于備份數(shù)據(jù)庫狀態(tài)
AOF 持久化(Append-Only-File),AOF 持久化是通過保存 Redis 服務(wù)器鎖執(zhí)行的寫狀態(tài)來記錄數(shù)據(jù)庫的更舞。相當于備份數(shù)據(jù)庫接收到的命令畦幢,所有被寫入 AOF 的命令都是以 redis 的協(xié)議格式來保存的
Laravel 設(shè)計原理
服務(wù)提供者是什么?
服務(wù)提供者是所有Laravel應(yīng)用程序引導啟動的中心缆蝉,Laravel的核心服務(wù)器宇葱、注冊服務(wù)、綁定服務(wù)刊头、監(jiān)聽器黍瞧、中間件、路由注冊以及我們應(yīng)用程序都是由服務(wù)提供者引導啟動的原杂。
IOC容器是什么印颤?
IOC就是控制反轉(zhuǎn),也被叫做依賴注入(DI),對象A可以依賴對象B,但是控制權(quán)在對象A中穿肄,所以叫做控制反轉(zhuǎn)年局,依賴注入則是在IOC容器運行時動態(tài)將某種依賴關(guān)系注入到對象中。 作用:解決代碼難易度咸产,實現(xiàn)低耦合矢否、高擴展
Facades 是什么?
提供了一個"static"(靜態(tài))接口去訪問注冊到 IoC 容器中的類脑溢。提供了簡單兴喂、易記的語法,而無需記住必須手動注入或配置的長長的類名焚志。此外衣迷,由于對 PHP 動態(tài)方法的獨特用法,也使測試起來非常容易酱酬。
Contract 是什么壶谒?
Contract(契約)是 Laravel 定義框架提供的核心服務(wù)的接口。Contract 和 Facades 并沒有本質(zhì)意義上的區(qū)別膳沽,其作用就是使接口低耦合汗菜、更簡單让禀。
架構(gòu)
Thrift 實現(xiàn)的基本原理及作用
通過使用RPC通信協(xié)議,實現(xiàn)多語言開發(fā)場景下無感知的互相調(diào)用陨界。 優(yōu)點
數(shù)據(jù)包呈二進制發(fā)送巡揍,流量消耗小
傳輸效率高
語言之間無障礙
如何解決優(yōu)化網(wǎng)站App大數(shù)據(jù)大流量高并發(fā)
硬件方面
軟件方面
禁止外部盜鏈
控制大文件的下載
負載均衡
分布式
集群
主從數(shù)據(jù)庫
分布式數(shù)據(jù)庫
分布式緩存
TCP 三次握手
三次握手就是客戶端與服務(wù)器端建立TCP連接時需要發(fā)送3個包進行連接的確認,在三次握手完成后即可建立連接菌瘪。
第一次握手腮敌。客戶端發(fā)送請求報文俏扩,標志位SYN設(shè)置為1糜工,隨機產(chǎn)生seq值為x,客戶端進入SYN_SENT狀態(tài)录淡,等待服務(wù)器端的回應(yīng)捌木。
第二次握手。服務(wù)器端接收到請求報文嫉戚,將SYN和ACK都設(shè)置為1刨裆,ack為x+1,隨機產(chǎn)生seq值為y彬檀,然后將數(shù)據(jù)包發(fā)送給客戶端進行確認帆啃,服務(wù)器端進入SYN_RCVD狀態(tài)。
第三次握手凤覆×赐撸客戶端收到回應(yīng)的數(shù)據(jù)包后拆魏,確認ack是否為x+1盯桦,以及ACK是否為1,若正確渤刃,則將ACK設(shè)置為1拥峦,ack為y+1,然后將數(shù)據(jù)發(fā)送給服務(wù)器端卖子。服務(wù)器端在接受到數(shù)據(jù)后檢查ack是否為y+1略号,ACK是否為1,若正確則正確建立連接洋闽,雙方均進入ESTAB-LISHED狀態(tài)玄柠,完成三次握手。
TCP 與 UDP 的區(qū)別
除了TCP之外诫舅,我們還常聽到的是UDP羽利,那么他倆有啥區(qū)別呢? TCP對應(yīng)的是可靠性要求高的應(yīng)用刊懈,從上面的解釋可以看出來这弧,在真正通信之前要三次握手娃闲,是面向連接的;并且TCP利用序列號保證消息的有序性匾浪。 而UDP對應(yīng)的則是可靠性要求低皇帮,但是流量大、速度快的應(yīng)用蛋辈;和TCP相比属拾,UDP是無連接的并且可能是無序的。 TCP更重量梯浪,UDP更輕量捌年,沒有高低之分,只是應(yīng)用的場景不同挂洛。
非技術(shù)問題
為什么要在上家公司離職礼预?
未來三年的職業(yè)規(guī)劃的怎樣的?
您這邊有什么要理解的嗎虏劲?
非技術(shù)問題沒有正確答案
喜歡我的文章就關(guān)注我吧托酸,持續(xù)更新中.....
以上內(nèi)容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸柒巫,業(yè)務(wù)代碼寫多了沒有方向感励堡,不知道該從那里入手去提升,對此我整理了一些資料堡掏,包括但不限于:分布式架構(gòu)应结、高可擴展、高性能泉唁、高并發(fā)鹅龄、服務(wù)器性能調(diào)優(yōu)、TP6亭畜,laravel扮休,YII2,Redis拴鸵,Swoole玷坠、Swoft、Kafka劲藐、Mysql優(yōu)化八堡、shell腳本、Docker聘芜、微服務(wù)兄渺、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以點擊進入暗號:知乎厉膀。