2012
Jul
08

v8cgi 內建就有提供 socket 的 c 語言程式碼,雖然 google 都已經提拱 SContruct 的方式給我們自已編譯,可是我還是希望 v8cgi 可以像 php 一樣,我可以自已選擇要編譯的 extension ,並自已管理相關的 extension,在開始看這篇文章之前,你或許要參考我上一篇寫的「v8cgi 安裝」。

在上一篇文章中,我在安裝 v8cgi 時,刻意使用最簡易安裝,也就是非必要的 extension ,我都不裝,而這篇文章,就是為了說明如何編譯 v8cgi extension。

編譯 v8cgi socket

找一個 v8cgi 內建有的程式來試編譯 extension , 在下載回來的 svn trunk 中,路徑 「trunk/src/lib/socket」 可以找到 socket 的程式碼,編譯方式,與編譯 php extension 的方式大同小異,首先先將程式編譯成 .o 檔,然後再將 .o link 其他相關的 library ,變成 .so 檔。

編譯前,記得先參考上一篇文章,將內建的 library 先編譯過,這樣在 truck/src/ 的資料夾裡會看到,path.os、system.os 、 app.os 、 cache.os common.os 、 gc.os 、 bytestorage.os 等等, socket 會用到的 library 有 path.os 、 app.os 、 cache.os,common.os,bytestorage.os 這一些。

正式開始編譯 v8cgi extension 的 socket 吧,首先進入 src/lib/socket/ 的目錄然後輸入下列的編譯指令。

make socket mode=compile g++ -Wall -O3 -fPIC -Dposix -DDSO_EXT=so -DREUSE_CONTEXT -shared -I. -DHAVE_CONFIG_H -g -O2 -I./../../ -DHAVE_PTON -DHAVE_NTOP -c socket.cc -o socket.o

順利的建好 socket.o 之後,接著要將必要的 library link 起來,輸入指令如下, v8 與 pthread 是必備一定要的 lib , pthread 是編程相關的 library,v8 是 v8 engine library ,而其他的 connon, app ,path,bytestorage 等則是 v8cgi 相關的 library。

make socket.so g++ -shared -lpthread -lv8 -lrt -ldl -o socket.so socket.o ../binary/bytestorage.os ../../common.os ../../app.os ../../path.os ../../cache.os

最後會編譯成 socket.so 再將這個 socket extension 搬到指令的目錄即可。

Socket ClientRequest

ClientRequest 就像 php 的 curl 一樣,可以取得某個 url 的 html 資料,這個 class 內建必須要有 socket extension的支援,才能運作,剛剛我已經建立好 socket extension了,所以我寫一段簡單的 javascript 來測試 socket 是否能正常的運作。

  • http_request.sjs
  1. var http = require("http");
  2. var client = new http.ClientRequest("http://www.yahoo.com.tw/");
  3. var response = client.send(true);
  4. system.stdout(JSON.stringify(response.headers(), false, " "));
  5. system.stdout(response.data.toString("utf-8"));
  • v8cgi http_request.sjs : 執行這個指令後,會印出網頁的全部 html code 與 header。

回應 (Leave a comment)