首頁 > 後端開發 > php教程 > PHP面試題之概念題最新總結

PHP面試題之概念題最新總結

藏色散人
發布: 2023-04-09 20:54:01
轉載
5238 人瀏覽過

本篇文章給大家分享PHP面試題概念題最新匯總,有一定的參考價值,需要的朋友可以參考一下,希望對大家有所幫助。

相關推薦:《PHP面試題之應用題最新匯總

1. HTTP 狀態中狀態碼的意義

  • 302:暫時轉移成功,請求的內容已轉移到新位置。
  • 401:未授權。
  • 403:禁止存取 。
  • 500:伺服器內部錯誤

2. 傳值與傳引用

  • 傳值:是把實參的值賦值給形參,形參的修改,不會影響實參的值。
  • 傳引用 :將實參的位址傳遞形參,實參和形參則指向同一儲存空間,對行參的修改將影響實參的值。

3. 設計模式

創建型:員工當生抽(原型、工廠、單例、生成器、抽象工廠)

結構型:是敲響外帶組裝(適配器、橋接、享元、外觀、代理、組合、裝飾)

行為型:被責命碟中裝模防觀測(備忘錄、責任鏈、指令、迭代器、中介者、狀態、範本方法、訪客、觀察者、策略)

#4. 程式碼管理

通常一個專案是由一個團隊去開發,每個人將自己寫好的程式碼提交到版本伺服器,由專案負責人依照版本管理,方便版本的控制,提高開發效率,保證需要時可以回到舊版。

5. XSS 攻擊

XSS(跨站腳本攻擊)本質是攻擊者在web 頁面插入惡意程式碼,當使用者瀏覽該頁面之時,嵌入其中的程式碼會被執行,從而達到惡意攻擊使用者的目的。

如何防止?

答案:使用 htmlspecialchars() 函數將提交的內容過濾,使字串裡面的特殊符號實體化。

6. CGI、FastCGI、PHP-FPM 關係圖解

在整個網站架構中,Web Server(如Apache)只是內容的分發者。舉個栗子,如果客戶端請求的是 index.html,那麼Web Server會去檔案系統中找到這個文件,發送給瀏覽器,這裡分發的是靜態資料。

PHP面試題之概念題最新總結

如果請求的是 index.php,Web Server 收到這個請求後,就會啟動對應的 CGI 程序,這裡就是 PHP 的解析器。接下來PHP解析器會解析php.ini 文件,初始化執行環境,然後處理請求,再以規定CGI 規定的格式返回處理後的結果,退出進程,Web server 再把結果回傳給瀏覽器,這就是一個完整的動態PHP Web存取流程。

PHP面試題之概念題最新總結

  • Web Server :一般指 Apache、Nginx、IIS、Lighttpd、Tomcat 等伺服器。
  • Web Application: 一般指 PHP、Java、Asp.net 等應用程式。
  • CGI:是 Web Server 與 Web Application 之間資料交換的一種協定。
  • FastCGI:同 CGI,是一種通訊協議,但比 CGI 在效率上做了一些最佳化。同樣,SCGI 協定與 FastCGI 類似。
  • PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI 協定的介面程式。
  • PHP-FPM:是 PHP(Web Application)對 Web Server 提供的 FastCGI 協定的介面程序,額外也提供了相對智慧一些任務管理。

7. MVC

MVC 是一種開發模式,主要分為三個部分:

  • m(model),也就是模型,負責資料的操作;
  • v(view),也就是視圖,負責前台的顯示;
  • c(controller) ,也就是控制器,負責業務邏輯

8. PHP 的垃圾收集機制

PHP 可以自動進行記憶體管理,清除不再需要的對象。 PHP 使用了引用計數(reference counting)的垃圾回收(garbage collection)機制。每個對像都內含一個引用計數器,當 reference 連接到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器會減1。當某個物件的引用計數器為零時,PHP 會釋放其所佔的記憶體空間。

9. CLI  模式的生命週期


階段 呼叫函數 作用
模組初始化階段 php_module_startup() 主要進行PHP 框架, zend 引擎的初始化操作
請求初始化階段 php_request_startup() 對fpm 來說, 是在worker 進程讀取,並解析完請求資料後的一個階段
腳本執行階段 php_execute_script() 解析php 語法,產生抽象語法樹
#請求關閉階段 php_request_shutdown() #請求結束時執行
模組關閉階段 #php_module_shutdown () 當進程關閉時執行
#

10. php-fpm 運行機制

FastCGI 是Web 伺服器(如Nginx,Apache )和處理程序(如PHP )之間的一種通訊協議,它是一種應用層通訊協定。 php-fpm 是 PHP FastCGI 運行模式的一個阻塞的單線程模型進程管理器,單 master, 多 worker 結構, 同一個 worker 進程同時只能處理一個請求。 PHP 處理完請求後將解析的結果再透過 FastCGI 協定轉送給 Web 伺服器,Web 伺服器再傳回給使用者。

