成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【天贏金創(chuàng)】PHP7與Swoole

MingjunYang / 2107人閱讀

摘要:但在密集計(jì)算方面比等靜態(tài)編譯語(yǔ)言差幾十倍甚至上百倍。一使用棧內(nèi)存在引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)的變量,底層就是一個(gè)指針。代碼中創(chuàng)建的變量也進(jìn)行了優(yōu)化,直接在棧內(nèi)存上預(yù)分配。應(yīng)用層與底層在錯(cuò)誤拋出的方式全部統(tǒng)一為異常。

原文:http://rango.swoole.com/archives/440
最近PHP官方終于發(fā)布了傳說(shuō)中的PHP7,雖然只是alpha版。PHP7號(hào)稱是新一代的PHP,官方開(kāi)發(fā)組對(duì)Zend引擎底層做了大量修改來(lái)優(yōu)化PHP的性能。可以說(shuō)PHP7這個(gè)版本的主題就是性能優(yōu)化。

在過(guò)去PHP一直以開(kāi)發(fā)效率快著稱,而語(yǔ)言本身的性能較差(當(dāng)然比Python,Ruby還是要快一些的)。普通的Web網(wǎng)站都是IO密集型的程序,瓶頸在MySQL上,所以體現(xiàn)不出PHP的性能劣勢(shì)。但在密集計(jì)算方面比C/C++、Java等靜態(tài)編譯語(yǔ)言差幾十倍甚至上百倍。另外使用設(shè)計(jì)非常復(fù)雜的開(kāi)發(fā)框架,如Symfony、Laravel等,程序性能也會(huì)明顯下降。

現(xiàn)在隨著PHP越來(lái)越流行,像Facebook、新浪微博這樣超大型規(guī)模的網(wǎng)站都在使用PHP。PHP語(yǔ)言性能問(wèn)題就越來(lái)越嚴(yán)重了。Facebook有幾十萬(wàn)臺(tái)服務(wù)器,如果現(xiàn)有的PHP程序可以提升一部分性能,將會(huì)節(jié)約大量的服務(wù)器資源。所以就有了HHVM、Hack。Hack為PHP增加了類型,HHVM是一個(gè)重新設(shè)計(jì)的PHP引擎,實(shí)際項(xiàng)目中使用HHVM可以提近70%的性能。實(shí)際項(xiàng)目70%性能提升這是一個(gè)什么概念?騰訊QQ農(nóng)場(chǎng)最初使用PHP開(kāi)發(fā),后因?yàn)樾阅軉?wèn)題使用C語(yǔ)言重構(gòu),完成后性能提升了100%。

PHP官方也注意到了這個(gè)問(wèn)題,所以就有了PHP7的開(kāi)發(fā)計(jì)劃。最新公布的PHP7-alpha在WordPress項(xiàng)目中測(cè)試的表現(xiàn)已經(jīng)超越了HHVM。未來(lái)PHP將會(huì)同時(shí)具備極高的開(kāi)發(fā)效率和極高的性能,再結(jié)合Swoole做異步編程,PHP勢(shì)必會(huì)更加流行。

本文簡(jiǎn)單介紹一下PHP7做了哪些優(yōu)化,可以提升如此多性能。

一 zval使用棧內(nèi)存
在Zend引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)PHP的變量,底層就是一個(gè)zval指針。之前的版本都是通過(guò)MAKE_STD_ZVAL動(dòng)態(tài)的從堆上分配一個(gè)zval內(nèi)存。而PHP7可以直接使用棧內(nèi)存。PHP代碼中創(chuàng)建的變量也進(jìn)行了優(yōu)化,PHP7直接在棧內(nèi)存上預(yù)分配zval。這樣節(jié)約了大量?jī)?nèi)存分配和內(nèi)存管理的操作。

PHP5

zval *val; MAKE_STD_ZVAL(val);
PHP7

