HHVM的安装与解决SlowTimer问题

HHVM是Facebook推出的用来执行PHP代码的虚拟机,宣称在速度方面获得了显著改进,比目前使用的PHP解释器快60%,而使用内存减少90%。

OSX 上的安装比较简单,brew 就可以完成:

brew tap homebrew/dupes  
brew tap homebrew/versions  
brew tap mcuadros/homebrew-hhvm  
brew install hhvm  

Debian(7.0wheezy) 环境下的安装:

apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
echo deb http://dl.hiphop-php.com/debian wheezy main | tee /etc/apt/sources.list.d/hhvm.list
apt-get update
apt-get install hhvm

由于 dl.hhvm.com 在国内无法访问,因此需要替换成 dl.hiphop-php.com
其他 Linux 环境下的安装可以参考官方 wiki

创建 composer 的 alias:

# ~/.bashrc
alias composer="hhvm /usr/local/bin/composer"  

实际使用的时候碰到了一个问题,在执行 composer 安装第三方包的时候经常会提示 SlowTimer 警告,幸好老外已经有了临时的解决方案,修改 composer 的 alias:

alias composer="hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 /usr/local/bin/composer"

BASH下批量替换line endings

从windows上拷贝过来的原文件和linux上的line endings不同,导致git提交的时候产生一推修改,其实bash下只要简单的转换一下line endings就立即让git清爽了很多
首先安装dos2unix:

sudo apt-get install dos2unix

然后就可以执行:

find . -name "*" -type f -exec dos2unix {} \;

vagrant 使用笔记

最近试用了一下vagrant,确实得佩服一下ruby社区的创造力,vagrant对于搭建开发环境简单到像过家家一样,本地开发于虚拟机结合的巧妙而又顺畅。以下只是我个人的一些总结纪录。
官方网站:http://www.vagrantup.com/
镜像box:http://www.vagrantbox.es/ 国内访问不是很快 安装好后就可以:

$ vagrant init precise32 http://files.vagrantup.com/precise32.box
$ vagrant up

vagrant ssh //连接虚拟机的ssh
vagrant up //开机
vagrant halt //关机
vagrant reload //重启

vagrantfile配置文件,比较重要的就是forwarded_port

config.vm.network :forwarded_port, guest: 6379, host: 6379
config.vm.network :forwarded_port, guest: 3306, host: 3306

这样配置后,就可以使用127.0.0.1:3306连接mysql,6379连接redis了,如同本地环境一样
另外就是共享目录:

config.vm.synced_folder "~/Dropbox/www", "/www"

这样就能直接在/www进行开发了。

Webdis 学习笔记(二)Websocket

上一篇中提到webdis内带了一个websocket接口,下面就用来测试一下redis的PUB/SUB功能,实现“消息推送”。

新建一个websocket.html,内容如下:

<!doctype html>
<html>
<head></head>
<body>
    <script>
        var jsonSocket = new WebSocket("ws://127.0.0.1:7379/");
        jsonSocket.onopen = function() {
            console.log("JSON socket connected!");
            jsonSocket.send(JSON.stringify(["SUBSCRIBE", "test"]));
        };
        jsonSocket.onmessage = function(messageEvent) {
            console.log(messageEvent.data);
        };
        jsonSocket.onclose = function() {
            console.log("JSON closed");
        };
    </script>
</body>
</html>


用Chrome打开并调出控制台,可以看到:

JSON socket connected! websocket.html:8
{"SUBSCRIBE":["subscribe","test",1]} 

开启一个redis-cli,输入:PUBLISH test "this is new content",回车;

Chrome控制台将立即输出 {"SUBSCRIBE":["message","test","this is new content"]}

PUSH Message 就是这么简单~

Webdis 学习笔记(一)安装

webdis 是一个简单的 Web 服务器,提供了 HTTP 接口来访问 Redis 服务器。

安装方法比较简单,官方网站上有写:


git clone git://github.com/nicolasff/webdis.git
cd webdis
make
    

编译好后先不急着执行,修改编译目录下的 webdis.json,修改


"daemonize":    true,
"websockets":   true,
    

第一行是将webdis以守护进程方式运行,第二行是开启websockets支持。 运行:./webdis 之后就可以用HTTP接口操作redis,默认端口7379,测试:

浏览器直接访问 http://127.0.0.1:7379/SET/key/value

或者shell: $ curl "http://127.0.0.1:7379/SET/key/value"

再或者PHP:


<?php
$url = "http://127.0.0.1:7379/SET/key/value";
echo file_get_contents($url);
    

返回结果: {"SET":[true,"OK"]}

顺便说一下,当前官方版本的websockets接口有个bug,当开启成功后就马上关闭了,导致无法接收之后的请求,幸好已经有人修复了这个问题,但还未合并至官方master。 如果想正常使用websockets,暂时可以使用这个git:https://github.com/dcosta72/webdis 或者手工修改websocket.c后再编译:
修改:

/* send WS frame */
r = http_response_init(cmd->w, 0, NULL);
if (r == NULL)
    return -1;

为:

/* send WS frame */
r = http_response_init(cmd->w, 0, NULL);
if (cmd_is_subscribe(cmd)) {
    r->keep_alive = 1;
}
    if (r == NULL)
        return -1;