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