zval val;
二 zend_string存儲(chǔ)hash值,array查詢不再需要重復(fù)計(jì)算hash
PHP7為字符串多帶帶創(chuàng)建了新類型叫做zend_string,除了char *指針和長(zhǎng)度之外,增加了一個(gè)hash字段,用于保存字符串的hash值。PHP中array是核心數(shù)據(jù)結(jié)構(gòu),PHP程序中往往都有大量的$array[$key]操作,雖然hashtable查找的時(shí)間復(fù)雜度是O(1),但$key要轉(zhuǎn)為hash值是要經(jīng)過(guò)計(jì)算的。不僅僅是array操作,實(shí)際上PHP底層對(duì)于類屬性、類方法、函數(shù),訪問(wèn)時(shí)都要先通過(guò)hashtable查找到對(duì)應(yīng)的指針,再執(zhí)行對(duì)應(yīng)的操作。PHP7之前Zend引擎會(huì)有大量的CPU時(shí)間用于計(jì)算hash值。

實(shí)際上PHP程序運(yùn)行起來(lái)之后,大部分情況下$key的值都是不變的。PHP7干脆將這個(gè)hash值保存起來(lái),下次直接使用,這樣就節(jié)省了大量的hash計(jì)算操作,PHP的hashtable與C數(shù)組的性能一致。

從實(shí)際項(xiàng)目進(jìn)行callgrind性能分析,會(huì)發(fā)現(xiàn)alloc和hash 2項(xiàng)操作就占用了相當(dāng)大比例的CPU時(shí)間。PHP7優(yōu)化之后這2項(xiàng)操作占用的CPU時(shí)間降低了非常多。(注:zend_hash仍然占12%,因?yàn)檎wCPU降低了,所以總的耗時(shí)降低了不少)

三 hashtable桶內(nèi)直接存數(shù)據(jù)
PHP5的hashtable每個(gè)元素都是一個(gè) Bucket *,而PHP7直接存Bucket,減少了內(nèi)存申請(qǐng)次數(shù),提升了Cache命中率和內(nèi)存訪問(wèn)速度。

四 zend_parse_parameters改為宏實(shí)現(xiàn)
PHP的C擴(kuò)展函數(shù)與PHP中的變量進(jìn)行參數(shù)輸入時(shí),要使用zend_parse_parameters()函數(shù),這個(gè)函數(shù)根據(jù)一個(gè)字符串參數(shù)找到對(duì)應(yīng)PHP的zval指針,然后進(jìn)行賦值。 這個(gè)函數(shù)實(shí)際上有一定的性能消耗。PHP7直接使用宏替換了zend_parse_parameters函數(shù),C擴(kuò)展中不再需要使用zend_parse_parameters進(jìn)行逐個(gè)參數(shù)的查找,宏展開(kāi)后自動(dòng)會(huì)實(shí)現(xiàn)參數(shù)賦值。僅此一項(xiàng)就提升了5%的性能。

五 新增加4種OPCODE
很多PHP程序中會(huì)大量使用call_user_function, is_int/string/array, strlen , defined 函數(shù)。PHP5 都是以擴(kuò)展函數(shù)的方式提供,PHP7中這4類函數(shù)改成ZendVM的OPCODE指令,執(zhí)行更快。

六 其他更多優(yōu)化
除了上面5個(gè)主要優(yōu)化點(diǎn)之外,PHP7還有其他更多的細(xì)節(jié)性能優(yōu)化。如基礎(chǔ)類型int、float、bool等改為直接進(jìn)行值拷貝,排序算法改進(jìn),PCRE with JIT,execute_data和opline使用全局寄存器等等。PHP7對(duì)性能的優(yōu)化會(huì)繼續(xù)進(jìn)行下去。

PHP7-alpha相比PHP5.6性能提升了近3倍。下面是WordPress在PHP7上的表現(xiàn):

PHP7的新特性
除了性能優(yōu)化外,PHP7新增加了2項(xiàng)重要的新特性。

變量類型
PHP7版本函數(shù)的參數(shù)和返回值增加了類型限定。為什么PHP要加入類型,實(shí)際上此項(xiàng)特性是為了PHP7.1版本的JIT特性做準(zhǔn)備,增加類型后PHP JIT可以準(zhǔn)確判斷變量類型,生成最佳的機(jī)器指令。

function test(int $a, string $b, array $c) : int {
//code
}

