PHP

PHP

計算機編程語言
PHP(PHP:Hypertext Preprocessor)即“超文本預處理器”,是在服務器端執行的腳本語言,尤其适用于Web開發并可嵌入HTML中。PHP語法學習了C語言,吸納Java和Perl多個語言的特色發展出自己的特色語法,并根據它們的長項持續改進提升自己,例如java的面向對象編程,該語言當初創建的主要目标是讓開發人員快速編寫出優質的web網站。PHP同時支持面向對象和面向過程的開發,使用上非常靈活。經過二十多年的發展,随着php-cli相關組件的快速發展和完善,PHP已經可以應用在TCP/UDP服務、高性能Web、WebSocket服務、物聯網、實時通訊、遊戲、微服務等非Web領域的系統研發。根據W3Techs2019年12月6号發布的統計數據,PHP在WEB網站服務器端使用的編程語言所占份額高達78.9%。在内容管理系統的網站中,有58.7%的網站使用WordPress(PHP開發的CMS系統),這占所有網站的25.0%[1]。
    軟件名稱:PHP 軟件平台:Windows、Linux、Unix、macOS等 軟件語言:PHP 開發商:THE PHP Group 軟件授權:Creative Commons Attribution 軟件版本:PHP8.0.8 軟件大小:16至26MB

發展曆程

PHP是一個擁有衆多開發者的開源軟件項目,最開始是Personal Home Page的縮寫,已經正式更名為‘’PHP:Hypertext Preprocessor"。PHP是在1994年由Rasmus Lerdorf創建的,最初隻是一個簡單的用Perl語言編寫的統計他自己網站訪問者數量的程序。後來重新用C語言編寫,同時可以訪問數據庫,1995年,PHP(Personal Home Page Tools)對外發表第一個版本PHP1。此後,越來越多的網站開始使用PHP,并且強烈要求增加一些特性,如循環語句和數組變量等,1995年發布的PHP2加入了對mSQL的支持。

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那天迎來了PHP7.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都支持這種模式的編程。

語言特點

開源免費

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%。PHP8.0引入了JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、注解、Constructor Property Promotion、match表達式、nullsafe運算符以及對類型系統、錯誤處理和一緻性的改進。PHP擁有自己的核心開發團隊,保持5年發布一個大版本、1個月發布2個小版本的頻率,最新的版本是PHP8.08。PHP7.0.0發布于2015-12-03,此版本下最新版本是PHP7.4.21(發布日期:2021-07-01),PHP8.0.0發布于2020-11-26,此版本下最新版本是PHP8.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在PHP5.3.3版本成為了官方正式組件(2010-07-22),它提供了穩定可靠的進程管理服務,進程不足時候可以智能擴充數量,閑置時候可以自動回收銷毀多餘的進程,同時它對程序的容錯能力很強大運行非常穩定,可以應付企業級的開發需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互聯網協議下進行的用戶的輸入輸出,頁面級生命周期各種資源用完即釋放,不存在内存洩漏的問題。php-fpm也提供有一些常駐内存的技術支持,例如PHP7.4引入的opcache.preload也能實現局部的PHP類和函數的常駐内存,不過這個方法不夠靈活,和服務器配置捆綁的太死了。

php-cli因為能實現各類資源的常駐内存,所以可以資源複用,更高效完成多進程編程和異步編程,可以開發出負載能力更高的應用系統。但是相對php-fpm的簡單編程開發,開發者要注意很多的事項和需要做很多附加的控制器開發,否則就無法實現期待中的高性能。

首先開發者需要去實現可靠的進程管理服務,保證系統進程遇到各類錯誤退出運行後能夠自動創建新的進程,隻有這樣才能保證後續的服務請求有足夠空閑進程可分配。每個業務代碼段都要做異常處理,讓進程遇到非緻命錯誤時候不會退出,因為進程重啟意味程序和各類資源需要再次加載,這個過程性能消耗不小,所以隻有進程穩定運行了常駐内存才有意義。

