PHP 知識

Rakishly發表於2020-06-16

nginx如何配置負載均衡:

在nginx裡面配置一個upstream,然後把相關的伺服器ip都配置進去。然後採用輪詢的方案,然後在nginx裡面的配置項裡,proxy-pass指向這個upstream,這樣就能實現負載均衡。

什麼是CGI?

CGI是一種通用閘道器協議。為了解決不同的語言直譯器(如 php 、 python 直譯器)與WebServer的通訊而產生的一種協議。只要遵守這種協議就能實現語言與WebServer通訊。CGI是規定了要傳什麼資料/以什麼格式傳輸給 php 解析器的協議。

什麼是FastCGI?

是一種對CGI協議昇華的一種協議。FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要啟用後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支援分散式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站 伺服器 來的請求。。

什麼是PHP-FPM?

(PHP FastCGI Process Manager),PHP-FPM是一個實現了Fastcgi協議的程式,用來管理Fastcgi起的程式的,即能夠排程php-cgi程式的程式。並提供了程式管理的功能。程式包含 master 程式和 worker 程式兩種程式。master程式只有一個,負責監聽埠(預設9000),接收來自 WebServer的請求,而 worker 程式則一般有多個(具體數量根據實際需要配置),每個程式內部都嵌入了一個 PHP 直譯器,是PHP程式碼真正執行的地方。

FastCGI好在哪裡?

Fastcgi則會先fork一個master,解析配置檔案,初始化執行環境,然後再fork多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閒worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源。這就是Fastcgi的對程式的管理。大多數Fastcgi實現都會維護一個程式池。注:swoole作為httpserver,實際上也是類似這樣的工作方式。

我們以使用者訪問index.php為,伺服器環境為LNMP:

1、使用者請求index.php時,首先到Nginx
2、Nginx流程步驟:
(1)根據配置查詢路由
(2)載入 nginx 的fast-cgi模組(FastCGI的Client),將根據fastcgi.conf檔案中fastcgi_*配置引數值也一併加入轉發任務中
(3)根據nginx.conf檔案fastcgi_pass配置將請求轉發到127.0.0.1:9000。
3、PHP-FPM操作:
(1)PHP-FPM的master程式監聽9000埠。
(2)收到請求後呼叫子程式來處理邏輯,PHP直譯器解釋PHP語法並返回給Nginx。
4、Nginx操作:
將響應返回給使用者

php 程式碼解釋過程

Php總共三個模組:
a.PHP核心:用來處理請求、檔案流、錯誤處理等相關操作
b.zend引擎:用以將原始檔轉換成機器語言,然後在虛擬機器上執行它
c.擴充套件層:是一組函式、類庫和流。PHP使用它們來執行一些特定的操作

比如:我們需要mysqli擴充套件來連線mysql資料庫;當zend執行程式可能會需要連線若干擴充套件,這是zend引擎將控制器交給擴充套件,等處理完特定任務後再返還,最後 zend引擎將執行結果返回給PHP核心,它再將結果傳送給SAPI層,最後輸出到瀏覽器上。
PHP的核心架構如下圖:

PHP 只是

a.zend引擎:zend引擎整體用純C實現,是PHP的核心部分,它將PHP程式碼翻譯(詞法,語法解析等一系列編譯過程)為可執行opcode的處理並實現相應的處理方法,實現了基本的資料結構(如hashtable、oo),記憶體分配及管理,提供了相應的api方法供外部呼叫,是一切的核心,所有的外圍功能均是圍繞zend實現
b.Extensions:圍繞zend引擎,extensions通過元件式的方式提供各種基礎服務,我們常見的各種內建函式(如array系列)、標準庫等都是通過extensions來實現。使用者也可以根據自己的需要實現自己的extensions以達到功能擴充套件、效能優化等目的。
c.sapi:sapi全稱是server application programming interface。也就是服務端應用程式設計介面,sapi通過一系列鉤子函式,使得PHP可以和外圍互動資料,這是PHP非常優雅和成功的設計,通過sapi成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行相容,而應用本身也可以針對自己的特點實現不同的處理方式
d.上層應用:這就是我們平時編寫的PHP程式,通過不同的sapi方式得到各種各樣的應用模式,如通過webserver實現web應用、在命令列下以指令碼方式執行等等。
如果PHP是一輛車,那麼車的框架就是PHP本身,Zend是車的引擎(發動機),Ext下面的各種元件就是車的輪子,Sapi可以看做是公路,車可以跑在不同型別的公路上,而一次PHP程式的執行就是汽車跑在公路上。因此,我們需要:效能優異的引擎+合適的車輪+正確的跑道。

如前所述,Sapi通過通過一系列的介面,使得外部應用可以和PHP交換資料並可以根據不同應用特點實現特定的處理方法,我們常見的一些sapi有:
apache2handler:這是以apache作為webserver,採用mod_PHP模式執行時候的處理方式,也是現在應用最廣泛的一種。
cgi:這是webserver和PHP直接的另一種互動方式,也就是大名鼎鼎的fastcgi協議,在最近今年fastcgi+PHP得到越來越多的應用,也是非同步webserver所唯一支援的方式。
cli:命令列呼叫的應用模式

PHP執行這段程式碼會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend)
Scanning(Lexing) ,將PHP程式碼轉換為語言片段(Tokens)
Parsing, 將Tokens轉換成簡單而有意義的表示式
Compilation, 將表示式編譯成Opocdes
Execution, 順次執行Opcodes,每次一條,從而實現PHP指令碼的功能。

PHP的抽象類、介面類的區別和選擇

1、對介面的使用是通過關鍵字implements。對抽象類的使用是通過關鍵字extends。當然介面也可以通過關鍵字extends繼承。
2、介面中不可以宣告成員變數(包括類靜態變數),但是可以宣告類常量。抽象類中可以宣告各種型別成員變數,實現資料的封裝。(另Java介面中的成員變數都要宣告為public static final型別)
3、介面沒有建構函式,抽象類可以有建構函式。
4、介面中的方法預設都是public型別的,而抽象類中的方法可以使用private,protected,public來修飾。
5、一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
如果要建立一個模型,這個模型將由一些緊密相關的物件採用,就可以使用抽象類。如果要建立將由一些不相關物件採用的功能,就使用介面。
如果必須從多個來源繼承行為,就使用介面。
如果知道所有類都會共享一個公共的行為實現,就使用抽象類,並在其中實現該行為。
抽象類中不一定都是抽象的方法,也可以有具體實現的方法,這樣就可以把大家公用的方法提升到抽象類中,然後具體的方法可以留給子類自己實現(此處經典的應用,模板方法設計模式)。所以抽象類可以更好的實現程式碼的複用
介面和抽象類的概念不一樣。這個可以理解為介面是對動作的抽象,抽象類是對根源的抽象(即對本質的抽象與其他類的本質不同)。

PHP的垃圾收集機制是怎樣的

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章