基本實作

PHP-FPM 是fast-cgi 的實作, 提供了行程管理的功能, 包含master, worker 兩種行程:

  • master 創建並監控socket, fork 多個worker 進程, 透過共享記憶體獲取worker 的狀態, 進而透過訊號控制worker 進程
  • worker 自由accept 請求

worker—請求處理

worker 進程不斷Accept 請求,有請求到達後,將讀取並解析FastCGI 協定的數據,解析完成後開始執行PHP 腳本,執行完成後關閉請求。各worker處理請求的步驟如下:

  1. 等待請求: worker 進程阻塞在 fcgi_accept_request() 中等待請求。
  2. 解析請求: fastcgi 請求到達後被 worker 接收,然後開始接收並解析請求數據,直到 request 資料完全到達。
  3. 請求初始化:執行 php_request_startup()。
  4. 執行PHP腳本。
  5. 關閉請求。

worker 進程的結構裡有個參數用來記錄worker 目前所處的階段fpm_scoreboard_proc_s->request_stage,一次請求過程中這個值會先後被設定為以下值:

  • FPM_REQUEST_ACCEPTING:等待要求階段。
  • FPM_REQUEST_READING_HEADERS: 讀取 fastcgi 要求 header 階段。
  • FPM_REQUEST_INFO:取得請求資訊階段,此階段是將要求的method,query string,request uri 等資訊儲存到各worker 進程的fpm_scoreboard_proc_s 結構中,此操作需要加鎖,因為master 進程也會操作此結構。
  • FPM_REQUEST_EXECUTING:執行PHP腳本階段。
  • FPM_REQUEST_END:沒有使用。
  • FPM_REQUEST_FINISHED:請求處理完成。

master–進程管理

master 在調用完fpm_run() 後不再返回,而是進入一個事件循環中,此後master 將始終圍繞著幾個事件進行處理,在具體分析這幾個事件之前,首先介紹Fpm 三種不同的進程管理方式,具體要使用哪種模式可以在conf 配置中透過pm 指定,例如pm=dynamic。

  • 靜態模式(static):這種方式比較簡單,在啟動時 master 根據 pm.max_children 配置 fork 出對應數量的 worker 進程,也就是 worker 進程數是固定不變的。
  • 動態模式(dynamic):這種模式比較常用,在 Fpm 啟動時會根據 pm.start_servers 配置初始化一定數量的 worker。運行期間如果 master 發現空閒 worker 數低於 pm.min_spare_servers 配置數(表示請求比較多,worker 處理不過來了)則會 fork worker 進程,但總的 worker 數不能超過 pm.max_children。如果 master 發現空閒 worker 數超過了 pm.max_spare_servers(表示閒著的 worker 太多了)則會殺掉一些 worker,避免佔用過多資源,master 透過這四個值來動態控制 worker 的數量。
  • 按需模式(ondemand):這種模式很像傳統的cgi,在啟動時不分配worker 進程,等到有請求了後在通知master 進程f ork worker 進程,也就是來了請求後再fork 子程序進行處理。總的 worker 數不超過 pm.max_children,處理完成後 worker 程序不會立即退出,當空閒時間超過 pm.process_idle_timeout 後再退出。

master 程序進入 fpm_event_loop() 事件循環,在這個方法中 master 將循環處理 master 註冊的幾個 IO 及定時器事件,當有事件觸發時將回調具體的 handler 進行處理。

11. 記憶體分配流程

#預先申請一塊內存在PHP 內部管理, 應用在申請記憶體時, 會從這部分申請, 釋放時也是先釋放回到記憶體管理中。這樣設計話可以避免小記憶體的申請釋放對作業系統上的額外效能的消耗。

12. php 陣列的實作

PHP 陣列的底層實作是散列表(也叫hashTable ),散列表是根據鍵(Key)直接存取記憶體存儲位置的資料結構,它的key - value 之間存在一個映射函數,可以根據key 透過映射函數得到的散列值直接索引到對應的value 值,無需透過關鍵字比較,在理想情況下,不考慮散列衝突,散列表的查找效率是非常高的,時間複雜度是O (1)。

13. 依賴注入

概念:指服務依賴的其他服務不透過服務自己創建的方式, 而是由外部傳入的方式。

如何實現的?答:通常來說使用反射實現的.。

能解決什麼問題?答:降低服務模組之間的耦合度,編寫程式碼時不用考慮外部服務的具體實現,只需要依據介面來使用服務即可。

14. 物件導向

概念:物件導向是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。

主要特徵:封裝、繼承、多型。

五大基本原則: 單一職責原則;開放封閉原則;替換原則; 依賴原則; 介面分離原則。


本篇首發在 LearnKu.com 網站。

相關推薦:《2021年PHP面試題大匯總(收藏)

#

以上是PHP面試題之概念題最新總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板