Gravatar头像被墙完美解决方案

最近朽木所在的电信商把0.gravatar.com给墙J了,虽说启用了多说的插件,但是后台的工具条老是一个大的叉叉,网上提供的无非是缓存/插件/修改程序代码,但是弊端很大,缓存的方式肯定要占用不必要的服务器资源,修改程序代码的话,随着Wordpress更新,每次都需要修改,朽木之前就是手动修改成了www.gravatar.com,参见Gravatar头像分流服务被墙的纠结,但是被更新包覆盖掉了。

朽木发现多说调用的头像可以正常显示,原来多说专门架设了一台Gravatar的中转服务器,为了节省带宽那么他必然要启用一定的缓存机制,那么Wordpresser们的福音来了,只需短短几行代码就可以彻底告别Gravatar别墙的困扰。

完美解决方案

gravatar-wordpress

编辑当前主题的functions.php文件,在底部加入

//头像使用duoshuo缓存
function get_avatar_deadwood( avatar ) {avatar = preg_replace( "/http:\/\/(www|\d).gravatar.com/","http://cdn.v2ex.com/gravatar",avatar );
  returnavatar;
}
add_filter( 'get_avatar', 'get_avatar_deadwood' );

从来没有在多说上出现过的头像会有一小会的延迟,不过缓存之后凭借着不到20MS的服务器速度,根本感觉不到页面加载了大量头像了。

近来gravatar被封杀的越来越厉害,大家全部都把流量“送给”多说也有点不人道,其实我们还可以用其他的第三方缓存例如https://ruby-china.org 和 https://cdn.v2ex.com/gravatar/(前缀不一致,需修改代码),另外官方的http://cn.gravatar.com 和 https://secure.gravatar.com 也都是可用的,速度尚可。

多说已经失效,目前改为v2ex的CDN,测试正常

朽木

PHP框架之Yaf框架入门

框架的存在主要意义就是提高程序员的开发效率,同时也带来性能上的一部分损失。
当前开发面向对象已经成为主流,同时为了规范开发使用MVC模式已经成为了一种趋势,当前市面上的框架非常之多,大部分也是MVC模式,但是相对来说对于PHP性能都一定的损失。

那么有没有一种框架既能满足开发效率,又尽可能少的减少性能的损失呢?于是Yaf框架面世。
Read more

一种病

大龄未婚青年基本可以分为两种,一种是各方面条件太差实在找不着对象的,一种是各方面条件太好所以找不着对象的。

大部分家长都认为自己的孩子是后一种。

其实对于我们“孩子”辈的人来说,具体情况并非这么简单,在长期接触各种大龄单身文艺青年之后,我发现,他们之所以单身,好多人都是因为得了一种病。

其实无论从表面上看,他们是属于文艺圈的人或者是搞学术的,又或者是“挨踢”界的,都一样。只要看的某一类型的电影、读的某一类书、或者听过的某一类的歌达到了一定的数量,就会发生质变,让这一类人在不知不觉中感染一种病,这种病的症状很多,但基本可以概括为:大龄文艺青年为鸡毛蒜皮点的小事互相看不顺眼以至于老死不相往来综合症
Read more

血色浪漫

郑桐和蒋碧云并肩坐在村口打谷场一个石头碾子上,两人久久地沉默着,突然,郑桐开始抽 泣起来。
蒋碧云大惊,这是她笫一次看见郑桐流泪,她惊慌地把手放在他的肩上∶ “郑桐,你怎么 啦?”
“这日子……真没盼头。”
“大家不是都这么过吗?”
“人……就怕没有希望,这么活着有什么意思?”
“郑桐,你从来都是乐观的人,今天怎么变得这么消沉?这可不象你。”
“你不知道,我想上大学,连做梦都想,可今天我去公社一问,被选上的工农兵学员都出发 了,当时我就觉得眼前一片漆黑,心里所有的希望都破灭了。”
蒋碧云说:”可你不能放弃希望,我就不信,咱们会永远呆在这小山村里,机会总会有的。 ”
郑桐心灰意冷地说:”机会见了我,恐怕也会绕着走,我这个人运气不太好。”
“要是有一天,机会到了你眼前,你却无法抓住它,因为你不具备抓住机会的本领,到那时 候,你将无话可说。”
郑桐沉默。
“我知道,你的精神状态很糟糕,生活艰难,前途无望,还有……你很孤独。”
郑桐低声道:”是的,是一种灵魂的孤独,漫漫长夜,我在独自行走,何处是归程……”
蒋碧云轻声说:”如果心中有了爱情,也许情况会好得多,那时你会觉得温暖,觉得有了依靠,觉得灵魂不再孤独,觉得生活从此充满了色彩。”
“可我眼前是个没有色彩的世界,只有缺少植被的黄土。”
“郑桐,你不想对我说点儿什么?”
“我万念俱灰,实在提不起兴趣说话。”
蒋碧云扳过郑桐的肩膀,注视着他的眼睛说:”那我说,你听好,我想向你提个建议。”
“你说。”
“一个人走夜路实在太孤单,两个人结伴而行不是更好吗?”
郑桐睁大了眼睛:”你的意思是,和我一起走?”
“是的,咱们一起走夜路,一起抵御孤独,一起寻找光明,你愿意吗?”
郑桐背过身去,不吭声了,蒋碧云温柔地从后面轻轻抱住他。
两行热泪从郑桐的眼中流出……

解决 THttpClient: Could not read xx bytes from sandbox.evernote.com:443//edam/user

PHP Lib – THttpClient: Could not read xx bytes from sandbox.evernote.com:443//edam/user
1#.
I’m having problem instantiating evernote cloud API client. I get the following exception dump (original lib and root path are replaced)
Uncaught TTransportException: exception ‘TTransportException’ with message ‘THttpClient: Could not read 1013476926 bytes from sandbox.evernote.com:443//edam/user’ in /php_lib_path/evernote/transport/THttpClient.php:156
Stack trace:

#0 /php_lib_path/evernote/transport/TTransport.php(87): THttpClient->read(1013476926)
#1 /php_lib_path/evernote/protocol/TBinaryProtocol.php(207): TTransport->readAll(1013478509)
#2 /php_lib_path/evernote/packages/UserStore/UserStore.php(75): TBinaryProtocol->readMessageBegin(NULL, 0, 0)
#3 /php_lib_path/evernote/packages/UserStore/UserStore.php(42): EDAM\UserStore\UserStoreClient->recv_checkVersion()
#4 [internal function]: EDAM\UserStore\UserStoreClient->checkVersion('Evernote EDAMTe...', 1, 25)
#5 /php_lib_path/evernote/Evernote/Client.php(142): ReflectionMethod->invokeArgs(Object(EDAM\UserStore\UserStoreClient), Array)
#6 /wwwroot/evernote/EDAMTest.php(66): Evernote\Store->__call('checkVersion', Array)
#7 /wwwroot/evernote/EDAMTest.php(66): Evernote\Store->checkVersion('Evernote EDAMTe...', 1, 25)
#8 {main}

I have tested that the script works on my local environment. And in this testing environment, I have double checked that
1- OpenSSL is open and PHP support is enabled and supported
2- Trying to connect to evernote production environment (with sandbox => false) also failed

解决问题:
3#.
Hi, it appears that my production is running PHP 5.3 while my local environment runs 5.4, hence the user_agent could not be set correctly. Adding

ini_set("user_agent", "PHP/THttpClient\r\nAccept: application/x-thrift\r\nContent-Type: application/x-thrift");

solves the problem