錯(cuò)誤異常
PHP程序出錯(cuò)后過(guò)去Zend引擎會(huì)發(fā)生致命錯(cuò)誤并終止程序運(yùn)行,PHP7可以使用try/catch捕獲錯(cuò)誤。底層使用Exeception代替了Fatal Error。這個(gè)特性表示PHP語(yǔ)言正在向一個(gè)更加規(guī)范的方向發(fā)展。應(yīng)用層與底層在錯(cuò)誤拋出的方式全部統(tǒng)一為異常。

try {
non_exists_func();
} catch (EngineException $e) {
echo "Exception: {$e->getMessage()} ";
}

匿名類
$test = new class("Hello World") {
public function __construct($greeting) {
$this->greeting = $greeting;
}
};
PHP7與JIT
最初PHP7性能優(yōu)化的方向并不是以上所講的,而是JIT。JIT是just in time的縮寫,表示運(yùn)行時(shí)將指令轉(zhuǎn)為二進(jìn)制機(jī)器碼。Java語(yǔ)言的JVM引擎底層就是使用JIT將Java字節(jié)碼編譯為二進(jìn)制機(jī)器碼執(zhí)行。PHP7開(kāi)發(fā)過(guò)程中有一個(gè)中間版本是基于JIT,后來(lái)開(kāi)發(fā)組發(fā)現(xiàn)使用JIT后,對(duì)于實(shí)際項(xiàng)目并沒(méi)有有太大的性能提升,所以PHP7最終放棄了JIT方案,PHP7.0-final版本不會(huì)攜帶JIT特性。

但如果是密集計(jì)算類程序就不同了,使用JIT將PHP OpCode編譯為機(jī)器碼,運(yùn)算的性能會(huì)大幅提升。PHP官方開(kāi)發(fā)組在2014年底重啟了JIT的開(kāi)發(fā)工作。

PHP的異步網(wǎng)絡(luò)通信擴(kuò)展Swoole
PHP在大部分程序員印象中都是用來(lái)做Web網(wǎng)站的。PHP沒(méi)有像Python的Twisted、Tornado,Java的Netty、Mina,JavaScript的Node.js等框架,無(wú)法實(shí)現(xiàn)異步網(wǎng)絡(luò)通信程序。PHP的Swoole擴(kuò)展就是為了彌補(bǔ)此項(xiàng)缺陷而誕生的開(kāi)源項(xiàng)目。Swoole是一個(gè)標(biāo)準(zhǔn)的PHP擴(kuò)展,為PHP提供了一系列異步IO、事件驅(qū)動(dòng)、并行數(shù)據(jù)結(jié)構(gòu)功能。

Swoole與Node.js非常相似,不同之處是Swoole在并行提供了底層支持。Node.js是一個(gè)單進(jìn)程單線程的程序,在多核服務(wù)器上無(wú)法發(fā)揮全部CPU核的計(jì)算能力。需要程序員自行使用child_process/cluster擴(kuò)展或者啟動(dòng)多實(shí)例,使程序能夠利用到多核優(yōu)勢(shì)。而Swoole在底層就支持了多線程/多進(jìn)程,程序啟動(dòng)后就會(huì)創(chuàng)建好多個(gè)IO線程和多個(gè)Worker進(jìn)程。程序員僅需配置線程/進(jìn)程數(shù)量即可。

使用Swoole開(kāi)發(fā)的TCP服務(wù)器程序:

$serv = new swoole_server("127.0.0.1", 9501);

$serv->on("connect", function ($serv, $fd){
echo "Client:Connect. ";
});

$serv->on("receive", function ($serv, $fd, $from_id, $data) {
$serv->send($fd, $data);
});

$serv->on("close", function ($serv, $fd) {
echo "Client: Close. ";
});

$serv->start();
Swoole同樣也內(nèi)置了http_server和WebSocket服務(wù)器的支持。swoole_http_server與傳統(tǒng)的php-fpm不同,它是在PHP內(nèi)進(jìn)行事件循環(huán)的,基于swoole_http_server完全可以開(kāi)發(fā)出類似Java應(yīng)用服務(wù)器一樣,可以控制完整對(duì)象生命周期的程序。swoole_http_server天然支持異步IO,可以很方便的實(shí)現(xiàn)支持大量TCP連接的Comet服務(wù)。swoole_websocket_server可以用來(lái)實(shí)現(xiàn)支持Web實(shí)時(shí)推送的程序。

