php框架性能測(cè)試您了解PHP嗎?的一件事情就是生態(tài)系統(tǒng)一如戰(zhàn)爭(zhēng)框架龍甲性能
2023-01-19
LAMP 堆棧有了新的競(jìng)爭(zhēng),但此版本中的功能再次將 PHP 推向了極限。
2012 年 4 月發(fā)布
大約八年前,我為 寫(xiě)了一篇名為“你知道 PHP 嗎?”的文章。 在那篇文章中,我談到了 PHP 對(duì)“Web 問(wèn)題”的頑固的功能優(yōu)于形式的解決方案及其使事情變得簡(jiǎn)單的能力。 當(dāng)時(shí),我們即將發(fā)布 PHP 5.0。 現(xiàn)在,在將近十年之后,我們有了全新的 PHP 5.4.0 版本,雖然在此期間發(fā)生了很多事情,但很多事情根本沒(méi)有改變。
沒(méi)有改變的一件事是生態(tài)系統(tǒng)一如既往地重要。 解決 web 問(wèn)題不僅僅是腳本語(yǔ)言的選擇,而是圍繞它的整個(gè)生態(tài)系統(tǒng)。 現(xiàn)在將近 15 年了,LAMP 架構(gòu)仍然很流行,但我們開(kāi)始注意到其他強(qiáng)大的選項(xiàng)。 隨附的 PHP-FPM 迅速流行起來(lái),因?yàn)樽?PHP 5.3 以來(lái)支持得到了極大改進(jìn),并在 5.4 中進(jìn)一步簡(jiǎn)化。 系統(tǒng)的 M(即數(shù)據(jù)庫(kù))部分也開(kāi)始看起來(lái)與 8 年前大不相同。 各種解決方案提供了更豐富的選擇,而不僅僅是將所有內(nèi)容都放入表格中。
那里有許多有趣的技術(shù),因此我們編寫(xiě)了 PHP 擴(kuò)展來(lái)輕松訪(fǎng)問(wèn)它們。 我最喜歡的擴(kuò)展之一是您可以使用它在 PHP 中編寫(xiě)事件驅(qū)動(dòng)的高性能應(yīng)用程序。 另一個(gè)是,這是一個(gè)高級(jí)套接字庫(kù)。 就像不需要編寫(xiě)另一種原始文件格式和相關(guān)的解析器一樣,也沒(méi)有任何理由使用套接字協(xié)議和相關(guān)的套接字處理代碼。 您甚至可以組合并獲得一個(gè)獨(dú)立的、高性能的、事件驅(qū)動(dòng)的高級(jí)服務(wù)器。 (如果您有興趣,請(qǐng)參閱此示例。)我也非常喜歡 SVM(支持向量機(jī))機(jī)器學(xué)習(xí)算法,您不必成為機(jī)器學(xué)習(xí)迷也可以問(wèn)很多問(wèn)題。
還有許多擴(kuò)展在最近幾年獲得了廣泛的認(rèn)可。 特別是流行起來(lái)php框架性能測(cè)試,逐漸成為用戶(hù)部署的通用架構(gòu)的一部分。 您可以分派作業(yè),以便它們由工作人員異步完成。 可以分布在多個(gè)服務(wù)器上,甚至可以進(jìn)一步分派到更多類(lèi)型的工作中。
2004 年發(fā)布 PHP 5.0,2005 年發(fā)布 5.1,增加了實(shí)現(xiàn)、PDO 和性能改進(jìn)。 PHP 5.2 于 2006 年發(fā)布,引入了改進(jìn)的內(nèi)存管理器、JSON 支持和輸入過(guò)濾。 當(dāng)時(shí),我們著手推動(dòng) PHP 6,這是一個(gè)非常雄心勃勃的計(jì)劃,要徹底重寫(xiě) ICU(國(guó)際化組件)庫(kù)的所有內(nèi)容。 事實(shí)證明,這個(gè)計(jì)劃很倉(cāng)促——我們無(wú)法讓足夠多的開(kāi)發(fā)人員對(duì)此感到興奮,最終將 PHP 6 中將要引入的各種特性添加到 2009 年發(fā)布的 PHP 5.3 5.2 和 5.3 版本中相隔 3 年,這也意味著 5.3 為 PHP 增加了很多內(nèi)容:命名空間、后期靜態(tài)綁定、閉包、垃圾收集、受限的 goto、(本機(jī)驅(qū)動(dòng)程序)、更好的性能等等。
事后看來(lái),將此版本稱(chēng)為 PHP 6 可能有些道理php框架性能測(cè)試,但 PHP 6 等同于編寫(xiě)有關(guān)它的書(shū)籍的努力,因此我們認(rèn)為如果不對(duì) PHP 6 進(jìn)行重大改進(jìn),則無(wú)法發(fā)布。 我們引入了一個(gè)名為“intl”的 ICU 擴(kuò)展,它也是針對(duì) PHP 5.2 編譯的,它使您可以訪(fǎng)問(wèn)更多 ICU 功能。 隨著時(shí)間的推移,擴(kuò)展不斷改進(jìn),這意味著幾乎所有與 相關(guān)的問(wèn)題都有解決方案,只是沒(méi)有明確地集成到語(yǔ)言本身。
這導(dǎo)致了 2012 年 PHP 5.4 的推出。此外,自上次發(fā)布以來(lái)已經(jīng)過(guò)去了將近 3 年,在此期間我們進(jìn)行了一些改進(jìn)。 我寧愿恢復(fù)到每年一個(gè)版本,每個(gè)版本包含更少的新功能。
以下是升級(jí)到 5.4 后您將看到的主要功能:
內(nèi)存和性能改進(jìn)
許多內(nèi)部結(jié)構(gòu)已變得更小或完全消失,從而在大型 PHP 應(yīng)用程序中節(jié)省了 20-50% 的內(nèi)存。 通過(guò)各種優(yōu)化將性能提高 10-30%(主要取決于代碼在做什么)網(wǎng)站模板,包括內(nèi)聯(lián)各種通用代碼路徑、將 $ 添加到 JIT、使“@”運(yùn)算符更快、添加運(yùn)行時(shí)類(lèi)/函數(shù)/常量緩存,運(yùn)行時(shí)字符串常量現(xiàn)在被保留,通過(guò)預(yù)先計(jì)算的散列更快地訪(fǎng)問(wèn)常量,空數(shù)組更快并且使用更少的內(nèi)存,()和請(qǐng)求處理得更快,以及整個(gè)代碼中更多的內(nèi)存和性能調(diào)整。
例如,一些早期測(cè)試表明,Zend 在 5.4 中運(yùn)行速度提高了 21%,內(nèi)存使用量減少了 23%,而內(nèi)存使用量減少了 50%,運(yùn)行速度提高了大約 7%。
可能是 PHP 5.4 中最受關(guān)注的功能 — 將它們視為編譯器輔助的復(fù)制粘貼。 這也是 . 其他語(yǔ)言可能稱(chēng)它們?yōu)椤啊薄蛘吣切┱Z(yǔ)言根本不給它們命名,而是有一個(gè)擴(kuò)展的接口機(jī)制,允許一個(gè)接口包含其方法的實(shí)際實(shí)現(xiàn)。
相比之下,PHP 包含針對(duì)同一方法的多個(gè)實(shí)現(xiàn)的顯式?jīng)_突解決機(jī)制。
{
() { ... }
}
一種 {
利用;
//...
}
乙{
利用;
//...
}
// 現(xiàn)在兩者都適用
一種::();
B::();
請(qǐng)參閱/獲取更多示例,包括沖突解決語(yǔ)法、方法優(yōu)先級(jí)、可見(jiàn)性以及對(duì)常量和屬性的支持。 此外,要了解有關(guān)概念理論的更多信息,您可以閱讀 Sch?rli 的論文“:行為構(gòu)建塊中的復(fù)合類(lèi)”。
緊湊數(shù)組語(yǔ)法
添加了一個(gè)簡(jiǎn)單但非常流行的語(yǔ)法:
$a = [1, 2, 3];
$b = ['foo' => '', 'bar' => ''];
也就是說(shuō)網(wǎng)站模板,您現(xiàn)在不再需要使用“”關(guān)鍵字來(lái)定義數(shù)組。
函數(shù)數(shù)組取消引用
添加了另一個(gè)通用語(yǔ)法。 返回?cái)?shù)組的函數(shù)調(diào)用現(xiàn)在可以直接取消引用:
() {
['', '', ''];
}
回聲()[0]; // :
實(shí)例方法調(diào)用
與函數(shù)數(shù)組取消引用相關(guān),您現(xiàn)在可以調(diào)用對(duì)象實(shí)例化方法。 與早期版本一樣,您當(dāng)然仍然可以鏈接方法調(diào)用,因此您現(xiàn)在可以編寫(xiě)如下代碼:
富 {
$x = 1;
getX() {
$這個(gè)->x;
}
setX($val) {
$this->x = $val;
$這個(gè);
}
}
$X = (new foo)->setX(20)->getX();
回聲 $X; // 20
但是,除非您的構(gòu)造函數(shù)執(zhí)行有用的操作,否則您應(yīng)該在此處使用靜態(tài)方法調(diào)用,因?yàn)榭赡軙?huì)丟棄實(shí)例化對(duì)象。 如果我們將其與緊湊的數(shù)組語(yǔ)法和函數(shù)數(shù)組解引用結(jié)合起來(lái),我們可以編寫(xiě)一些非常復(fù)雜的代碼:
富 {
($arr) {
::($arr);
}
}
echo (new foo( [1, [4, 5], 3] ))[1][0];
看了之后,你能說(shuō)出輸出是什么嗎? 在這里,我們將一個(gè)二維數(shù)組傳遞給一個(gè)只返回?cái)?shù)組的構(gòu)造函數(shù)。 然后,我們選擇第二個(gè)維度的第一個(gè)元素,所以這將輸出“4”。
閉包綁定
閉包是在 PHP 5.3 中引入的,但在 5.4 中我們改進(jìn)了閉包與對(duì)象交互的方式。 例如:
富{
$道具;
($prop) {
$this->prop = $prop;
}
() {
() { echo ($this->prop); };
}
}
$a = new Foo('酒吧');;
$func = $a->();
$函數(shù)(); // : 酒吧
請(qǐng)注意,閉包訪(fǎng)問(wèn)私有屬性 $this->prop。 默認(rèn)情況下,PHP 中的閉包使用預(yù)綁定——這意味著閉包內(nèi)的變量具有定義閉包時(shí)的值。 這可以使用引用轉(zhuǎn)換為反向綁定。 但是,也可以重新綁定閉包:
$a = new Foo('酒吧');
$b = new Foo('');
$func = $a->();
$函數(shù)(); // : 酒吧
$func = $func->($b);
$函數(shù)(); // :
在這里,我們將閉包從 $a 實(shí)例重新綁定到 $b 中的實(shí)例。 如果你不想讓閉包在任何時(shí)候訪(fǎng)問(wèn)對(duì)象實(shí)例,你可以將閉包聲明為靜態(tài)的:
富{
$道具;
($prop) {
$this->prop = $prop;
}
() {
() { echo ($this->prop); };
}
}
$a = new Foo('酒吧');;
$func = $a->();
$函數(shù)(); // : $this 不在的時(shí)候
作為函數(shù)的對(duì)象
有一種名為“”的新魔術(shù)方法,其用法如下:
{
$;
($價(jià)值) {
$this->= $val;
}
() {
('$%.2f', $this->);
}
}
$ = 新的 (11.02/5*13);
回聲 $(); // : 28.65 美元
內(nèi)置網(wǎng)絡(luò)服務(wù)器 (CLI)
CLI 服務(wù)器是一個(gè)小型 Web 服務(wù)器實(shí)現(xiàn),可以從命令行運(yùn)行:
%php -S :8000
2012 年 3 月 11 日星期日 13:27:09 的 PHP 5.4.0
在:8080
根目錄是/home/
Ctrl-C 退出。
CLI 服務(wù)器不適合用作生產(chǎn) Web 服務(wù)器; 我們將使用它來(lái)運(yùn)行一些 PHP 回歸測(cè)試,其他單元測(cè)試機(jī)制可以使用它,IDE 也可以使用它。 它確實(shí)具有一些有用的功能,可用于從命令行進(jìn)行日常代碼調(diào)試。 默認(rèn)情況下,它使用當(dāng)前目錄作為; 它還處理靜態(tài)文件請(qǐng)求。 默認(rèn)的目錄索引文件是“.php”,所以你可以在充滿(mǎn).php、.css、.jpg等的目錄中激活它,它會(huì)自動(dòng)運(yùn)行。 對(duì)于可能使用發(fā)送所有請(qǐng)求的前端控制器或路由器的更復(fù)雜的應(yīng)用程序,您可以使用簡(jiǎn)單的小腳本包裝此路由器并啟動(dòng) CLI 服務(wù)器,如下所示:
% php -S :8080 /路徑/到/.php
2012 年 3 月 11 日星期日 13:28:01 的 PHP 5.4.0
在:8080
根目錄是 /tmp/web
Ctrl-C 退出。
.php 腳本可能如下所示: