2,751 views / 2009.09.03 / 5:05 下午
我们经常看到一些文章或者评论的发表时间不是直接显示出死板的Y-m-d格式,而是算了一个时间差,如:发表于2分钟前,这样显得比较人性化,多用于一些非正式网站。下面提供JavaScript的实现方法:
var minute = 1000 * 60;
var hour = minute * 60;
var day = hour * 24;
var halfamonth = day * 15;
var month = day * 30;
function getDateDiff(dateTimeStamp){
var now = new Date().getTime();
var diffValue = now - dateTimeStamp;
if(diffValue < 0){
//非法操作
//alert("结束日期不能小于开始日期!");
}
var monthC =diffValue/month;
var weekC =diffValue/(7*day);
var dayC =diffValue/day;
var hourC =diffValue/hour;
var minC =diffValue/minute;
if(monthC>=1){
result="发表于" + parseInt(monthC) + "个月前";
}
else if(weekC>=1){
result="发表于" + parseInt(weekC) + "个星期前";
}
else if(dayC>=1){
result="发表于"+ parseInt(dayC) +"天前";
}
else if(hourC>=1){
result="发表于"+ parseInt(hourC) +"个小时前";
}
else if(minC>=1){
result="发表于"+ parseInt(minC) +"分钟前";
}else
result="刚刚发表";
? return result;
}
如果你得到的原始数据不是时间戳,可以采用下面的函数把字符串转换为标准时间戳, 它相当于JS版的strtotime,只不过精度不同罢了:
function getDateTimeStamp(dateStr){
return Date.parse(dateStr.replace(/-/gi,"/"));
}
1,343 views / 2009.09.03 / 12:12 上午
大数据网站的数据具有访问频率高,更新速度快,更新量大,不便于备份等特点,如果我们依然用传统的单服务器单数据库去构架,首先不能保证大流量访问,其次数据备份困难,再次数据出现故障不能及时修复,所以,我们从两个方面着手,本着低成本的原则,提出解决方案。
一 采用双网卡,内网外网分离,维护时内网操作,外网负载均衡后提供服务。采用主从数据库的方式。
目的:提高系统稳健性,降低单点故障给系统构成的影响。
前提:1. BIGIP自动识别异常服务器功能正常工作;2. 系统挂载的存储及数据库正常工作
方式:
1. web端的冗余
a) 唯一性数据存放在存储服务器上(模板、静态化文件、碎片等)
b)程序等多份数据(选择一台机器做为主机器,用rysnc进行程序更新以及分发),程序定期更新至svn。
2 . 数据库冗余
采用M-S模式,进行读写分离。在程序上进行控制,要是有一个出问题直接切回单机模式,来防止数据库机器损害带来的长时间停机。(应用程序修改大,需要较长时间,可以考虑进一步优化)
如图:

二 挂载双存储,每个存储分多个挂载点挂载到前端服务器。
如果系统存储只有一台服务器,如果出问题,会造成长时间服务中断,我们讨论出一套方案,可以使损失降到尽量小。
设存储一为s1,存储二为s2, 这两台都有三个挂载点,记为data1,data2,data3,我们把s1的data1,data2挂载在前端机器上,把s2的data3也挂载在前端机器上,同时每天把s1的data1,data2同步到s2, 把s2的data3同步到s1,保证两个存储数据尽量同步。
如图:

当故障发生时,比如s2宕掉,可以快速的把前端服务器的data3挂载改为s1的data3,这样只有最多一天的单个目录数据丢失,我们可以再对其进行简单的恢复操作。?
优点:1. 单存储负载被分担 2.线上已有产品程序不用调整 3.故障时处理迅速
缺点:故障恢复时,当天的部分数据可能会丢失。
2,229 views / 2009.09.01 / 8:08 下午
时代在进步,社会在发展,64位机的出现导致移位元算不再很轻易溢出,这固然是件值得高兴的事情,可在系统迁移中,忽然发现64位机器hash函数得出的结果居然与32位不一样,震惊之余赶紧研究算法在发现是移位运算符号的问题。
没办法,只好对系统进行判断,并针对64位机器重写了算法,代码如下:
if (exec("getconf LONG_BIT") == "32") {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$_hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$_hash = ($_hash << 4) + ord($apszData[$i]);
if (($x = $_hash &0xF0000000) != 0) {
$_hash ^= ($x >> 24);
$_hash &= ~$x;
}
}
return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
}
} else {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
if (($x = $hash &0xF000000000000000) != 0) {
$hash ^= $x >> 24;
$hash &= (~$x) &0xFFFFFFFF00000000;
}
}
$ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
$ret >>= 32;
$ret &= 0xFFFFFFFF;
return $ret;
}
}
如果你不知道hash函数的作用,请参阅 http://baike.baidu.com/view/20089.htm
1,542 views / 2009.09.01 / 6:06 下午
众所周知,刷新页面可以直接在html的head标签中使用如下代码:
<meta http-equiv="refresh" content="1; URL=http://www.71j.cn">
其中content中的数字1表示等待是时间(秒)
也可以使用php发送头消息:
header("location:http://71j.cn");
甚至可以使用js中window.location.reload()方法,但是我们在开发过程中发现,因为浏览器或者CDN等带有的缓存机制会使页面刷新后,数据得不到刷新。
解决办法如下:
function autorefresh(){
var s="&";
var href=window.location.href;
if(href.indexOf("t=")==-1){
if(href.indexOf("?")==-1) s="?";
window.location.href+=s+"t="+new Date().getTime();
}else{
window.location.href = href.replace(/t=[0-9]+/,"t="+new Date().getTime());
}
}
这样给url加上时间戳,可以有效解决本问题。
1,281 views / 2009.09.01 / 6:06 下午
随着Ajax的泛滥,有时需要我们从url获取变量进行用户交互,本函数提供了获取方法:
function getQuery(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r!=null) return unescape(r[2]); return null;
}
如需要从下面地址中获取id的值:
http://71j.cn/a.php?a=my&id=7&m=1
只需要在当前页面调用getQuery(“id”)即可。