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)