初中級PHP面試基礎彙總
這是我整理的一套面試題,老鐵們看看就當複習了哦
相關PHP面試題
搞定PHP面試 - 函式知識點整理
php 面試題目整理
PHP面試整理
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的程序管理器,支援平滑重啟可以啟動的時候預先生成多個程序。
什麼是 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更輕量,沒有高低之分,只是應用的場景不同。
非技術問題
- 為什麼要在上家公司離職?
- 未來三年的職業規劃的怎樣的?
- 您這邊有什麼要理解的嗎?
非技術問題沒有正確答案