使用Swoole的Web服務(wù)器程序:

$http = new swoole_http_server("0.0.0.0", 9501);

$http->on("request", function ($request, $response) {
$response->header("Content-Type", "text/html; charset=utf-8");
$response->end("

Hello Swoole. #".rand(1000, 9999)."


");
});

$http->start();
PHP的未來(lái)
可以預(yù)見(jiàn)PHP語(yǔ)言未來(lái)會(huì)在性能方面有明顯的提升,越來(lái)越接近C/C++、Java等靜態(tài)編譯語(yǔ)言。再加上Swoole擴(kuò)展,PHP的使用范圍可以擴(kuò)展到移動(dòng)通信、云計(jì)算、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)、車聯(lián)網(wǎng)、智能家居等領(lǐng)域。

PHP雖然未必是最好的編程語(yǔ)言,但PHP在向著這個(gè)方向在發(fā)展。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21137.html

相關(guān)文章

  • 天贏金創(chuàng)】算法復(fù)雜度分析

    摘要:示例代碼斐波那契數(shù)列復(fù)制代碼復(fù)制代碼這里,給定規(guī)模,計(jì)算所需的時(shí)間為計(jì)算的時(shí)間和計(jì)算的時(shí)間的和。示例代碼復(fù)制代碼復(fù)制代碼同樣是斐波那契數(shù)列,我們使用數(shù)組來(lái)存儲(chǔ)計(jì)算結(jié)果,這樣算法復(fù)雜度優(yōu)化為。算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為。 原文:http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html為什么要進(jìn)行算法分...

    NikoManiac 評(píng)論0 收藏0
  • Swoole 初探:環(huán)境搭建入門案例

    摘要:對(duì)于這一問(wèn)題企業(yè)一般多會(huì)采用其他技術(shù),比如使用或者其他語(yǔ)言。但是有了之后,由于底層全是用語(yǔ)言實(shí)現(xiàn),其出色的性能深受追捧。由于以前適用場(chǎng)景的局限性比較大,所以會(huì)有說(shuō)重新定義了的說(shuō)法。到這里的環(huán)境已經(jīng)搭建完成了。 Swoole 是一個(gè) php 的擴(kuò)展,它的核心目標(biāo)就是解決 php 在實(shí)現(xiàn)一些高訪問(wèn) server 服務(wù)中可能遇到的一系列問(wèn)題,這些問(wèn)題用原生的 php 往往并不能很方便高效的解...

    toddmark 評(píng)論0 收藏0
  • Swoole入門到實(shí)戰(zhàn)(一):PHP7&Swoole源碼安裝、玩轉(zhuǎn)網(wǎng)絡(luò)通信引擎、異步非堵塞I

    摘要:服務(wù)重點(diǎn)基本概述協(xié)議是基于的一種新的網(wǎng)絡(luò)協(xié)議。被調(diào)用者通過(guò)狀態(tài)通知機(jī)制等來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)來(lái)處理結(jié)果阻塞和非阻塞關(guān)注的是調(diào)用者等待被調(diào)用者返回調(diào)用結(jié)果時(shí)的狀態(tài)。 一、PHP7源碼安裝和Swoole源碼編譯安裝 1.1 PHP7源碼安裝 1.1.1 獲取源碼與安裝 ????獲取PHP7源碼:www.php.net tar -xzvf ... # 解壓命令 ./configur...

    weakish 評(píng)論0 收藏0
  • swoole安裝全紀(jì)錄

    摘要:的為提供了版本,軟件源安裝的默認(rèn)以的狀態(tài)運(yùn)行在,比使用以的方式性能更好。 Ond?ej Sury 的 PHP PPA 為 Ubuntu 16.04/14.04 提供了 PHP7.2 版本,軟件源安裝的 PHP 默認(rèn)以 Unix Socket 的狀態(tài)運(yùn)行在 /run/php/php7.2-fpm.sock,比使用 TCP 以 localhost:9000 的方式性能更好。 1、安裝軟件源...

    Ajian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<