2013年7月25日 星期四

Facebook 的 hiphop-php (aka hhvm)

什麼是 hiphop-php 呢?


  1. 基本上就是 facebook 自己實作的 php runtime,再加上很多特異功能。
  2. 第一代叫做 HPHPc,這是一個將 php transform 成 c++ 的版本,由於因為對開發者不友善,加上每次只要 php code 有變動,就得整個重新編譯,而編譯一次得花上好幾個鐘頭,所以 facebook 在 2013/02 放棄使用這個版本。(第一代其實還包括 HPHPi,HPHPd 等衍生的特殊版本)
  3. 第二代叫做 HHVM,將原本的編譯改成 vm 模式,加上 JIT 支援,讓 php 執行起來就跟在飛一樣快。
  4. wiki

那 hhvm 有什麼特異功能呢?

  1. 基本上他就是一個 base on libevent 的 http server,加上 php runtime。
  2. 但是你想得到的一些基本 http server 該有的他都有,例如 virtual host, gzip, keepalive, rewrite, acl 等等。
  3. 此外,還可以扮演 proxy/rpc/static 。
  4. 再來它可以開一個 admin server,bind 在特定的 port 上,提供一些 server status,以及一些管理上的相關 api。
  5. 非常快,在我的 i7-3770k + 32G ram 的機器上,跑一隻簡單的 php,出現了接近 10000 reqs/sec 的數據,當然這會跟著你的 php 程式複雜程度而減少。
  6. 容易 deploy,如果 hhvm 是 static link 的話,deploy 只需要將 binary scp 到所有機器上就完成了,根本不需要管相關的 dependencies library。hhvm 在跑起來的時候,其實需要額外的 php data file,但是他用了一個很變態的方法存放這些 php data file,把它藏在 hhvm binary file 的 .text section 裡面。
  7. fb 自己實作了不少特殊功能的 function,例如用 non-blocking 的方式連接 mysql。
  8. 還很多,我目前還在看當中。


那目前有什麼做不到的?

  1. 由於還在緊密開發,所以他官方宣稱只支援到 php 5.3,並且不是所有的 php extension,都可以在 hhvm 裡面使用。
  2. 例如資料庫的部分,目前僅支援 mysql/sql,有些人想要 mongodb driver,目前還在殷切盼望中。
  3. 文件缺乏,雖然 source code 是你最要好的朋友,但是不是所有人都能看 c/c++ 去瞭解整個系統的。
  4. i386/powerpc/sparc/ia64/arm 等平台都不支援,目前只支援 amd64(x86_64),arm 的話,據說不支援啦,但是某些地方有看到這個 keyword,這讓我想到之前聽到的 facebook 考慮用 arm 來當 web 的八卦。
理論上只要你用 mysql 當 database,沒用奇怪的 extension,那麼 hhvm 應該是可以直接拿來用,連 nginx/apache 等 web server 都可以不用安裝了。但是如果有用到額外的 php extension,那要就是等別人寫出對應的 hhvm extension,不然就不建議使用。(當然也可以自己下去寫看看)

沒有留言: