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