成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別再像2009年那樣寫PHP代碼了

開發(fā) 后端
離開在Facebook擔(dān)任工程師的僅僅2個月時間,我就很困惑,外面的世界看上去仍然像是在2009年的時候那樣寫 PHP。

離開在Facebook擔(dān)任工程師的僅僅2個月時間,我就很困惑,外面的世界看上去仍然像是在2009年的時候那樣寫 PHP。

貌似人們從來沒聽過 Hack、 HHVM、 XHP 等等,人們?nèi)耘f在代碼里大量使用 require() 和 include() 語句。簡直了。

我仍然認(rèn)為 PHP 是一門寫前端應(yīng)用的優(yōu)秀語言(業(yè)務(wù)邏輯和 API 層),但只有當(dāng)你應(yīng)用了以下它的現(xiàn)代優(yōu)勢時,這一說法才成立:

[[200826]]

1. Hack

打出你的變量:

說實(shí)話,PHP 最大的問題是它缺乏強(qiáng)類型。 變量可以是任何類型,很多時候這就是一個定時炸彈。

如果你不得不寫這樣的代碼:

  1. if ($var !== null && is_int($var)) {   
  2.     //... 

這意味著你可以想引用一個null變量,或者錯誤的變量類型。

Hack 是向 PHP 漸漸添加類型信息的途徑,而且它是基于 PHP 的。

如果你添加了 hack 類型提示,它強(qiáng)制約束你的變量(包括把他們標(biāo)記為可能為 null)。例如:

  1. class Foo { 
  2.   ?int $var = null;  // ... some code ... 

可以用在方法簽名、類屬性等上面,接著它允許你通過 hh_client 檢查代碼里是否存在錯誤,存在就會把類型錯誤高亮出來。

Hack 文檔頁面有更多更好的對于 Hack 類型的解釋: https://docs.hhvm.com/hack/overview/typing

Async 異步

對于體面的 PHP 網(wǎng)站來說,下一個重要的跨越是使用 hack 的 async/await 關(guān)鍵詞。

如果你從未接觸過類似特性的語言,我來解釋一下。

比如講,你需要對數(shù)據(jù)庫做 3 次函數(shù)調(diào)用,為了獲取 3 塊數(shù)據(jù)。為了計(jì)算出頁面想要的結(jié)果,你需要所有 3 個查詢結(jié)果,但每個結(jié)果都需要 1 條不一樣的 SQL 語句。

一般你會這樣寫:

  1. $data1 = querySQL1(); 
  2. $data2 = querySQL2(); 
  3. $data3 = querySQL3(); 
  4. $result = computeResult($data1, $data2, $data3); 

好,實(shí)際上,除非你在明確的做一些牛逼的東西,PHP 通常是在一個請求里面單線程跑的。 這意味著服務(wù)器會首先給第一條查詢執(zhí)行一條 SQL,等待結(jié)果,然后再執(zhí)行第二條 SQL,接著再執(zhí)行第三條。

這有什么問題呢?這里的問題是,計(jì)算最終結(jié)果所需的時間是執(zhí)行 query1、query2 和 query3 三者的時間之和。

但大多數(shù)數(shù)據(jù)庫都是多線程,且可以并行執(zhí)行操作的。如果在此之上,你的 DB 在 SSD 上而不是在機(jī)械硬盤上執(zhí)行,你就可以利用上 DB 的多核處理器和并行處理能力...

如果你在查詢多個 DB 或者多個不同的服務(wù),或是請求多個 API,對你來說這一特性也可以發(fā)揮優(yōu)勢。

我們怎么來解決呢? 使用 async/await:

  1. list($data1, $data2, $data3) = await\HH\Asio\v(array( 
  2.   querySQL1(), 
  3.   querySQL2(), 
  4.   querySQL3(), 
  5. )); 

是這種方式,3 條查詢一次性發(fā)送并等待結(jié)果。現(xiàn)在獲取 3 塊數(shù)據(jù)的時間就是執(zhí)行耗時最長那條查詢的時間,因?yàn)?3 條都在并行處理。

Hack 使用圖表的方式更好地對 async 做了解釋:https://docs.hhvm.com/hack/async/introduction

Hack 提供了對 MySQL, memcache 和 Curl 的 async 實(shí)現(xiàn),所以你可以只需用它們的庫替換掉你的調(diào)用就能立即利用到這一優(yōu)勢。

Collections:

PHP 數(shù)據(jù),有時候是一個向量,有時候是一個字典,有時候兩者都是。

即便你知道它里面包括什么,其他的工程師很可能認(rèn)為自己也知道,但卻在里面放進(jìn)了錯誤的數(shù)據(jù)類型。

如果你曾經(jīng)使用過像 C#, Java 或 C++ 這樣的語言,你可能對 Generics 和 Collections 會感到熟悉。

Hack 引入了 Collections, 它讓你指定 Collections 里面的數(shù)據(jù)類型。 這意味著你只是盲目寄望于數(shù)組包含了你想要的值,現(xiàn)在你知道這一結(jié)構(gòu)包括了你想要的數(shù)據(jù)類型(字符串、整型等等)。

在這之上,如果你仍舊想使用 PHP 的數(shù)組,你只需要對代碼做一點(diǎn)點(diǎn)重構(gòu),你就可以對數(shù)組內(nèi)容的類型進(jìn)行這樣的約束:

  1. class Bar { array  
  2. $vector_of_ints = array();  
  3. array  
  4. $dictionary_with_string_keys = array();  

然后你只要在數(shù)組里放置了錯誤類型的變量,或者給數(shù)組指定一個字符串鍵,類型檢查器就會拋出錯誤。

2. HHVM

Hack 帶有它自己的運(yùn)行環(huán)境,如你預(yù)料的,它無法直接運(yùn)行于 Zend 的 PHP 環(huán)境。

HHVM 指 HipHop 虛擬機(jī),是在 Facebook 開發(fā)的旨在極大改進(jìn) PHP 規(guī)模化的執(zhí)行復(fù)雜度問題。

HHVM 運(yùn)行了整個 Facebook 和一些其他主要站點(diǎn),比如現(xiàn)在的維基百科,隨著時間推移,越來越證明它所帶來的許多性能收益。

由于 HHVM 無需 Hack 提示符也可以運(yùn)行常規(guī)的 PHP,且同樣可以加速代碼執(zhí)行效率,所以不使用 HHVM 作為你默認(rèn)的 PHP 運(yùn)行環(huán)境就是在浪費(fèi)錢。

例如,當(dāng)維基百科切換至 HHVM 后,平均單頁加載時間減少了超過一半,CPU 的平均使用率從 70% 減少至 12%,這還是在 2 年前。自那時起, HHVM 團(tuán)隊(duì)持續(xù)提升其性能表現(xiàn),所以你可以想象它現(xiàn)在表現(xiàn)更好了。

HHVM 在生產(chǎn)環(huán)境需要一個像 Apache 或 nginx 這樣的 HTTP 服務(wù)器作為前端支撐,但是在開發(fā)環(huán)境,它也可以獨(dú)立作為服務(wù)器運(yùn)行。

3. XHP

如果有一件事是我憎惡的,就是 PHP/HTML 混編。這樣的代碼讓我吐:

  1. $user_name = 'Fred' 
  2. $output = "Hello $user_name"

更早的是,有人自作聰明,不在一個地方開閉 HTML 標(biāo)簽,像這樣:

  1. $user_name = 'Fred'; $output = "  
  2. Hello $user_name"; // some call to a function that takes in $output and is supposed to close the div tag $output = addTheRestOfTheSoup($output); 

于是你維護(hù)起來就...

[[200827]]

XHP 讓 HTML 作為 PHP 的一級公民,因此你可以在字符串外編寫 HTML,像 XHP 一樣解析。

比如:

  1. $user_name ='Fred'; $output = 
  2. Hello $user_name; addTheRestOfTheDivContentsTo($output);  
  3. //...  
  4. function addTheRestOfTheDivContentsTo(:div $div): :div {  $div->appendChild("We come in peace");  return $div; } 

如你所見, XHP 同樣強(qiáng)制標(biāo)簽匹配,也就是說開標(biāo)簽有相應(yīng)的閉標(biāo)簽,且以合適的順序進(jìn)行開閉。

XHP 同樣處理字符串變量的 escape,避免 HTML/JS 進(jìn)入頁面的用戶內(nèi)容中,防御網(wǎng)站受到該攻擊矢量的攻擊。

你還可以為你自己創(chuàng)建自定義的 XHP 類,比如“自定義的HTML標(biāo)簽”來復(fù)用你的代碼庫,比如實(shí)現(xiàn)可以自動在 Facebook 頁面添加鏈接的功能,甚至用一個標(biāo)簽來渲染整個頁面頭部。

更多關(guān)于 XHP 的文檔:https://docs.hhvm.com/hack/XHP/introduction

還有更多 ...

以上介紹了 HHVM、Hack 和 XHP 的基礎(chǔ),下次我希望介紹一下設(shè)置 HHVM 的開發(fā)環(huán)境,基于 HHVM 的類自動加載、函數(shù)和常量,還有基礎(chǔ)的控制器框架,路由 web 請求。

責(zé)任編輯:未麗燕 來源: 推酷
相關(guān)推薦

2022-04-14 19:39:39

Java線程安全

2020-12-02 11:18:50

print調(diào)試代碼Python

2020-12-04 10:05:00

Pythonprint代碼

2010-03-02 10:31:07

FirePHP調(diào)試

2021-01-22 10:09:23

簡歷求職者面試

2022-03-10 10:12:04

自動化腳本Bash

2025-06-10 01:11:00

2021-02-05 11:08:06

云計(jì)算

2017-12-29 05:00:58

2022-05-27 21:56:55

索引存儲MySQL 存儲引擎

2017-08-16 09:55:36

2025-06-10 02:22:00

2025-05-19 04:00:00

2020-12-11 09:24:19

Elasticsear存儲數(shù)據(jù)

2025-05-30 03:15:00

2018-09-28 05:25:53

TopK算法代碼

2021-06-09 06:41:11

OFFSETLIMIT分頁

2019-12-17 09:29:02

數(shù)據(jù)庫架構(gòu)分庫分表

2017-11-15 08:55:00

物聯(lián)網(wǎng)CIO大數(shù)據(jù)

2025-04-21 10:43:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人精品网站 | 久久久精品网 | 久久精品国产免费一区二区三区 | 精品视频成人 | 日韩欧美在线观看视频 | 久久天天 | av在线一区二区三区 | 香蕉视频黄色 | 久久精品日产第一区二区三区 | 国产剧情一区 | 成年人视频在线免费观看 | 国内久久 | 日韩精品a在线观看图片 | 久久福利 | 国产欧美一区二区精品久导航 | 国产成人综合在线 | 青青草在线视频免费观看 | 欧美不卡| 四虎影院在线播放 | 国内精品久久影院 | 在线观看成人 | 欧美日韩一区精品 | 一区二区三区av | 国产精品不卡 | 成人免费一区二区三区视频网站 | 神马久久av| 色婷婷综合久久久中字幕精品久久 | 久久久久www | 日日日色 | 91资源在线 | 欧美在线观看网站 | 国产精品久久网 | a欧美| 99国内精品久久久久久久 | 日韩中文字幕在线不卡 | 热久久国产 | 国产精品视频一二三 | www.日韩av.com | 免费在线一区二区三区 | 黄色av网站在线观看 | 青青久久av北条麻妃海外网 |