前几天看到新浪微博的微博平台微博id升级公告,也没怎么注意.感觉就是存储上要用string代替int,浪费点空间.对php应用应该没什么影响.
倒是新浪微博的32位id这么快就不够用了,让人感叹微博发展的神速.

今天搜索一些关键字,打开微博页面时,老是报告页面找不到.才发现,这玩意还真有影响.
那些打不开的页面的URL是这样的”http://api.t.sina.com.cn/1941569665/statuses/3.3430536723516E+15″.
Google上查了一下,发现是php的json_decode函数不支持62位的BIGINT, 溢出所致.
在新的php(5.4?) json_decode里倒是有一个开关”JSON_BIGINT_AS_STRING”开关,可以使json_decode默认把BITINT当成string处理.
但是相信大家和我一样,更新php的版本的速度不会有那么快.而且大部分情况下,咱们也控制不了具体使用哪个php版本.

一个折中的办法是把微博API返回的json字符串预处理一下,然后再调用json_decode.
也就是把
“id”:12345678901234567890
换成
“id”:”12345678901234567890″

代码片段如下,希望对和我类似情况的人有用.

if (define('JSON_BIGINT_AS_STRING')) {
	$json = json_decode($data, false, 512, JSON_BIGINT_AS_STRING);
}else{
	//convert bigint to string
	$data = preg_replace('/"id":([0-9]+)/', '"id":"$1"', $data);
	$json = json_decode($data, false);
}

参考: http://drupal.org/node/985544

相关文章

    共享到: