PHP(PHP:Hypertext Preprocessor)即“超文本預(yù)處理器”,是在服務(wù)器端執(zhí)行的腳本語言,,尤其適用于Web開發(fā)并可嵌入HTML中,。PHP語法學(xué)習(xí)了C語言,吸納Java和Perl多個語言的特色發(fā)展出自己的特色語法,,并根據(jù)它們的長項(xiàng)持續(xù)改進(jìn)提升自己,,例如java的面向?qū)ο缶幊蹋撜Z言當(dāng)初創(chuàng)建的主要目標(biāo)是讓開發(fā)人員快速編寫出優(yōu)質(zhì)的web網(wǎng)站,。PHP同時支持面向?qū)ο蠛兔嫦蜻^程的開發(fā),,使用上非常靈活。
PHP是一個擁有眾多開發(fā)者的開源軟件項(xiàng)目,,最開始是Personal Home Page的縮寫,已經(jīng)正式更名為"PHP:Hypertext Preprocessor",。PHP是在1994年由Rasmus Lerdorf創(chuàng)建的,,最初只是一個簡單的用Perl語言編寫的統(tǒng)計他自己網(wǎng)站訪問者數(shù)量的程序。后來重新用C語言編寫,,同時可以訪問數(shù)據(jù)庫,,1995年,PHP(Personal Home Page Tools)對外發(fā)表第一個版本PHP1,。此后,,越來越多的網(wǎng)站開始使用PHP,并且強(qiáng)烈要求增加一些特性,,如循環(huán)語句和數(shù)組變量等,,1995年發(fā)布的PHP2加入了對mySQL的支持。
Andi Gutmans和Zeev Suraski在為一所大學(xué)的項(xiàng)目中開發(fā)電子商務(wù)程序時發(fā)現(xiàn)PHP2功能明顯不足,,于是他們重寫了代碼發(fā)布了PHP3,。PHP3是類似于現(xiàn)代PHP語法結(jié)構(gòu)的第一個版本,PHP3的最強(qiáng)大的功能是它的可擴(kuò)展性,,PHP3的新功能和廣泛的第三方數(shù)據(jù)庫,、API的支持使得這樣程序的編寫成為可能。
PHP3官方發(fā)布不久,,Andi Gutmans和Zeev Suraski開始重新編寫PHP代碼,。設(shè)計目標(biāo)是增強(qiáng)復(fù)雜程序運(yùn)行時的性能和PHP自身代碼的模塊性。經(jīng)過不懈努力Zend引擎研發(fā)成功并且實(shí)現(xiàn)了設(shè)計目標(biāo),,并在1999年中期引入PHP,?;谠撘娌⒔Y(jié)合了更多新功能的PHP4于2000年5月正式發(fā)布。除了更高的性能以外,,PHP4還包含一些關(guān)鍵功能,,比如:支持更多的web服務(wù)器、HTTP Sessions支持,、輸出緩沖,、更安全的用戶輸入和一些新的語言結(jié)構(gòu)。
PHP5于2004年7月正式發(fā)布,,它的核心是Zend引擎2代(PHP7是Zend加強(qiáng)版3代),,引入了新的對象模型和大量新功能,開始支持面向?qū)ο缶幊?。隨著PHP6經(jīng)歷長時間的開發(fā)流產(chǎn)后,,PHP5發(fā)布了6個版本頑強(qiáng)的支撐著開源社區(qū)的發(fā)展,直到2015-12-03那天迎來了PHP 7.0的發(fā)布,,其實(shí)PHP5.6已經(jīng)包含了很多PHP6想實(shí)現(xiàn)的特性,,它為PHP7的研發(fā)爭取了寶貴的時間。不負(fù)眾望PHP7.0對比PHP5.6性能整整提升了2倍,,PHP7的成功發(fā)布讓很多核心開發(fā)成員回歸到PHP社區(qū),,并且在2020-11-26發(fā)布了PHP8。和php7系列相對比,,PHP8對各種變量判斷和運(yùn)算采用更嚴(yán)格的驗(yàn)證判斷模式,,這點(diǎn)有利后續(xù)版本對jit的性能優(yōu)化。
PHP語言作為一種高級語言,,其特點(diǎn)是開源,,在設(shè)計體系上屬于C語言體系,它可以讓很多接受過高等教育的初學(xué)者能很快接受并完成入門學(xué)習(xí),,簡單好上手容易找工作自然粉絲多,。如果數(shù)據(jù)量大及訪問壓力大,可以集成redis,、mysql分表分區(qū)分庫,、elasticsearch搜索引擎、消息隊(duì)列寫保護(hù)和php系統(tǒng)分布式集群部署等技術(shù)方案,,緩解數(shù)據(jù)存儲,、服務(wù)訪問和數(shù)據(jù)檢索帶來的巨大壓力。
無論是大中小型項(xiàng)目,,PHP都是一個十分適合的高級編程語言,,是否適合就看項(xiàng)目研發(fā)團(tuán)隊(duì)的對它的掌握程度。但是對于較大的和更為復(fù)雜的項(xiàng)目,最常見的php-fpm編程模式就顯出它的薄弱了,。針對PHP-fpm暴露出的一系列缺點(diǎn)問題,,最簡單靠譜的方案就是及時升級兼容PHP的高版本,PHP7.0.0對比PHP5.6性能提升了2倍,,另外PHP7.4提供的Preloading預(yù)加載機(jī)制實(shí)現(xiàn)了部分程序常駐內(nèi)存,,獲取了不錯的性能提升,在PHP8又提供了高效的JIT(Just-In-Time即時編譯)運(yùn)算支持,。另外水平更高的開發(fā)者可以轉(zhuǎn)向難度更高的php-cli編程,,它能解決大部分的系統(tǒng)性能問題,無論是PHP7和PHP8都支持這種模式的編程,。
經(jīng)過二十多年的發(fā)展,,隨著php-cli相關(guān)組件的快速發(fā)展和完善,PHP已經(jīng)可以應(yīng)用在TCP/UDP服務(wù),、高性能Web,、WebSocket服務(wù)、物聯(lián)網(wǎng),、實(shí)時通訊,、游戲、微服務(wù)等非Web領(lǐng)域的系統(tǒng)研發(fā),。
根據(jù)W3Techs2019年12月6號發(fā)布的統(tǒng)計數(shù)據(jù),,PHP在WEB網(wǎng)站服務(wù)器端使用的編程語言所占份額高達(dá)78.9%。在內(nèi)容管理系統(tǒng)的網(wǎng)站中,,有58.7%的網(wǎng)站使用WordPress(PHP開發(fā)的CMS系統(tǒng)),這占所有網(wǎng)站的25.0%,。
PHP常見的運(yùn)行模式有2種,,分別是php-fpm和php-cli。當(dāng)PHP選擇運(yùn)行在php-fpm模式下,,所有的變量都是頁面級的,,無論是全局變量還是類的靜態(tài)成員,都會在頁面執(zhí)行完畢后被清空,。運(yùn)行在php-cli模式下可以實(shí)現(xiàn)程序常駐內(nèi)存,,各種變量和數(shù)據(jù)庫連接都能長久保存在內(nèi)存實(shí)現(xiàn)資源復(fù)用,性能可以得到很大的提升,,php-cli雖然開發(fā)比較復(fù)雜,,但是能夠獲取更高的性能,對開發(fā)者的要求比較高需要比較高的開發(fā)水平,,比較常用的模式是結(jié)合swoole組件編寫cli框架,,各種變量能保存在跨進(jìn)程的高性能共享內(nèi)存Table,可以開發(fā)出支持熱啟動的php-cli可靠各類應(yīng)用系統(tǒng)。
php-fpm在PHP 5.3.3版本成為了官方正式組件(2010-07-22),,它提供了穩(wěn)定可靠的進(jìn)程管理服務(wù),,進(jìn)程不足時候可以智能擴(kuò)充數(shù)量,閑置時候可以自動回收銷毀多余的進(jìn)程,,同時它對程序的容錯能力很強(qiáng)大運(yùn)行非常穩(wěn)定,,可以應(yīng)付企業(yè)級的開發(fā)需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互聯(lián)網(wǎng)協(xié)議下進(jìn)行的用戶的輸入輸出,,頁面級生命周期各種資源用完即釋放,,不存在內(nèi)存泄漏的問題。php-fpm也提供有一些常駐內(nèi)存的技術(shù)支持,例如PHP 7.4引入的opcache.preload也能實(shí)現(xiàn)局部的PHP類和函數(shù)的常駐內(nèi)存,,不過這個方法不夠靈活,,和服務(wù)器配置捆綁的太死了。
php-cli因?yàn)槟軐?shí)現(xiàn)各類資源的常駐內(nèi)存,,所以可以資源復(fù)用,,更高效完成多進(jìn)程編程和異步編程,可以開發(fā)出負(fù)載能力更高的應(yīng)用系統(tǒng),。但是相對php-fpm的簡單編程開發(fā),,開發(fā)者要注意很多的事項(xiàng)和需要做很多附加的控制器開發(fā),否則就無法實(shí)現(xiàn)期待中的高性能,。
首先開發(fā)者需要去實(shí)現(xiàn)可靠的進(jìn)程管理服務(wù),,保證系統(tǒng)進(jìn)程遇到各類錯誤退出運(yùn)行后能夠自動創(chuàng)建新的進(jìn)程,只有這樣才能保證后續(xù)的服務(wù)請求有足夠空閑進(jìn)程可分配,。每個業(yè)務(wù)代碼段都要做異常處理,,讓進(jìn)程遇到非致命錯誤時候不會退出,因?yàn)檫M(jìn)程重啟意味程序和各類資源需要再次加載,,這個過程性能消耗不小,,所以只有進(jìn)程穩(wěn)定運(yùn)行了常駐內(nèi)存才有意義。
其次因?yàn)槌qv內(nèi)存,編寫的新的程序必須重啟服務(wù)才能生效,,這一點(diǎn)習(xí)慣了fpm模式的開發(fā)者會感到比較陌生,。另外開發(fā)者需要手工釋放內(nèi)存,否則系統(tǒng)長時間運(yùn)行后會出現(xiàn)內(nèi)存泄露,。同時在cli模式下,,我們不能像fpm里直接用$_SERVER、$_POST,、$_GET,、$_COOKI和$_FILES進(jìn)行編程工作,需要自己去解析各種互聯(lián)網(wǎng)通訊協(xié)議完成用戶的輸入輸出,。要實(shí)現(xiàn)多進(jìn)程編程利用多核CPU計算,還有學(xué)習(xí)使用pcntl和posix編程,,這里涉及到了異步編程邏輯,,這塊難度還是比較大的。比較常用的模式是結(jié)合swoole組件編寫cli框架,。
PHP是一個活躍的社區(qū)開發(fā)語言,,有專業(yè)的核心開發(fā)團(tuán)隊(duì)在持續(xù)不斷的迭代,最近一個版本就是PHP 8.0.8引入了很多的新特性,。
(一)WordPress內(nèi)容管理系統(tǒng)(CMS)
功能強(qiáng)大,、擴(kuò)展性強(qiáng),易于擴(kuò)充功能,;搭建的博客對seo搜索引擎友好,,收錄快排名靠前;網(wǎng)站上主題多,,各色各樣應(yīng)有盡有,;有強(qiáng)大的社區(qū)支持,有上千萬的開發(fā)者貢獻(xiàn)和審查,。
(二)Hyperf
Hyperf是一個基于Swoole高性能,、高靈活性的漸進(jìn)式PHP協(xié)程框架,內(nèi)置協(xié)程服務(wù)器及大量常用的組件,,性能較傳統(tǒng)基于PHP-FPM的框架有質(zhì)的提升,,提供超高性能的同時,也保持著極其靈活的可擴(kuò)展性,,標(biāo)準(zhǔn)組件均基于PSR標(biāo)準(zhǔn)實(shí)現(xiàn),,基于強(qiáng)大的依賴注入設(shè)計,保證了絕大部分組件或類都是可替換與可復(fù)用的,。
(三)ThinkPHP
ThinkPHP是一個快速,、兼容而且簡單的輕量級國產(chǎn)PHP開發(fā)框架,最早誕生于2006年初,,遵循Apache2開源協(xié)議發(fā)布,。秉承簡潔實(shí)用、出色的性能和至簡的代碼,、注重易用性。并且擁有眾多原創(chuàng)功能和特性,,在社區(qū)團(tuán)隊(duì)的積極參與下,,在易用性、擴(kuò)展性和性能方面不斷優(yōu)化和改進(jìn),。
(四)Drupal
Drupal誕生于2000年,,是一個基于PHP語言編寫的開發(fā)型CMF(內(nèi)容管理框架),即:CMS+framework,。Drupal的架構(gòu)由三大部分組成:內(nèi)核,、模塊,、主題。三者通過Hook機(jī)制緊密的聯(lián)系起來,??勺杂膳渲茫苤С謴膫€人博客到大型社區(qū)驅(qū)動的網(wǎng)站等各種不同應(yīng)用的網(wǎng)站項(xiàng)目,。
(五)easyswoole
EasySwoole是一款常駐內(nèi)存型的國產(chǎn)分布式swoole框架,,支持同時混合監(jiān)聽HTTP、WebSocket,、自定義TCP,、UDP協(xié)議,且擁有豐富的組件,,例如協(xié)程連接池,、協(xié)程Kafka客戶端、協(xié)程ElasticSearch客戶端,、,、協(xié)程Redis客戶端、協(xié)程自定義隊(duì)列,、協(xié)程Memcached客戶端,、協(xié)程HTTP客戶端、Crontab定時器等,。
(六)Laravel
Laravel是一套簡潔,、優(yōu)雅的PHP Web開發(fā)框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來,;它可以幫你構(gòu)建一個不錯的網(wǎng)絡(luò)APP,,而且每行代碼都可以簡潔、富于表達(dá)力,。
(七)CakePHP
CakePHP設(shè)計層面很優(yōu)雅,,沒有自帶多余的library,所有的功能都是純粹的框架,,執(zhí)行效率還不錯,。
(八)imi
它可以運(yùn)行在PHP-FPM、Swoole,、Workerman多種容器環(huán)境下
PHP有很多標(biāo)準(zhǔn)的函數(shù)和結(jié)構(gòu),。還有一些函數(shù)需要和特定的擴(kuò)展模塊一起編譯,否則在使用它們的時候就會得到一個致命的“未定義函數(shù)”錯誤,。例如,,要使用image函數(shù)中的imagecreatetruecolor(),需要在編譯PHP的時候加上GD的支持,?;蛘咭褂胢ysqli_connect()函數(shù),,就需要在編譯PHP的時候加上MySQLi支持。有很多核心函數(shù)已包含在每個版本的PHP中如字符串和變量函數(shù),。調(diào)用phpinfo()或者get_loaded_extensions()可以得知PHP加載了那些擴(kuò)展庫,。同時還應(yīng)該注意,很多擴(kuò)展庫默認(rèn)就是有效的,。
在PHP編程里需要注意用戶的輸入安全,,對用戶各個方面的輸入都要做好相關(guān)的過濾處理,內(nèi)置函數(shù)里提供了不少的安全相關(guān)的函數(shù),,編程學(xué)習(xí)者需要重點(diǎn)掌握以下的7個重點(diǎn)函數(shù)如下表格:
用戶輸入安全的7個內(nèi)置函數(shù)
函數(shù)名稱 用途簡介
htmlentities 將字符轉(zhuǎn)換為 HTML 轉(zhuǎn)義字符
htmlspecialchars_decode 將特殊的 HTML 實(shí)體轉(zhuǎn)換回普通字符
htmlspecialchars 將特殊字符轉(zhuǎn)換為 HTML 實(shí)體
nl2br 在字符串所有新行之前插入 HTML 換行標(biāo)記
str_replace 子字符串替換
strip_tags 從字符串中去除 HTML 和 PHP 標(biāo)記
stripslashes 反引用一個引用字符串
對于全部腳本而言,,PHP提供了大量的預(yù)定義變量。這些變量將所有的外部變量表示成內(nèi)建環(huán)境變量,,并且將錯誤信息表示成返回頭,。在PHP的編程里我們經(jīng)常需要用到以下幾個系統(tǒng)變量,編程學(xué)習(xí)者需要重點(diǎn)掌握的7個預(yù)定義變量如下表格:
重點(diǎn)需要掌握的7大預(yù)定義變量
變量名稱 變量用途說明
$GLOBALS 引用全局作用域中可用的全部變量
$_SERVER 服務(wù)器和執(zhí)行環(huán)境信息
$_GET HTTP GET 變量(用戶輸入之一)
$_POST HTTP POST 變量(用戶輸入之一)
$_FILES HTTP 文件上傳變量
$_SESSION Session 變量(用戶會話)
$_COOKIE HTTP Cookies(用戶會話標(biāo)識)
PHP支持10種原始數(shù)據(jù)類型,。四種標(biāo)量類型:bool(布爾型),、int(整型)、float(浮點(diǎn)型,,也稱作double)和string(字符串),;四種復(fù)合類型:array(數(shù)組)、object(對象),、callable(可調(diào)用)和iterable(可迭代),;最后是兩種特殊類型:resource(資源)和NULL(無類型)。
運(yùn)算符是可以通過給出的一或多個值(用編程行話來說,,表達(dá)式)來產(chǎn)生另一個值(因而整個結(jié)構(gòu)成為一個表達(dá)式)的東西,。PHP的運(yùn)算符包含:運(yùn)算符優(yōu)先級、算術(shù)運(yùn)算符,、賦值運(yùn)算符,、位運(yùn)算符、比較運(yùn)算符,、錯誤控制運(yùn)算符,、執(zhí)行運(yùn)算符、遞增/遞減運(yùn)算符,、邏輯運(yùn)算符,、字符串運(yùn)算符、數(shù)組運(yùn)算符和類型運(yùn)算符,。
任何PHP腳本都是由一系列語句構(gòu)成的,,一條語句可以是一個賦值語句,、一個函數(shù)調(diào)用,、一個循環(huán),、一個條件語句或者甚至是一個什么也不做的語句(空語句)。語句通常以分號結(jié)束,,此外還可以用花括號將一組語句封裝成一個語句組,,語句組本身可以當(dāng)作是一行語句。
每個類的定義都以關(guān)鍵字class開頭,,后面跟著類名,,后面跟著一對花括號,里面包含有類的屬性與方法的定義,。類名可以是任何非PHP保留字的合法標(biāo)簽,。一個合法類名以字母或下劃線開頭,后面跟著若干字母,,數(shù)字或下劃線,。以正則表達(dá)式表示為:^[a-zA-Z_
PHP是一個受眾大并且擁有眾多開發(fā)者的開源軟件項(xiàng)目,Linux+Nginx+Mysql+PHP是它的經(jīng)典安裝部署方式,,相關(guān)的軟件全部都是開源免費(fèi)的,,所以使用PHP可以節(jié)約大量的正版授權(quán)費(fèi)用。不過PHP作為一個開源軟件,,它缺乏大型科技公司的支持背景,,網(wǎng)絡(luò)上對它的唱衰也是經(jīng)久不衰,不過它的持續(xù)迭代和性能持續(xù)增強(qiáng)的現(xiàn)實(shí)卻是鼓舞人心的,,PHP社區(qū)用實(shí)際行動給予各種質(zhì)疑強(qiáng)有力的回?fù)簟?/p>
PHP的內(nèi)核是C語言編寫的基礎(chǔ)好效率高,,可以用C語言開發(fā)高性能的擴(kuò)展組件;PHP的核心包含了數(shù)量超過1000的內(nèi)置函數(shù),功能應(yīng)有盡有很全面,,開箱即用程序代碼簡潔,;PHP數(shù)組支持動態(tài)擴(kuò)容,支持以數(shù)字,、字符串或者混合鍵名的關(guān)聯(lián)數(shù)組,,能大幅提高開發(fā)效率;PHP是一門弱類型語言,,程序編譯通過率高,,相對其他強(qiáng)類型語言開發(fā)效率快;PHP天然熱部署,,在php-fpm運(yùn)行模式下代碼文件覆蓋即完成熱部署,;PHP經(jīng)過20多年的發(fā)展,在互聯(lián)網(wǎng)上可以搜到海量的參考資料供參考學(xué)習(xí),。
PHP版本越高它的整體性能越高,,根據(jù)官方介紹,PHP7.0.0對比PHP5.6性能就提升了2倍,,PHP7.4已經(jīng)比PHP7.0快了約30%,,PHP8.0在性能上又相對PHP7.4大約改進(jìn)了10%,。PHP 8.0引入了JIT編譯器特性,同時加入多種新的語言功能,,例如命名參數(shù),、聯(lián)合類型、注解,、Constructor Property Promotion,、match表達(dá)式、nullsafe運(yùn)算符以及對類型系統(tǒng),、錯誤處理和一致性的改進(jìn),。PHP擁有自己的核心開發(fā)團(tuán)隊(duì),保持5年發(fā)布一個大版本,、1個月發(fā)布2個小版本的頻率,,最新的版本是PHP8.08。PHP 7.0.0發(fā)布于2015-12-03,,此版本下最新版本是PHP 7.4.21發(fā)布日期:2021-07-01),,PHP 8.0.0發(fā)布于2020-11-26,此版本下最新版本是PHP 8.0.8(發(fā)布日期:2021-07-01)。
每個平臺都有對應(yīng)的php解釋器版本,,指針對不同平臺均編譯出目標(biāo)平臺的二進(jìn)制碼(PHP解釋器),,php開發(fā)的程序可以不經(jīng)修改運(yùn)行在windows、linux,、unix等多個操作系統(tǒng)上,。
php-cli模式下可以實(shí)現(xiàn)程序常駐內(nèi)存,各種變量和數(shù)據(jù)庫連接都能長久保存在內(nèi)存實(shí)現(xiàn)資源復(fù)用,,比較常用的做法是結(jié)合swoole組件編寫cli框架,。
在php-fpm模式下,所有的變量都是頁面級的,,無論是全局變量還是類的靜態(tài)成員,,都會在頁面執(zhí)行完畢后被清空,對程序員水平要求低,,占用內(nèi)存非常少,,特別適合中小型系統(tǒng)的開發(fā)。