之前以为PHP的ob函数无法在gzip的时候获得内容长度,简单地改了Twip的代码,使之不报告Content-Length。今天偶然搜索Gravity的相关内容,看到
@empyreaner君提供的获取Content-Length方法:
Ob_Start();
Ob_Start(‘ob_gzhandler’);
echo $content;
Ob_End_Flush();
header(“Content-Length: “.ob_get_length());
Ob_End_Flush();
此法甚为巧妙,PHP手册也有一句:Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active.只恨自己阅读太不仔细,遂写此文以志之。
前段时间做的都是Rek.me网址缩短服务方面的工作,网络书签相关的功能至今没有做好,精力都花在了考虑是否应该进一步优化速度。方法自然是用C编写lighttpd插件。不过技术水平好像还不怎么成熟。
闲余的时间里架了个推特中文圈Twitese,还有一个网页版代理glype。Twitese是个基于PHP的Twitter工具,用它可以直接收发tweets,有完整的中文界面,并且还可以任意指定使用的API,让不翻墙而使用Twitter成为可能。其作者bang590是一个07级的本科生,代码写得很规范,结构性也很强,真是英雄出少年。glype是个网页版的代理访问工具,基于PHP的cURL函数库,能把指定网页完全抓下来,并实现链接、图片路径的完全替换,支持plugins,是代理访问的理想工具。
部署好之后的时间自然是努力整合这些东西的应用。已经把Twitese的网址缩短加入了Rek.me的服务,而twitpic.com的图片更是直接用glype打开。可惜后来发现功夫网还能根据关键字触发拦截,为了避免Rek.me被墙,只好先不推而广之。目前正苦苦思索解决之道,想来base64是最简便有效的方法,可是在客户端做base64_encode毕竟还是需要更复杂的脚本,所以也一直没动。另一个办法是利用SSL,不过这意味着我不得不再花几十美刀购买SSL证书。
今天看到Twitese项目上有带新浪微博同步的版本出现,于是下载下来试用,发现没能真正同步。于是用SVN对比了一下文件,发现居然只有设置页面多了新浪微博帐号密码设置的表单,没有实质的同步功能代码,看来八成还得自己写。
rek.me已经做好几天了,使用起来感觉还不错。随便看到哪个网站好的,直接在地址栏http前面加上rek.me/就可以生成一个微缩过的地址,非常方便,以致于我都有点不想做工具栏按钮了。
今天准备为rek.me加入owner信息,这样网址微缩就可以变成网络书签了。考虑到操作简便性的要求,就直接在第一次使用的时候生成一个md5的uuid,然后setcookie一年,这样甭管多会上来都不用登录。而以后加入OpenID支持也就把OpenID URL和uuid对应一下完事。哪知道coding完毕之后,根本就用不了,随便换个网址,uuid就被重设。用Firebug又可以看到response header中正确的cookie设置,怪哉~~
于是慢慢排查,发现rek一个网址之后不关标签,只改个把字符再发请求,cookie就会发回给服务器。但是如果新开一个网站,然后再rek它,cookie就会被重设了。起初我以为是Firefox的问题,可换了Google Chrome也还是这样,完全搞不懂为什么——浏览器应该会跨页面传递COOKIE的啊。
之后偶然发现,不同网站的址在同一标签中也会导致cookie重设,于是恍然大悟。因为rek.me创建微缩网址的方式是使用http://rek.me/http://guangxin.name这样的地址,会导致浏览器认为请求的域名是guangxin.name,与rek.me是不同的域,所以rek.me下的cookie不予发送。
一个解决方法是urlencode,如果请求是http://rek.me/http%3A%2F%2Fguangxin.name这样的地址,浏览器就会认为后面的http…是URL的一部分,域名还是rek.me,cookie就能正确发送了。不过很难要求用户自己手动完成urlencode操作,看来直接在地址栏rek.me/的方法不好用了,还是得单独用Javascript做一个Short&Bookmark的按钮。
一直在想做点什么有意思的东西好,于是加入网址缩短服务的大潮,难得自己有个把够短的域名。现在基本服务已经完成,可惜还是基于MySQL的,等把TokyoCabinet研究清楚了,再升级好了。现在已经支持Ajax创建接口,不过还不支持历史追踪。
目前使用的算法能把网址缩短到域名后六个字节,核心部分使用到md5和base64技术。基本来说就是这样两句:
$key = substr(base64_encode(md5($url, true)), 0, 6);
$key = str_replace(array(‘+’,'/’,'=’), array(‘-’,'_’,』), $key);
第二句是为了把URL中需要被再次编码的+和/替换成-和_,而=一般只会出现在末尾,去掉它。
最后,配置好服务器的rewrite就OK了。
用http://rek.me/<YOUR URL>创建一个短网址,比如http://rek.me/http://guangxin.name,创建出来的shorten就像这样:
http://rek.me/PFqVsv
今天收到电子邮件,说FTP发布服务已经成为Blogger.com发展的障碍,很多新的功能无法惠及FTP发布的用户,而且用FTP发布的用户只占0.6%。新版本的blogger平台将不再向FTP发布技术兼容。今年三月二十六日,FTP发布将从blogger.com移除。建议持有自己域名的用户改用自定义域的方式发布。
我只能表示悲哀,Blogger.com的决定是没错的,因为在全世界大多数国家,没有使用FTP发布的必要。但是在中国这样一个有墙国家,通过FTP发布成为让普通网民可以访问的唯一途径。
下一步该怎么转换我的Blog还没有想好,不少朋友推荐Wordpress。不过我觉得这个东西实在不保险,天知道哪天被墙。另外也在考虑自己开发一个Blog发布系统,不过工作量似乎挺大,意义却不大。