PR(全称PageRank)是Google衡量一个网站的重要标准之一,从而影响Google搜索结果排名。Google官方提供了查询PR的API,如本站PR值:
http://toolbarqueries.google.com.hk/tbr?client=navclient-auto&features=Rank:&q=info:phpddt.com&ch=8fabc62ea
Google PR值查询原理及其简单,只要获取如上接口返回的值处理下就OK了:
/*
*功能:对URL进行编码
*参数说明:$web_url 网站URL,不包含"http://"
*/
function HashURL(/blog_article/$url/index.html)
{
$SEED = "Mining PageRank is AGAINST GOOGLE’S TERMS OF SERVICE. Yes, I’m talking to you, scammer.";
$Result = 0x01020345;
for ($i=0; $i<strlen($url); $i++)
{
$Result ^= ord($SEED{$i%87}) ^ ord($url{$i});
$Result = (($Result >> 23) & 0x1FF) | $Result << 9;
}
return sprintf("8%x", $Result);
}
/*
*功能:根据google提供的pr查询接口获取pagerank
*参数说明:$domain 网站域名,不包含"http://"
*/
function pagerank($domain)
{
$StartURL = "http://toolbarqueries.google.com/tbr?client=navclient-auto&features=Rank:&q=info:";
$GoogleURL = $StartURL.$domain. '&ch='.HashURL(/blog_article/$domain/index.html);
echo $GoogleURL.'<br>';
$fcontents = file_get_contents("$GoogleURL");
$pagerank = substr($fcontents,9);
if (!$pagerank) return "0";else return $pagerank;
}
echo pagerank("phpddt.com");
?>
值得注意的是该接口需要获取一个ch的值,已有HashURL()解决,但是该代码传到服务器Linux 64上出现了int overflow溢出问题,可用如下代码解决:
if (PHP_INT_SIZE <= 4) {
settype($n, 'float');
if ($n < 0)
$n += 4294967296;
return $n;
}
else
{
$clearbit = '';
for ($i = 0; $i < PHP_INT_SIZE - 4; $i++) {
$clearbit .= '00';
}
for ($i = 0; $i < 4; $i++) {
$clearbit .= 'ff';
}
return ($n & hexdec($clearbit));
}
}
查看演示
本文链接:http://www.cnblogs.com/phpddt/p/3291183.html,转载请注明。
本节内容:
一个php导出文档的类
例子:
<?php
/**
* 生成word文档的类
*
*/
class word
{
function start()
{
ob_start();
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">';
}
function save($path)
{
echo "</html>";
$data = ob_get_contents();
ob_end_clean();
$this->wirtefile ($path,$data);
}
function wirtefile ($fn,$data)
{
$fp=fopen($fn,"wb");
fwrite($fp,$data);
fclose($fp);
}
}
//导出的程序文件
//导出 ---start---
require SITE_ROOT.'include/word.class.php'; //类文件放在根目录下的include文件夹下
$word = new word();
//查询数据填入word 中
$result = $db->query("SELECT * FROM ".DB_PRE."box where status='9' order by boxid DESC");
while($r = $db->fetch_array($result))
{
$r['orderinfo'] = $db->get_one("SELECT * FROM ".DB_PRE."order where orderid='".$r['orderid']."'");
$r['wrapinfo'] = $db->get_one("SELECT * FROM ".DB_PRE."wrap where orderid='".$r['orderid']."'");
$boxlist[] = $r;
}
foreach($boxlist as $key=>$val){
$order->UPCAbarcode($val['box_code']);
$html .='<table width=800 cellpadding="6" align="center" cellspacing="5" bgcolor="#000000">
<tr bgcolor="White" height="50">
<td width=80 >iGo运<br/>单号</td>
<td width=300 ><img src='/blog_article/.$val['iGocode_code'].' /><br/> '.$val['box_code'].'</td>
<td width=60 >日期</td>
<td width=100 >'.date('Y-m-d',$val[create_date]).'</td>
<td width=100 >标示<br/>姓名</td>
<td width=240 >'.$val[code].'/'.$val['orderid'].'<br/>'.$val['orderinfo']['user_name'].'</td>
</tr>
<tr bgcolor="White">
<td width=60 >件数</td>
<td width=40 >3</td>
<td width=40 >重量</td>
<td width=150 >56.5</td>
<td width=40 >品名</td>
<td width=390 >咬咬了,吸盘碗,学饮杯,鱼干油</td>
</tr>
<tr bgcolor="White">
<td width=110 >服务<br/>类别</td>
<td width=200 >库房服务</td>
<td width=110 >服务<br/>要求</td>
<td width=280 >合小箱</td>
</tr>
<tr bgcolor="White">
<td width=120 ><br/><br/>客户<br/>备注<br/><br/></td>
<td width=580 >'.$val['orderinfo']['beizhu'].'</td>
</tr>
<tr bgcolor="White">
<td width=120 ><br/><br/><br/>到货<br/>情况<br/><br/><br/><br/></td>
<td width=580 >什么问题?果点不到<br/>什么问题?果点不到<br/>什么问题?果点不到<br/><br/><br/><br/><br/><br/><br/><br/></td>
</tr>
</table> <br/><br/><br/><br/>
';
}
$word->start();
$filename = '拣货单导出.doc';
echo $html;
$word->save($filename);
//文件的类型
header('Content-type: application/word');
header('Content-Disposition: attachment; filename="拣货单导出.doc"');
readfile($filename);
ob_flush();
flush();
exit();
//导出word --end--
1、提交按钮置disabled
当用户提交后,立即把按钮置为不可用状态。这种用js来实现。
提交前
$("#submit").attr('disabled','true');
$("#submit").val("正在提交,请稍等");
....................................................................................
执行后,把按钮置为原来状态
$('#submit ').removeAttr('disabled');
$("#submit ").val("确定提交");
2、过期时间法
思路:当用户提交按钮后生成一个token(每次业务提交token 为唯一值)存入session,并设置过期时间。当用户再此提交时,检测token是否一致且是否过期,若一致且没有过期,则认为提交了二次。当程序执行出错的时候,则需要清除存入session的值。见下面程序
function checkRepeatSubmit($uniqueid = '', $expire = 30) {
$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid;
$token = md5("wms_check_repeat" . $uniqueid);
$time = time();
if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] == $token && ($time - $_SESSION['expire_time'] < $expire)) {
return false;
} else {
$_SESSION['token'] = $token;
$_SESSION['expire_time'] = $time;
//session写入的时候会等待整个页面加载完成,用此函数可以立即写入
session_write_close();
return true;
}
}
//删除存入的值
function cancelRepeatSubmit() {
unset($_SESSION['token']);
unset($_SESSION['expire_time']);
}
3、token销毁法
思路:当页面进行加装的时候生成token,存在session中,并写在表单里。表单提交的时候随表单提交给服务端,服务端通过session存入的token与token进行比较,若相等,则销毁seesion中存入的token,当页面遭到二次提交的时候,由于存入session中的token不存在而报错。下面是代码
/**
* 第二种方案
* 1、产生token,并存在session中
* 2、随页面生成
* 3、提交页面与session进行比对,成功后对session进行销毁
* 4、第二次提交则不存在这个值而报错
* @param type $uniqueid
* @return type
*/
function createToken($uniqueid) {
$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid;
$token = md5("wms_check2_repeat" . $uniqueid);
$_SESSION['form_token'] = $token;
session_write_close();
return $token;
}
function checkToken($token) {
if (!isset($_SESSION['form_token']) || empty($_SESSION['form_token']) || $_SESSION['form_token'] != $token) {
return false;
} else {
unset($_SESSION['form_token']);
return true;
}
}
上面总结了三种方法,个人感觉第一种跟第二种方法配合着用会达到更好的效果。第二种方法与第三种方法个人感觉第三种要有优势点。
第二种与第三种方法都是把token写在session中,这种方法好处是节省存储空间,但坏处是由于session是需要整个页面加载完毕才能写入,故当整个页面加载比较慢,且用户点击多次提交,可能由于session还没写入导致系统还认为是第一次输入。导致验证不起作用。好在php函数提供了一个牛逼的函数。 session_write_close(),可以立即把session写入,不用等待页面加载完成。同事对于session的存入也有很多种方法可以选择,可以存在redis,memcache或者数据库都可以的。