發展歷程,語言特點,開源免費,快捷高效,性能提升,跨平台,常駐記憶體,頁面生命周期,運行機制,參考框架,語言參考,內置函式,預定義變數,數據類型,運算符,流程控制,類與對象,命名空間,參考手冊,版本記錄,
發展歷程 PHP是一個擁有眾多開發者的
開源軟體 項目,最開始是Personal Home Page的縮寫,已經正式更名為 "PHP: Hypertext Preprocessor"。PHP是在1994年由Rasmus Lerdorf創建的,最初只是一個簡單的用Perl語言編寫的統計他自己網站訪問者數量的程式。後來重新用C語言編寫,同時可以訪問資料庫,1995年,PHP(Personal Home Page Tools)對外發表第一個版本PHP1。此後,越來越多的網站開始使用PHP,並且強烈要求增加一些特性,如循環語句和數組變數等,1995年發布的PHP2加入了對mySQL的支持。
Andi Gutmans和Zeev Suraski在為一所大學的項目中開發電子商務程式時發現PHP2功能明顯不足,於是他們重寫了代碼發布了PHP3。PHP3是類似於現代PHP語法結構的第一個版本,PHP3的最強大的功能是它的可擴展性,PHP3的新功能和廣泛的第三方資料庫、API的支持使得這樣程式的編寫成為可能。
PHP3官方發布不久,Andi Gutmans和Zeev Suraski開始重新編寫PHP代碼。設計目標是增強複雜程式運行時的性能和PHP自身代碼的模組性。經過不懈努力Zend引擎研發成功並且實現了設計目標,並在1999年中期引入 PHP。基於該引擎並結合了更多新功能的 PHP4於2000年5月正式發布。除了更高的性能以外,PHP4還包含一些關鍵功能,比如:支持更多的 web 伺服器、HTTP Sessions 支持、輸出緩衝、更安全的用戶輸入和一些新的語言結構。
PHP5於2004年7月正式發布,它的核心是Zend引擎2代(PHP7是Zend加強版3代),引入了新的對象模型和大量新功能,開始支持面向對象編程。隨著PHP6經歷長時間的開發流產後,PHP5發布了6個版本頑強的支撐著開源社區的發展,直到2015-12-03那天迎來了PHP 7.0的發布,其實PHP5.6已經包含了很多PHP6想實現的特性,它為PHP7的研發爭取了寶貴的時間。不負眾望PHP7.0對比PHP5.6性能整整提升了2倍,PHP7的成功發布讓很多核心開發成員回歸到PHP社區,並且在2020-11-26發布了PHP8。和php7系列相對比,PHP8對各種變數判斷和運算採用更嚴格的驗證判斷模式,這點有利後續版本對jit的性能最佳化。
PHP語言作為一種高級語言,其特點是開源, 在設計體系上屬於C語言體系,它可以讓很多接受過高等教育的初學者能很快接受並完成入門學習,簡單好上手容易找工作自然冬粉多。如果數據量大及訪問壓力大,可以集成
redis 、mysql分表分區分庫、
elasticsearch 搜尋引擎、訊息
佇列 防寫和php系統分散式集群部署等技術方案,緩解數據存儲、服務訪問和數據檢索帶來的巨大壓力。
無論是大中小型項目,PHP都是一個十分適合的高級程式語言,是否適合就看項目研發團隊的對它的掌握程度。 但是對於較大的和更為複雜的項目,最常見的php-fpm編程模式就顯出它的薄弱了。針對PHP-fpm暴露出的一系列缺點問題,最簡單靠譜的方案就是及時升級兼容PHP的高版本,PHP7.0.0對比PHP5.6性能提升了2倍,另外PHP7.4提供的Preloading預載入機制實現了部分程式常駐記憶體,獲取了不錯的性能提升,在PHP8又提供了高效的JIT (Just-In-Time即時編譯)運算支持。另外水平更高的開發者可以轉向難度更高的php-cli編程,它能解決大部分的系統性能問題,無論是PHP7和PHP8都支持這種模式的編程。
根據W3Techs2019年12月6號發布的統計數據,PHP在WEB網站伺服器端使用的程式語言所占份額高達78.9%。在內容管理系統的網站中,有58.7%的網站使用WordPress(PHP開發的CMS系統),這占所有網站的25.0%。
2023年11月,PHP 8.3發布。
語言特點 開源免費 PHP是一個客群大並且擁有眾多開發者的開源軟體項目,Linux + Nginx + Mysql + PHP是它的經典安裝部署方式,相關的軟體全部都是開源免費的,所以使用PHP可以節約大量的正版授權費用。不過PHP作為一個開源軟體,它缺乏大型科技公司的支持背景,網路上對它的唱衰也是經久不衰,不過它的持續疊代和性能持續增強的現實卻是鼓舞人心的,PHP社區用實際行動給予各種質疑強有力的回擊。
快捷高效 PHP的核心是
C語言 編寫的基礎好效率高,可以用C語言開發高性能的擴展組件;PHP的核心包含了數量超過1000的
內置函式 ,功能應有盡有很全面,開箱即用程式代碼簡潔;PHP數組支持動態擴容,支持以數字、字元串或者混合鍵名的關聯數組,能大幅提高開發效率;PHP是一門弱類型語言,程式編譯通過率高,相對其他強類型語言開發效率快;PHP天然熱部署,在php-fpm運行模式下代碼檔案覆蓋即完成熱部署;PHP經過20多年的發展,在網際網路上可以搜到海量的參考資料供參考學習。
性能提升 PHP版本越高它的整體性能越高,根據官方介紹,PHP7.0.0對比PHP5.6性能就提升了2倍,PHP7.4已經比PHP7.0快了約30%,PHP8.0在性能上又相對PHP7.4大約改進了10%。PHP 8.0 引入了 JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、註解、Constructor Property Promotion、match 表達式、nullsafe 運算符以及對類型系統、錯誤處理和一致性的改進。PHP擁有自己的核心開發團隊,保持5年發布一個大版本、1個月發布2個小版本的頻率,最新的版本是PHP8.08。PHP 7.0.0發布於2015-12-03,此版本下最新版本是PHP 7.4.21(發布日期:2021-07-01),PHP 8.0.0發布於2020-11-26,此版本下最新版本是PHP 8.0.8(發布日期:2021-07-01)。
跨平台 每個平台都有對應的php解釋器版本,指針對不同平台均編譯出目標平台的二進制碼(PHP解釋器),php開發的程式可以不經修改運行在windows、linux、unix等多個作業系統上。
常駐記憶體 php-cli模式下可以實現程式常駐記憶體,各種變數和資料庫連線都能長久保存在記憶體實現資源復用,比較常用的做法是結合swoole組件編寫cli框架。
頁面生命周期 在php-fpm模式下,所有的
變數 都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空,對程式設計師水平要求低,占用記憶體非常少,特別適合中小型系統的開發。
運行機制 PHP常見的運行模式有2種,分別是php-fpm和php-cli。當PHP 選擇運行在php-fpm模式下,所有的
變數 都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空。運行在php-cli模式下可以實現程式常駐記憶體,各種變數和資料庫連線都能長久保存在記憶體實現資源復用,性能可以得到很大的提升,php-cli雖然開發比較複雜,但是能夠獲取更高的性能,對開發者的要求比較高需要比較高的開發水平,比較常用的模式是結合swoole組件編寫cli框架,各種變數能保存在跨進程的高性能共享記憶體 Table,可以開發出支持熱啟動的php-cli可靠各類套用系統。
php-fpm在PHP 5.3.3版本成為了官方正式組件(2010-07-22),它提供了穩定可靠的進程管理服務,進程不足時候可以智慧型擴充數量,閒置時候可以自動回收銷毀多餘的進程,同時它對程式的容錯能力很強大運行非常穩定,可以應付企業級的開發需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP網際網路協定下進行的用戶的輸入輸出,頁面級生命周期各種資源用完即釋放,不存在記憶體泄漏的問題。php-fpm也提供有一些常駐記憶體的技術支持,例如PHP 7.4引入的opcache.preload也能實現局部的PHP類和函式的常駐記憶體,不過這個方法不夠靈活,和伺服器配置捆綁的太死了。
php-cli因為能實現各類資源的常駐記憶體,所以可以資源復用,更高效完成多進程編程和異步編程,可以開發出負載能力更高的套用系統。但是相對php-fpm的簡單編程開發,開發者要注意很多的事項和需要做很多附加的控制器開發,否則就無法實現期待中的高性能。
首先開發者需要去實現可靠的進程管理服務,保證系統進程遇到各類錯誤退出運行後能夠自動創建新的進程,只有這樣才能保證後續的服務請求有足夠空閒進程可分配。每個業務代碼段都要做異常處理,讓進程遇到非致命錯誤時候不會退出,因為進程重啟意味程式和各類資源需要再次載入,這個過程性能消耗不小,所以只有進程穩定運行了常駐記憶體才有意義。
其次因為常駐記憶體,編寫的新的程式必須重啟服務才能生效,這一點習慣了fpm模式的開發者會感到比較陌生。另外開發者需要手工釋放記憶體,否則系統長時間運行後會出現記憶體泄露。同時在cli模式下,我們不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 進行編程工作,需要自己去解析各種網際網路通訊協定完成用戶的輸入輸出。要實現多進程編程利用多核CPU計算,還有學習使用pcntl和posix編程,這裡涉及到了異步編程邏輯,這塊難度還是比較大的。比較常用的模式是結合swoole組件編寫cli框架。
PHP是一個活躍的社區開發語言,有專業的核心開發團隊在持續不斷的疊代,最近一個版本就是PHP 8.0.8引入了很多的新特性。
參考框架 (一)WordPress內容管理系統(CMS)
功能強大、擴展性強,易於擴充功能;搭建的部落格對seo搜尋引擎友好,收錄快排名靠前;網站上主題多,各色各樣應有盡有;有強大的社區支持,有上千萬的開發者貢獻和審查。
(二)Hyperf
Hyperf 是一個基於Swoole 高性能、高靈活性的漸進式 PHP 協程框架,內置協程伺服器及大量常用的組件,性能較傳統基於PHP-FPM 的框架有質的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均基於 PSR 標準實現,基於強大的依賴注入設計,保證了絕大部分組件或類都是 可替換 與 可復用 的。
(三)ThinkPHP
ThinkPHP 是一個快速、兼容而且簡單的輕量級國產PHP開發框架,最早誕生於2006年初,遵循Apache2開源協定發布。秉承簡潔實用、出色的性能和至簡的代碼、注重易用性。並且擁有眾多原創功能和特性,在社區團隊的積極參與下,在易用性、擴展性和性能方面不斷最佳化和改進。
(四)Drupal
Drupal誕生於2000年 ,是一個基於PHP語言編寫的開發型CMF(內容管理框架),即:CMS+ framework。Drupal的架構由三大部分組成:核心、模組、主題。三者通過Hook機制緊密的聯繫起來。可自由配置,能支持從個人部落格到大型社區驅動的網站等各種不同套用的網站項目。
(五)easyswoole
EasySwoole是一款常駐記憶體型的國產分散式swoole框架,支持同時混合監聽HTTP、WebSocket、自定義TCP、UDP協定,且擁有豐富的組件,例如協程 連線池、協程Kafka客戶端、協程ElasticSearch客戶端、、協程Redis客戶端、協程自定義佇列、 協程Memcached客戶端、協程HTTP客戶端、Crontab定時器等。
(六)Laravel
Laravel是一套簡潔、優雅的PHP Web開發框架(PHP Web Framework)。它可以讓你從麵條一樣雜亂的代碼中解脫出來;它可以幫你構建一個不錯的網路APP,而且每行代碼都可以簡潔、富於表達力。
(七)CakePHP
CakePHP 設計層面很優雅,沒有自帶多餘的 library,所有的功能都是純粹的框架,執行效率還不錯。
(八)imi
它可以運行在 PHP-FPM、Swoole、Workerman 多種容器環境下
語言參考 內置函式 PHP 有很多標準的函式和結構。還有一些函式需要和特定的擴展模組一起編譯,否則在使用它們的時候就會得到一個致命的“未定義函式”錯誤。例如,要使用 image 函式中的 imagecreatetruecolor(),需要在編譯 PHP 的時候加上 GD 的支持。或者要使用 mysqli_connect() 函式,就需要在編譯 PHP 的時候加上 MySQLi 支持。有很多核心函式已包含在每個版本的 PHP 中如字元串和變數函式。調用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 載入了那些擴展庫。同時還應該注意,很多擴展庫默認就是有效的。
在PHP編程里需要注意用戶的輸入安全,對用戶各個方面的輸入都要做好相關的過濾處理,內置函數裡提供了不少的安全相關的函式,編程學習者需要重點掌握以下的7個重點函式如下表格:
用戶輸入安全的7個內置函式 預定義變數 對於全部腳本而言,PHP 提供了大量的預定義變數。這些變數將所有的外部變數表示成內建環境變數,並且將錯誤信息表示成返回頭。在PHP的編程里我們經常需要用到以下幾個系統變數,編程學習者需要重點掌握的7個預定義變數如下表格:
重點需要掌握的7大預定義變數 數據類型 PHP 支持 10 種原始數據類型。四種標量類型:bool(布爾型)、int(整型)、float(浮點型,也稱作 double)和string(字元串);四種複合類型:array(數組)、object(對象)、callable(可調用)和iterable(可疊代);最後是兩種特殊類型:resource(資源)和NULL(無類型)。
運算符 運算符是可以通過給出的一或多個值(用編程行話來說,表達式)來產生另一個值(因而整個結構成為一個表達式)的東西。PHP的運算符包含:運算符優先權、算術運算符、賦值運算符、位運算符、比較運算符、錯誤控制運算符、執行運算符、遞增/遞減運算符、邏輯運算符、字元串運算符、數組運算符和類型運算符。
流程控制 任何PHP腳本都是由一系列語句構成的,一條語句可以是一個賦值語句、一個函式調用、一個循環、一個條件語句或者甚至是一個什麼也不做的語句(空語句)。語句通常以分號結束,此外還可以用花括弧將一組語句封裝成一個語句組,語句組本身可以當作是一行語句。
類與對象 每個類的定義都以關鍵字class開頭,後面跟著類名,後面跟著一對花括弧,裡面包含有類的屬性與方法的定義。類名可以是任何非PHP保留字 的合法標籤。一個合法類名以字母或下劃線開頭,後面跟著若干字母,數字或下劃線。以正則表達式表示為:^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。一個類可以包含有屬於自己的常量,變數(稱為“屬性”)以及函式(稱為“方法”)。要創建一個類的實例,必須使用 new 關鍵字。當創建新對象時該對象總是被賦值,除非該對象定義了 構造函式 並且在出錯時拋出了一個 異常。類應在被實例化之前定義(某些情況下則必須這樣)。如果在new之後跟著的是一個包含有類名的字元串 string,則該類的一個實例被創建。如果該類屬於一個命名空間,則必須使用其完整名稱。
命名空間 在 PHP中,命名空間用來解決在編寫類庫或應用程式時創建可重用的代碼如類或函式時碰到的兩類問題:用戶編寫的代碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高原始碼的可讀性。PHP命名空間提供了一種將相關的類、函式和常量組合到一起的途徑。
參考手冊 php的文檔內容比較多,這裡這是摘錄了部分內容,有需要的用戶可以訪問官網獲取更完整的使用手冊。
版本記錄 版本
發布日期
最終支持
相關更新及備註
針對PHP 1.0的改進版,速度更快、體積更小,更容易產生動態網頁。
Zeev Suraski和Andi Gutmans重寫了底層,支持可擴展組件。
增加了Zend引擎,支持更多的 web 伺服器、HTTP Sessions 支持、輸出緩衝、更安全的用戶輸入和一些新的語言結構
加入了superglobal(超全局的概念,即$_GET、$_POST等)
引入了編譯器來提高性能、增加了PDO作為訪問資料庫的接口
支持命名空間;使用XMLReader和XMLWriter增強XML支持;支持SOAP ,延遲靜態綁定,跳轉標籤(有限的goto), 閉包,Native PHP archives。php-fpm在php5.3.3版本成為了官方正式組件
支持Trait、簡短數組表達式。移除了register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister(), magic_quotes以及session_is_registered()。加入了內建的Web伺服器。增強了性能,減小記憶體使用量。
支持generators,用於異常處理的finally ,將OpCache(基於 Zend Optimizer+)加入官方發布中。
常數標量表達式、可變參數函式、參數拆包、新的求冪運算符、函式和常量的use語句的擴展、新的phpdbg調試器作為SAPI模組,以及其他更小的改進。使用php://input替代 $HTTP_RAW_POST_DATA,iconv和mbstring配置選項中和編碼相關的選項廢棄。
Zend引擎升級到三代 ,整體性能是5.6的2倍。移除ereg、mssql、mysql、sybase_ct等4個擴展。引入了類型聲明,有兩種模式: 強制 (默認) 和 嚴格模式。支持匿名類。
void返回值類型,類常量,可見性修飾符,新增可為空(Nullable)類型,新增短數組語法([])的,支持多異常捕獲處理,廢棄了mcrypt 擴展用OpenSSL取代
GD 擴展內的 png2wbmp() 和 jpeg2wbmp() 被廢棄,對象參數和返回類型提示、抽象方法重寫等
更靈活的 Heredoc 和 Nowdoc 語法,大小寫不敏感的常量聲明現被廢棄,在字元串中搜尋非字元串內容都將被視為字元串,而不是 ASCII 編碼值。
Preloading預載入機制,改進OpenSSL、弱引用等。屬性添加限定類型、有限返回類型協變與參數類型逆變、數值文字分隔設定,為過渡到PHP8做了一定的準備。
JIT (Just-In-Time即時編譯)、新增static返回類型、新增mixed 類型、命名參數(Named arguments)和注釋(Attributes),不再允許通過靜態調用的方式去調用非靜態方法,字元串與數字的比較將首先將數字轉為字元串再比較
PHP 8.2 新增支持在 traits 中定義常量、引入了“Random”擴展和“read-only”類、Disjunctive Normal Form (DNF) 類型,更新了內置 web 伺服器的 MIME 類型表,減少了各種函式返回的字元串的記憶體占用,初步支持 macOS Instrument 的 JIT 性能分析生成,為 Linux 啟用 arc4random_buf,為隨機位元組引入 Glibc 2.36 以上版本。
PHP 8.2 初步支持 Windows for ARM64 平台上的跨平台創建,分配 JIT 緩衝區 Opcache 靠近 PHP .text 欄位,以允許使用直接的 IP 相關調用和跳轉。新版本還為 PHP Sockets 引入新選項,支持新的 Curl 選項,新的 ZipArchive 方法,廢棄動態屬性,並最佳化了一些性能。
添加類常量顯式類型、唯讀屬性深拷貝,新增#[\Override] 屬性,新增 json_validate () 函式,添加 Randomizer::getBytesFromString () 方法,添加 Randomizer::getFloat () 和 Randomizer::nextFloat () 方法