2014年1月20日星期一

Zend VM: zend object, persistent zval 以及 persistent hash table

趁現在還有印象,筆記一下關於 Zend VM 內部的 persistency mechanism:

1. ALLOC_INIT_ZVAL 基本上就是 ALLOC_ZVAL 加上 INIT_ZVAL

2. MAKE_STD_ZVALALLOC_ZVAL 加上 INIT_PZVAL

3. INIT_PZVALINIT_ZVAL 的差異是 PZVAL 會將 refcount__gc 設置為 1 而 INIT_ZVAL 基本上只是將所有的欄位設置為 0。 所以 ALLOC_INIT_ZVAL 出來的 zval 如果沒有處理好,會被 gc 清掉。

4. zend object 不支援 persistent,其中一部分原因在於 object 基本上分為 zend_object 以及 zend_object_value, zend_object 是 persistent,但 zend_object_value 不是,且 object 本身的 properties 跟 handlers 都是使用 emalloc 申請來的,這些記憶體會在 request 結束的時候一起 free 掉。

5. HashTable 結構可以 allocate 成 persistent memory,其中幾例是 EG(persistent_list)EG(symbol_table). 基本上需先使用 pemalloc allocate persistent memory 再使用 zend_hash_init 初始化 HashTable 結構變數,其中最後一項參數 persistent 必須為 1,則 allocate bucket 時,bucket 本身的記憶體才會是 persistent。

6. zend_hash_copy 基本上是直接對 buckets 做拷貝的動作,所以 zval* 實際上還是同一個,只是在 copy_ctor_func 你可以透過 Z_ADDREF_P 來增加 reference counting。

7. 要對 HashTable 完全拷貝,只能另外自己寫 recursive copy function,對於 value 內的 zval* 得另外 allocate zval* 出來,這樣在 persistent_list 內才不會被 request 結束時的 clean up handler 清除掉。

8. 也就是說 object 沒有辦法 persistent 保留在程序中,在 APC 的作法,則是針對 object 去做 serialize。 沒錯就是那個 serialize 函數。

9. zval 基本上都是 copy on write,如果在 extension 內要明確的複製 zval 結構到新的記憶體空間,則必須使用 SEPARATE_ZVAL

10. 只要是 emalloc 來的記憶體,不管 refcount 是否大於 0,"幾乎" 都會在 RSHUTDOWN 時被清除掉。

2014年1月7日星期二

Pux - 以新的概念重新設計 PHP Router

時下開源的 PHP Router 如 Symfony/Routing 或 Zend\Mvc\Router 多半是以一個 Persistent  HTTP server 的角度來設計,然而一般 PHP 是通過 CGI 或 Apache 來執行,這樣的設計會讓您的 PHP 應用程式在執行時間跟編譯時間消耗太多效能,有過多的方法呼叫、類別載入、物件建置等等。

在這些舊有的模式下,每一個新的 HTTP 請求進來,PHP 就必須重新把每個模組的路徑載入,且透過多個 method call 把路徑定義到一個 PHP Array,再使用 PHP 去對每個路徑做比對。

有些 Router 的設計甚至做了更多的預先處理,譬如: Symfony/Routing 得利用 RouteCompiler 把路徑編譯成 PCRE Pattern, Symfony/Routing 甚至強迫每個 Route 都一定得使用 PCRE 來比對。

雖然在小型應用程式還過得去,但在稍微大一點的 PHP 應用程式,Controller 與 Route Path 動扎幾十幾百個,整體消耗下來的多餘計算其實相當可觀。

這些重複的預先處理其實是不必要的,如果能夠避免預先處理或者函數呼叫,就可以提昇整體效能。

然而,直接定義 Route 成 PHP Array 雖然可以增加效能,但反而卻增加了開發成本。



因此,針對這些問題,筆者在去年底跨年夜,重新設計了一個新的 PHP Router。


Pux (http://c9s.github.io/Pux/) 是一個以效能為導向所設計的 PHP Router,針對 PHP 本身在 CGI 或 Apache 環境上的執行時間 (Run-time) 特性,以新的方式設計的 PHP Router。

Pux 簡化了每個路徑的資料結構,並自動將路徑類型分為兩種類型,一種是需透過 PCRE 正規表示來比對的路徑,另外一種則是純字串的靜態路徑。

會這麼做的原因,是因為 PCRE 正規表示的比對相對比純字串比對慢,甚至靜態路徑可以直接透過 Hash 表來查找。

此外 Pux 針對在 Production 環境上效能重點,支持了使用 C 語言開發的 PHP Extension,只要安裝這個 Extension,就可以避免 PHP Class 重新載入,路徑比對的速度也會更快,可得到更高的執行效能。


使用


使用 Pux,您可在任何一個 framework 內建置您的 Route 定義檔,在檔案最尾端回傳 Mux 物件

// load your composer autoload if it's needed
// require '../vendor/autoload.php';
use Pux\Mux;
$mux = new Mux;
$mux->get('/hello', ['HelloController','helloAction']);
return $mux;
接著使用 Pux 提供的命令列工具將定義檔編譯成 PHP Array:

pux compile -o hello_mux.php hello_routes.php
接著在您的應用程式內,只要寫一行 require 引入這個檔案就可以直接使用 Mux 做路徑比對的動作:

$mux = require "hello_mux.php";
$route = $mux->dispatch('/hello');

效能


以重新設計過的 Pux Router (Phux 舊名),在 iMac 2012 Mid 機器上 (Rough Benchmark) 與 Symfony/Routing 的效能比較,以下是參考數據:




反應時間的部份, Pux 純 PHP 版本平均需要 8-10ms 的反應時間,但 Symfony 最 Minimal 的載入至少需要 9ms 平均 30-40ms 左右

Pux - Requests per second
Symfony/Routing - Requests per second


測試案例的程式碼可在 router-benchmark 找到,兩者的測試案例都相當簡單,只有一個 /hello route ,並且純粹就 dispatch 的速度來做比較。

註: Symfony/Routing 的測試案例不包含 Controller, Symfony, UrlGenerator, Apache2 Rule Dumper。

Testing with route dispatch only. (no controller)

Hardware:
  • iMac Mid 2011
  • Processor 2.5 GHz Intel Core i5
  • Memory 12 GB 1333 MHz DDR3
  • Software OS X 10.9.1 (13B42)
Environment:
  • Apache 2.2 + prefork worker
  • PHP 5.5.6 + opcache

2013年10月19日星期六

如何有系統的練習滑板技巧: Way To Skateboarding

說起滑板這項極限運動,當初接觸滑板是從國中開始的,某個朋友在路上撿到了一塊滑板,從而挑起了我對這項極限運動的興趣,於是從國三到高三這段時間,只要想到有時間可以練板,就會立刻拿著滑板去附近的廣場或是公園練習,平常則是在家看教學錄影帶看到成痴。到高三時,我已經能夠做出 Ollie, Pop Shove it, Kick-flip, Nollie, Ollie 180 Back 等等技巧。

當時,並沒有覺得練習滑板需要特別思考練習的方式或是調整各種因素來達到較好的績效,因此時常因為看到某些好玩的招式就開始練起來,結果想當然成效也都不佳。 所以能夠練起來的招式,大多是胡亂練起來的。

這邊所謂的胡亂練,就是只是不斷的重複練習,卻沒有進一步思考練習的方式,或從其他角度來幫助練習更有效率。

開始寫這篇文章主要是想將最近的一些思考寫下來,供一些有興趣練習滑板技巧的朋友能夠減少練習時摩擦力以及更容易抓到各種招式的訣竅,更重要的,用最少的時間達到更好的成效。




準備工作

1. 首先你需要檢視你是否買到適當的滑板

如何挑選一塊適合自己的滑板?先從最重要的板子 (Deck) 說起,挑板子要依照自己腳大小去挑選,千萬不要聽別人說幾號最適合就直接衝去買,挑到太寬的板,雖然滑行會較為平穩,但是要做地板招式就會特別難,因為板子重,剛開始練習 Ollie 的托板動作會很難抓到訣竅。

簡單的說:

寬的板:  雖然較重,但滑行平穩,做完招式著地也會比較穩,若做 Kick-flip 踢板或是 Ollie 相對的腳的幅度就要特別大,也會比較吃力。

窄的板: 由於重量較輕,要做 Ollie (臀跳) 就會比較容易,因為板子輕的緣故,前腳托板就會比較容易將板子的後半帶到空中。

在這邊以我自己來說,通常是挑 7.5" 到 8" 左右的板子 (Deck) ,寬度大概是比自己腳掌再窄個 8-10 公分的板,買板子一定要先試站看看,試的時候不要站全滿,試著站半滿 (也就是用腳尖站板子的中間試試看),只要不會覺得太窄不好站即可。

另外,板子凹面的弧度是否足夠也是很重要,這個弧度會影響到你托板時,所產生的摩擦力是否足夠。

這邊有個國外購物網站提供的標準可以參考:





選擇輪子:

較大的輪子: 比較容易在崎嶇的路面上滑行,但相對的也會增加板子的重量,做招式會比較吃力。

較小的輪子: 做招式比較容易,但為了避免被路上的小石頭卡到跌倒,盡量還是不要選太小的輪子。


如何選購其他部分,這邊有較完整的 Guide 可直接參考 - "Skateboard Buying Guide"。



開始練習

如何練習滑行,我相信只要稍微有一點平衡感的人練一下就會了,這邊直接帶過... 直接講 Ollie


1. Ollie 豚跳練習技巧

Ollie 是幾乎所有招式的基礎功,只要 Ollie 練得夠熟,要進一步練習其他技巧如 Kick-flip, Pop Shove-it 就會相當容易。

這個階段主要是練 "點" "托" 的節奏感,所有的空中招式都是以這個節奏感為基礎。

Ollie 的訣竅在於,前腳站板大概在 2/3 處,托板要做確實,若還沒有辦法抓到托板的感覺,練習時先不要跳太高,練輕跳即可,這樣會比較能夠抓到托板的感覺,左腳 "點"、右腳 "托"的節奏感抓住之後,就比較能夠跳起來了。

在跳起來之前,先練習後腳踩板,讓板子前半翹起,一直不斷的反覆練習踩板的動作去抓後腳踩到地面的感覺。

再來就是練習托板的動作,板子前半翹起時,用前腳往前刷,刷的距離越多,越能將板子帶上。

如果你還抓不太到訣竅,建議你找一個可以扶著的欄杆練習,這樣練抓感覺最快,而且也不容易摔。

若開始能抓到"點","托" 的節奏感,並且能夠托板至空中,就可以開始練習跳躍一些無形的障礙物,如地板上的線條。 你也可以用粉筆在地板畫上一個線條,豚跳時就假想跳躍這個假想的障礙物,並觀察滑行速度是否足夠,以及著地時,落點是否有超越線條。

更進一步,如果你已經能跳得夠高,就可以開始跳一些真實的障礙物,如磚塊、寶特瓶等等。 換成跳躍真實障礙物時,跳躍的時間點,會比直接跳線條更早一些,且速度一定要夠快。

如果你還在 Ollie 階段,千萬不要 Ollie 練得不夠熟,就直接去練跳樓梯、障礙物、Pop Shove-it 或 Kick-flip,因為如果板子的物理動態抓得不夠熟,是不可能練成其他翻板的招式的,甚至會增加跌倒受傷的機率。

那麼 Ollie 要練到什麼樣子才算熟? 

1. 做 Ollie 時的速度夠快
2. 著地時,踩得夠穩
3. 方向正確不會偏掉,並不會讓板子停住。
4. 有托滿板,托板做到紮實,板子在最高點的時候是平的
5. Ollie 跳得夠高



以下有個非常詳細的教學影片 (Updated 2013/10/23)





Checkout more on http://5k473.blogspot.tw






2013年3月7日星期四

PHP - AssetToolKit

https://github.com/c9s/php-AssetToolkit 



這是一套筆者最近開發的 asset framework。


這是個獨立的 asset 管理工具,不需要安裝或使用 symfony 或 zend 之類的 fullstack web framework 就可以直接使用,可以很容易的嵌入在你自己開發的 application,也可以直接嵌入在你 single page php application 裡。

如果只想要靜態檔案,不需要動態呼叫,也可以利用 command-line 的 compile 命令,先把所有檔案編譯起來。

這有點類似 requirejs, 但 requirejs 沒辦法跟 php 模組整合, 這個工具是可以讓你的 php 模組都可以有自己的 assets,然後可以把不同模組底下的 assets 統合編譯壓縮起來成不同的檔案,來加速 client 端下載靜態檔案的速度。

以往,要在 PHP Application 內組織好 asset files 如 js, coffee-script 實在是件難事,因為每個框架的架構都不相同,要用 requirejs 也會有存取路徑的問題需要處理。

使用 AssetToolkit 的話,你可以將 assets 至於任何地方,只需要透過單一集中式的設定檔,就可以動態將所需要的 asset 載入。

舉例來說,我有一個 web application MyBlog:

apps/MyBlog


底下可以放置一些 assets,分別是:

apps/MyBlog/assets/jquery
apps/MyBlog/assets/jquery-ui

現在我另外寫了 plugin:


plugins/Post/assets/post-assets # 專為 Post 寫的 js 跟 css
plugins/News/assets/news-asset-a
plugins/News/assets/news-asset-b

各位知道,既然設計成 plugin ,那就是可以抽插代換的插件,透過 AssetToolkit 的話,各插件的 asset 載入,可以直接寫在各 plugin 的初始化區塊,所以若今天把 News plugin 或 Product plugin 拿掉,也都不會影響到整個應用程式的 assets 載入。

此外,AssetToolkit 做的不只是載入,還可以幫你透過 CoffeeScript filter, SASS filter, SCSS filter 等等,自動幫你編譯轉換並且壓縮。

2013年2月24日星期日

最近複習 Core Animation 的心得

最近複習 Core Animation 的心得: Cocoa 的視窗架構真的很優秀,程式碼簡潔清晰,功能強文件又完整 :)

不像以前寫 X window manager,X11 整個程式碼就是在大亂鬥,一堆 workaround ,然後因為是 C 語言只能一串串 struct 拋來拋去的,後來的 xcb 也沒好到哪裡去。:& 那些開發 Qt 的人真的很厲害呀...

其實以前寫 .NET,視窗開發也沒這麼威,也缺乏 Apple 公司的美感

雖然 Jobs 性格很糟糕,但 Jobs 統合 A 級怪咖起來做事情的能力倒是很優秀,做出來的東西果然就是很不一樣,相當前衛且創新。

至於微軟公司,做出來的東西則是很數學、很計算機、很制式,別人有什麼 (Java) 就做什麼 (C#)。 (誤)
1988 年的時候,能像 Jobs 大膽在新成立的 NeXT 公司採用 Objective-C 來進行開發的人應該是少之又少,但這個二十幾年前的決定卻奠定 Cocoa 的優良架構...

Tim Cook 雖然能搞工業工程、生產線,但對技術品味以及產品品味簡直是遭透了...每次手機要拿出來撥號就看到"計算機" ...

以前什麼都不懂,只覺得 X11 很酷,現在比較有經驗了一些,才慢慢開始有一些技術架構的品味。 以 X Window 現有的架構跟現況,我猜要追上 Cocoa 的程度恐怕還要幾十年..

2013年2月17日星期日

GoTray1.4.2 for Mac OS X

GoTray 1.4.2 釋出:
  • 新增自動持續測試功能。
  • 可同時監測多專案建置狀況。
  • 可新增 CGO 環境變數。
  • 可修改專案設定。

話不多說,先來看畫面:



如下圖,可搭配你喜愛的編輯器或 IDE 做自動持續測試,只要修改檔案,就會自動進行編譯或測試。


2013年2月10日星期日

GoTray for Mac OS

算是今天除了工作之外,另外做的一個小工具 GoTray for Mac OS 10.7+


本來是打算上傳到 Mac OS 的 App Store,但太久沒關心 Mac OS App 相關開發,沒想到從 2012 年六月就是 App Sandboxing Requirement 的最後通牒 - Apple’s Sandboxing Deadline Has Arrived For Mac App Store Developers,試著 Google 一下,發現還蠻多人哀嚎 XD

所有要在 App Store 上發佈的 App 都得啟用 Entitlement 內的 App Sandboxing 才能過 Validation。

而用 XCode 編譯 Mac OS App 若啟用 Sandboxing 後,該 App 最多就只能存取 User space 底下的檔案了,所以也無法去啟動系統上的 godoc server 。

這基本上代表著所有跟 FileSystem 相關或需要操作系統命令的 Mac OS App 只能把這些需要權限的部份,另外寫成 XPC Service 才有辦法進行進一步的操作。

2013年2月6日星期三

創新根本就是個假議題

創新根本就是個假議題,創新不一定代表你就會賺錢,創不創新不重要,商品最重要的是消費者買不買單。

那些免費的事物

人們對於免費的事情通常不會太重視,人們只珍惜自己的錢。

當消費者裝了一堆軟體後,往往只記得要去試試看自己有付費的那款,而且還是最貴的那款,至於其他的免費軟體,除非聽別人說不錯,否則就會被永遠打入冷宮。

如果定價是免費,消費者可能連研究一下都省了

最近在思考開發者熱衷於開放原始碼這件事情.. 雖然一方面是幫助科技進步,但其實可大量複製的性質以及大量的開放原始碼專案同時也在改變人們對於軟體的價值觀。 只要是人,就算理性上知道軟體開發本來成本就不低,但大量免費軟體這件事情 (不管自不自由) 總是擋不過 Human nature,於是逐漸使許多的消費者覺得軟體沒什麼價值且本來就該免費。

話說,米其林兄弟一開始在發行米其林指南時,就是免費放送,結果這些指南手冊卻被維修廠員工當作工作台的桌腳補墊來用 XD

2013年1月31日星期四

台灣零時政府第壹次公地放領黑客松活動報導 #g0v #3du

繼 pingooo 於部落格首發還文於民,在 g0v 舉辦同時,也同時進行了 3du 黑客松活動,近十人左右參與這個 3du 黑客松,pingooo 在早上十點多時發出噗浪訊息後,就有許多噗友熱情回應,其中當然也不乏嘴砲之人..

不到幾個小時,黑客 au 發表了一支教育部國語字典抓取程式,用來抓每個單字的腳本雛形:


TonyQ 也發表了成語典抓取程式,用來彙整成語用法、釋義等等資料:


過沒多久,這些資料就抓的差不多了:





接著  au 發表了一支程式,用來查詢字典資料使用 (連結):
audreyt: 感謝 pingooo 發起 g0v hackath1n 的字典開放資料活動,拿 kcwu 提供的 sqlite3 作基礎,寫了簡單的 bin/moe 命令列 查詢器,還不錯用。
 大家開始幫忙處理造字及實際字碼統合,以下是 au 發表的回應
audreyt: 目前主要需要幫忙的是把教育部的造字和 Unicode 的實際字碼統合:歡迎加入編輯。這張表是 medicalw1i、kcwu、gugod 和我整理後,尚未找到對應的字。之前有找到的,例如 966a 是<幽懷賦>作者李翶的「翶」,fa4c 是<國語.魯語上>罜䍡的「䍡」等等,也歡迎校訂
活動不到 24 小時,餘下三百多字已全數初步檢字完畢,第二輪字也相當快就檢查完成:
audreyt 一夕之間,第二輪 463 字 全部檢完,終於有一部能剪下貼上的萬國碼 #3du #g0v 萌典可用了。感謝 Jun-Yuan Yan. S, Yao Wei、Yaoting Huang、波卡 Poka、Caasi Huang、Daniel Hung-te Liang、favonia、Grey Lee、Irvin Chen、Gugod、Schee 襄助!
後來熱血人士 @racklin 發表了第一個跨平台的國語辭典查詢程式,可以在 Windows, Mac OS, Linux 上使用這個字典查詢:
阿土伯 說 響應 pingooo clkao 3du.tw 及 g0v 活動,我把教育部字典桌面端程式初版寫好了,支援 MacOSX / Linux / Windows.
目前桌面應用程式效果相當不錯,以下是螢幕畫面:


接著不到一天,@racklin 又立刻發表了更新版辭典程式,變得更好用:



然後, @yllan 也發表了一款 Mac OS 原生的辭典應用程式,效果也相當不錯!




相當不錯的活動,各界熱血人士的參與,使得這樣的一個專案不到兩天的時間就完成了。

請試想這樣的一個專案交給政府機關處理,到底要先過多少關卡,接著再拖延幾個月才有辦法做完呢?而且政府機關還要花到上千萬?

以下是 Hackpad 上的相關資料:

2013年1月29日星期二

用 WIFLY 無線網路下載 AWS 上的檔案真是杯具

這次在 7-11 使用 WIFLY 下載 AWS 上的 moe-dict.app 真是杯具阿... 好像回到十幾年前用數據機撥接,每秒只有 6K~7K。

同樣的檔案,改用中華電信 CHT-WIFI ,速率大概落在 200KB/s 以上。

2013年1月27日星期日

教育部電子辭典資料應該開放

忍受教育部電子辭典惡劣的操作介面、穩定度的問題已經好幾年了。

最近看到 pingooo 寫的這篇 還文於民 ,談到教育部電子辭典動不動就主機掛點,不需要登入的系統還要你登出等等問題,我覺得這件事情政府早就該做改善了。


首先,辭典資料的版權問題




從以前,我就一直有這個疑問,我們繳納的稅金,請這些教育部公務員做的東西,為何版權是教育部所有而不是納稅人所有?沒有所有權就算了,連資料使用權都沒有的話,那我們這些稅金難道是燒假的嗎?

Pingooo 寫道:
拿納稅人薪水的教育部在上班期間用納稅人的錢產出的智慧財產,納稅人就算所有權因為太多人不好處理,有使用權難道不是天經地義嗎?
不懂電腦的人,可能會說,資料不就在網站上公開使用了嗎?其實,資料跟網站的介面是可以抽離的,同樣的資料,可以透過不同的介面去呈現,如果教育部的電子辭典介面跟系統做得這麼差,為何不把原始資料公開出來,讓民間製作更好的介面供大家使用?


所以,教育部應該公開這些辭典資料,交給民間去做,反而會做得更好,不是嗎?看看民間做的實價登錄網站就知道,以民間的技術來做總是可以比政府外包或自己製作做得好。

另一方面,公開原始資料的同時,也該修法,對那些使用這些公開資料營利的企業該如何處理也是一大課題。

公開資料有哪些好處?


一旦原始資料公開民間使用,不管是行動版網頁介面、iPhone App / Android App、或是使用先進的 HTML5 介面所使用的服務,相信都會有人願意去做出來。

甚至,教育部根本就不需要透過標案的方式外包給廠商,也可以節省一大筆費用。政府標案常有收受回扣的問題,外包廠商的品質也不見得穩定,公務員平常主要處理公務,對於資訊技術本來就不是很了解,交給這些公務員去選出來的外包廠商,也不見得能夠把這個標案做得完善。

把這些資料交給民間,透過自由市場的機制,這些服務自然就會做得越來越好,不是嗎?

2013年1月24日星期四

Gentoo Linux: What to do if you deleted package.use file accidentally?

In Gentoo Linux, package information is stored in /var/db/pkg

And the installed USE flags is stored in `USE` file, for example: /var/db/pkg/dev-lang/php-***/USE.

To restore these USE flags back to your /etc/portage/package.use file, simply type the command below:

cd /var/db/pkg/ && ls -d */* | while read pkg ; do echo -n "$pkg " ; cat $pkg/USE ; done >> /etc/portage/package.use

2013年1月19日星期六

WIFLY 無線網路頻寬比我想的還慢

需要用無線網路,不得已購買了 WIFLY 月卡 ($ 500),下行只有 0.83Mbps 的速率。

本來想要買年卡 ($ 1200) 沒想到年卡居然限制只有平板、手機可以使用。

以前曾經被年卡騙過,買了才發現居然筆電無法使用,結果還搞了很麻煩的退費手續,搞了一個月費用才退給我。

以 speedtest.net 為證:


然後 ping 還會掉封包:


2013年1月10日星期四

PHPBrew 日本語 README


PHPBrew

PHPBrewは異なるバージョンのPHPをホームディレクトリにビルド(build)とインストールすることができます。
環境変数の管理もでき、個人の需要に応じてバージョンを切り替えて利用することが可能です。
PHPBrewのできること::
  • PDO、mysql、sqlite、debugなど様々なバリアント(variant)を持つPHPをビルドします。
  • apache phpモジュールをコンパイルし、ヴァージョンごとに分けます。
  • 異なるバージョンのphpをホームディレクトリにインストールするので、ルートパーミッション(root permission)は必要なくなります。
  • 簡易にバージョンを切り替えることができます。しかもbash/zshシェルと統合されました。
  • 自動機能検知。
  • system-wide環境に複数のPHPバージョンをインストールできます。

支援OS

  • Mac OS 10.5+
  • Ubuntu
  • Debian

必須環境

  • PHP5.3
  • curl
  • gcc, binutil, autoconf, libxml, zlib, readline

Mac OS X 必須環境

MacPorts使用者:
port install curl automake autoconf icu $(port echo depof:php5)
HomeBrew使用者:
brew install automake autoconf curl pcre re2c mhash glibtool icu4c gettext jpeg libxml2 mcrypt gmp libevent
brew link icu4c

Ubuntu/Debian必須環境

sudo apt-get install autoconf automake curl build-essential libxslt1-dev re2c libxml2-dev
sudo apt-get build-dep php5

Cent OS必須環境

Cent OS必須環境の設定
sudo rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm

# phpがない場合
sudo yum install --enablerepo=webtatic php php-xml
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo rpm -Uvh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo yum install --enablerepo=rpmforge re2c libmhash

PHPBrewのインストール

PHPBrewをダウンロードしてください:
curl -O https://raw.github.com/c9s/phpbrew/master/phpbrew
chmod +x phpbrew
sudo cp phpbrew /usr/bin/phpbrew

基本用法

まずはシェル環境にbash scriptをInitします。
$ phpbrew init
そして次の行を.bashrc または.zshrc ファイルに追加します:
$ source ~/.phpbrew/bashrc
既知のバージョンを一覧表示します:
$ phpbrew known
Available stable versions:
    php-5.3.10
    php-5.3.9
    php-5.3.8
    php-5.3.7
既知のサブバージョンを一覧表示します:
$ phpbrew known --svn
古いバージョン(5.3以前)を一覧表示します:
$ phpbrew known --old

ビルド(build)とインストール

簡易にデフォルトバリアントのPHPをビルドとインストールします:
$ phpbrew install php-5.4.0 +default
こちらではdefault VARIANTセットをお薦めします。デフォルトセットは常用のVARIANTクラスを収録しています。最小限インストールの場合、default VARIANTセットを削除してください。
テスト:
$ phpbrew install --test php-5.4.0
debugメッセージ:
$ phpbrew -d install --test php-5.4.0

バリアント(variants)

PHPBrewはConfigureオプションを管理できます。VARIANTのクラス名を指定するだけで、PHPBrewはincludeパスとオプションを検知します。
PHPBrewは常用のVARIANTクラスを収録し、デフォルトのVARIANTセットを提供しています。 収録されているVARIANTクラスを確認するには、簡単にサブコマンドvariantsを実行して一覧表示を確認できます:
$ phpbrew variants

Variants:
    pear
    mysql
    debug
    sqlite
    pgsql
    cli
    apxs2
    cgi
    soap
    pcntl
    ... (etc)
最新のPHPBrewは2つのVARIANTセットを提供しています:
  1. default (最も常用のバリアント, 例えば:filter bcmath ctype fileinfo pdo posix ipc pcntl bz2 cli intl fpm calendar sockets readline, zip)
  2. dbs (sqlite, mysql, pgsql, pdo)
例:
$ phpbrew install php-5.4.5 +default+dbs
それ以外のVARIANTクラスのPHPをビルドすることも可能です:
$ phpbrew install php-5.3.10 +mysql+sqlite+cgi

$ phpbrew install php-5.3.10 +mysql+debug+pgsql +apxs2

$ phpbrew install php-5.3.10 +mysql +pgsql +apxs2=/usr/bin/apxs2
PDOはデフォルトで起動されています。
PHPとpgSQL (Postgresql)拡張モジュールをビルドします:
$ phpbrew install php-5.4.1 +pgsql
あるいはpostgresqlのベースディレクトリを生成してpgSQL拡張モジュールをビルドします:
$ phpbrew install php-5.4.1 +pgsql=/opt/local/lib/postgresql91
注意点:
  1. apacheのphpモジュールをビルドする場合、 モジュールディレクトリのパーミッションを変更してください。 例:/opt/local/apache2/modules/。 パーミッションは書き込む可能です。PHPBrewはパーミッションを変更することができます。 インストールした後、httpd.conf設定ファイルを確認し、PHPモジュールを切り替わってください。
  2. 現時点PHPBrewはapxs2 (apache2)しか支援しません。 複数のPHPをインストールした環境の下でapxs2 VARIANTを有効化したなら、apacheのconfファイルは以下のように示されています:
# LoadModule php5_module        modules/libphp5.3.10.so
# LoadModule php5_module        modules/libphp5.4.0.so
# LoadModule php5_module        modules/libphp5.4.0RC8.so
# LoadModule php5_module        modules/libphp5.4.0RC7.so
# LoadModule php5_module        modules/libphp5.4.1RC2.so
# LoadModule php5_module        modules/libphp5.4.1.so
# LoadModule php5_module        modules/libphp5.4.2.so
LoadModule php5_module          modules/libphp5.4.4.so
コメント化や非コメント化を利用して簡単にphp5 apacheモジュールを無効化/有効化にすることができます。 編集したあとは必ずapache http サーバーを再起動してください:)

エクストラオプション

エクストラconfigure引数を渡すには、以下のようにしてください:
$ phpbrew install php-5.3.10 +mysql +sqlite -- \
  --enable-ftp --apxs2=/opt/local/apache2/bin/apxs

使用と切り替え

使用 (switch version temporarily):
$ phpbrew use php-5.4.0RC7
切り替え (特定のバージョンをデフォルトとして切り替えます)
$ phpbrew switch php-5.4.0
終了:
$ phpbrew off

インストールされたPHPを一覧表示します

$ phpbrew list

PHPから拡張モジュールをビルドとインストール

(インストール手順の後):
phpbrew install-ext pdo
phpbrew install-ext mcrypt --with-mcrypt=/opt/local

拡張モジュールを有効にします

pecl install mongo
phpbrew enable mongo
enable コマンドはconfig {current php base}/var/db/{extension name}.iniを作成し、拡張モジュールを有効にします。

PHPBrewのアップグレード

PHPBrewをアップグレードする場合、 self-update コマンドを実行するだけで済みます。 このコマンドは最新バージョンのgithubのmaster branchをインストールすることができます:
$ phpbrew self-update

インストールされたPHPファイル

インストールされたPHPファイルは~/.phpbrew/phpに置かれます。例えば、php 5.4.0RC7の場合は:
~/.phpbrew/php/5.4.0RC7/bin/php
設定ファイルは以下の位置に置く必要があります:
~/.phpbrew/php/5.4.0RC7/etc/php.ini
拡張モジュールの設定ファイルは下記の位置に置く必要があります:
~/.phpbrew/php/5.4.0RC7/var/db
~/.phpbrew/php/5.4.0RC7/var/db/xdebug.ini
~/.phpbrew/php/5.4.0RC7/var/db/apc.ini
~/.phpbrew/php/5.4.0RC7/var/db/memcache.ini
... etc

system-wide環境のPHPBrewインストール:

まずは、sudoをルートユーザにする、またはルートユーザでログインします:
sudo -i
そしてPHPBrewのbashrcを初期化します:
phpbrew init
PHPBrewのパスを指定のパスにエクスポート(export)してから、 ~/.phpbrew/init を編集してください。
export PHPBREW_ROOT=/opt/phpbrew
PHPBrew bashrcをソース(source)する。
source ~/.phpbrew/bashrc
インストールsystem-wide PHP:
phpbrew install php-5.4.5 +default +dbs
これでPHPファイルは /opt/phpbrew の下にインストールされました。 PHPBrewがビルドしたPHPをユーザーに使用させるには、bashユーザーがphpbrew/bashrcを読み込む前にPHPBREW_ROOT 環境を/etc/bashrc または/etc/profile.d/phpbrewにエクスポートする必要があります。。
export PHPBREW_ROOT=/opt/phpbrew
source /opt/phpbrew/bashrc
システムの安定を保つため、rootを使ってPHPをインストールしてください。
非ルートのユーザーは新しいPHPをインストールまたは切り替えることができません。
ファイルは非ルートユーザーでインストールする場合、パーミッションを修正してください。
chown -R root: /opt/phpbrew

バージョン情報プロンプトの有効化

PHPバージョン情報をシェルプロンプトに追加するには、"PHPBREW_SET_PROMPT=1" 変数を利用してください。
デフォルトは"PHPBREW_SET_PROMPT=0" (無効化). 有効化にする場合、~/.phpbrew/bashrcをソースする前に、下記の行を~/.bashrc ファイルに追加してください。
    export PHPBREW_SET_PROMPT=1
バージョン情報をプロンプトに埋め込む場合、current_php_version シェル関数を利用してください。この関数は.phpbrew/bashrcの中に定義されています。 そしてバージョン情報をPS1変数に設定することができます。 例:
    PHP_VERSION=$(current_php_version)
    PS1=" $PHP_VERSION \$ "

既知の問題点:

ハッキング(Hacking):

まずはOnionをインストールしてください:
$ curl http://install.onionphp.org/ | sh
依存性(dependency)インストール:
$ onion -d install
初期化:
$ php bin/phpbrew init
既知のバージョンを一覧表示にします:
$ php bin/phpbrew known
インストール:
$ php bin/phpbrew -d install --no-test 5.4.0RC7
PHPBrewが実行している動作を表示します:
$ unset -f phpbrew
$ which phpbrew
pharファイルをリコンパイルします:
$ bash scripts/compile

PHP配布先

コミュニティ

お気軽にirc.freenode.netにて#php-twの話題に参加してください。

協力者

  • yftzeng
  • Gasol

開発者

Yo-An Lin (c9s) cornelius.howl@gmail.com