其次因為常駐内存,編寫的新的程序必須重啟服務才能生效,這一點習慣了fpm模式的開發者會感到比較陌生。另外開發者需要手工釋放内存,否則系統長時間運行後會出現内存洩露。同時在cli模式下,我們不能像fpm裡直接用$-SERVER、$-POST、$-GET、$-COOKI和$-FILES進行編程工作,需要自己去解析各種互聯網通訊協議完成用戶的輸入輸出。要實現多進程編程利用多核CPU計算,還有學習使用pcntl和posix編程,這裡涉及到了異步編程邏輯,這塊難度還是比較大的。比較常用的模式是結合swoole組件編寫cli框架。

PHP是一個活躍的社區開發語言,有專業的核心開發團隊在持續不斷的叠代,最近一個版本就是PHP8.0.8引入了很多的新特性。

參考框架

(一)WordPress内容管理系統(CMS)

功能強大、擴展性強,易于擴充功能;搭建的博客對seo搜索引擎友好,收錄快排名靠前;網站上主題多,各色各樣應有盡有;有強大的社區支持,有上千萬的開發者貢獻和審查。

(二)Hyperf

基于Swoole實現的高性能、高靈活性的國産PHP協程框架,内置協程服務器及大量常用的組件,也保持着極其靈活的可擴展性,标準組件均基于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,所有的功能都是純粹的框架,執行效率還不錯。

語言參考

内置函數

PHP有很多标準的函數和結構。還有一些函數需要和特定的擴展模塊一起編譯,否則在使用它們的時候就會得到一個緻命的“未定義函數”錯誤。例如,要使用image函數中的imagecreatetruecolor,需要在編譯PHP的時候加上GD的支持。或者要使用mysqli-connect函數,就需要在編譯PHP的時候加上MySQLi支持。有很多核心函數已包含在每個版本的PHP中如字符串和變量函數。調用phpinfo或者get-loaded-extensions可以得知PHP加載了那些擴展庫。同時還應該注意,很多擴展庫默認就是有效的。

在PHP編程裡需要注意用戶的輸入安全,對用戶各個方面的輸入都要做好相關的過濾處理,内置函數裡提供了不少的安全相關的函數,編程學習者需要重點掌握以下的7個重點函數如下:

1、函數名稱:htmlentities;用途簡介:将字符轉換為HTML轉義字符;

2、函數名稱:htmlspecialchars-decode;用途簡介:将特殊的HTML實體轉換回普通字符;

3、函數名稱:htmlspecialchars;用途簡介:将特殊字符轉換為HTML實體;

4、函數名稱:nl2br;用途簡介:在字符串所有新行之前插入HTML換行标記;

5、函數名稱:str-replace;用途簡介:子字符串替換;

6、函數名稱:strip-tags;用途簡介:從字符串中去除HTML和PHP标記;

7、函數名稱:stripslashes;用途簡介:反引用一個引用字符串;

預定義變量

對于全部腳本而言,PHP提供了大量的預定義變量。這些變量将所有的外部變量表示成内建環境變量,并且将錯誤信息表示成返回頭。在PHP的編程裡我們經常需要用到以下幾個系統變量,編程學習者需要重點掌握的7個預定義變量如下:

1、變量名稱:$GLOBALS;變量用途說明;引用全局作用域中可用的全部變量;

2、變量名稱:$-SERVER;變量用途說明;服務器和執行環境信息;

3、變量名稱:$-GET;變量用途說明;HTTP GET變量(用戶輸入之一);

4、變量名稱:$-POST;變量用途說明;HTTP POST變量(用戶輸入之一)

5、變量名稱:$-FILES;變量用途說明;HTTP文件上傳變量;

6、變量名稱:$-SESSION;變量用途說明;Session變量(用戶會話);

7、變量名稱:$-COOKIE;變量用途說明;HTTP Cookies(用戶會話标識);

數據類型

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的文檔内容比較多,這裡這是摘錄了部分内容,有需要的用戶可以訪問官網獲取更完整的使用手冊。

相關詞條

相關搜索

其它詞條