导航:首页 > 网站优化 > php分页类seo

php分页类seo

发布时间:2020-08-15 20:07:28

1、如何解决网站分页导致的SEO问题?

一、网站分页对SEO优化的影响
1、大量重复内容,页面标题与URL意义多样化。
2、页面图片ALT属性的确定与添加,网页加载服务器可能加大负载。
3、增加用户的无效点击,页面停留时间短,跳出率高。
4、页面核心内容相关性与下一页承载关系容易混乱,会导致索引擎抓取收录出错。
5、分页会导致分散链接,锚文本,PageRank的目标页面指向,让搜索引擎不好判断第几页作为权重传递页面。
二、解决网站分页SEO优化问题的方法技巧
1、由于分页产生的大量重复内容,特别是在网页标题上的重复是最明显的,例如我们使用比较多的程序dedeCMS和wordpress都会遇到分页的这个问题,虽然有不少朋友会注意到这个问题,但是还是有不少网站会忽略了这个问题。
当然,这一点可能有点吹毛求疵,但是要想为了网站的长远发展,这些细节也是需要我们多加注意的,对于这个问题,其解决思路很简单,那就是让每个页面标题产生差异性,在此,建议大家可以将标题可以书写为“栏目标题+第几页+网站标题”,对于正在使用织梦CMS后台管理系统栏目列表分页的解决方案就是修改成以下调用代码:
{dede:field.title/}{dede:pagelist listitem=”pageno” listsize=”0″ function=”html2text(@me)” runphp=”yes”}if (strlen(@me)>10 || @me==1) @me=”";else @me=” – 第”.str_replace(‘ ‘,”,@me).”页”;{/dede:pagelist} – {dede:global.cfg_indexname/}
而对于wordpress来说一个很好的解决方案就是使用All in One SEO Pack插件,至于其他的后台管理程序系统我还没有发现更好的解决方案,等有了比较利于seo优化的方法,我会上跟大家再分享的。
2、针对“页面图片ALT属性的确定与添加,网页加载服务器可能加大负载。”的问题。这就不得不说下一些图片网站了。因为分页用到最多的就是图片资讯,这里面涉及到两个问题,一个分页造成工作人员的工作量有可能增加,另外,虽然单页的加载速度加快了,但是却占了网站服务器的大量存储,太多这样的页面必然会对网站的性能造成影响,而性能优化是对网站在硬件上的基本要求了,关于这方面我在此就不多说了,对于具体如何提高网站速度这块。
3、通常,我们会希望用户着陆页在分页的“第一页”的页面上,而不是在中间的第二页第三页上。实际情况是你可能会发现一些页面关键词排名良好的是分页里面的某一个页面,而不是你选择的那个着陆页。如果这些目标排名网页不能满足用户查询需求,这将影响网站的点击率和跳出率。
而针对用户的无效点击和停留时间,跳出率高的问题,由于完全需要根据用户的喜好,而且搜索引擎对于这一部分的算法也是非常模糊的,我们不知道度如何控制跳出率,让网页更符合搜索引擎的要求,这里的不可控性因素太强,所以我们在这一点上唯一可做的就是讨好用户,通过精美的内容来吸引用户停留,个人觉得可以参考的有三点:
(1)、内容充实,排版清晰,为用户减少阅读负担;
(2)、图片精美,在图片上吸引用户点击和停留;
(3)、站内的引导,避免流量直接跳出损失。
4、对于“页面核心内容相关性与下一页承载关系容易混乱,会导致索引擎抓取收录出错。”的问题,目前还都没有比较好的方法来解决,尤其是页面核心内容的分页,其实是很难把控的,因为你不知道切分出来的哪个页面真正能符合网页核心主旨,也不知道搜索引擎会如何去抓取收录这几个页面,而且更值得注意的是这些分页的页面必然会形成一定的内部竞争,最终展现给用户在搜索引擎结果中的也可能会有一定的问题。四合装饰
所以目前百度搜索引擎对此也是根据词频提取的算法来展现内容的,这就像大家经常在百度搜索出来网站和文章标题,其展示的描述却不定是站长和SEOer所填写的那些。对此问题的解决方法,建议就是能不分页的内容就尽量不要分页,而对于核心内容的展示,尽量多注意一下核心关键词的密度。
在一些情况下,如果文章内容确实太长,不方便阅读,必须要分页的话,可以使每一段都围绕着一个核心点,可独立支撑起一个页面内容量的情况下可以考虑分页使用。
5、对于“分页会导致分散链接,锚文本,PageRank的目标页面权重”的问题,我们就要先说一下网站的内链了,内链在网站内部的作用有两大方面,一方面内部链接是为了搜索引擎蜘蛛抓取网页一个入口,更多的入口带来更多的抓取机会,只有网页收录了才有获得排序的机会,不收录的网页都是资源的浪费,所以提高网站的收录比例比单纯做网站的收录量提升更具优势。
另一方面是基于pagerank的原理为其他的链接页面做权重传递,如果这里分页之后把一个页面的权重分散给了这几个页面,而这几个页面中加起来的链接总数肯定要多很多,那么最终传递的权重可能只有一小部分了,虽然这种理论的东西都只是猜测,但仔细思考也有点道理的。而且我们不能够确定哪个页面权重更高,最终像第4点中提到的一样,百度确定不了网页的核心主题,需要自己分析,那么就可能和自己的初衷产生偏差。
对此问题的解决,有朋友说在网页上加入canonical可以确定网页的唯一性,但是我们在百度站长平台LEE的回答中发现百度其实目前不支持canonical的,希望如他所说,未来会加入canonical,这样便于方便搜索引擎对于权重页面抓取,从而更能集中链接,锚文本,PageRank的目标页面指向。
写在最后:对于网站分页的问题,目前还很难绝对的说是好?还是坏?但笔者却注意到在最近的一年内,对此问题解决的趋势是利用滚动代替分页了,目前许多互联网内容服务展现样式都在改变。如谷歌图片搜索,Facebook和Twitter现在使用(AJAX)作为替代技术,来实现用户向下滚动页面自动快速加载更多其他新内容。相信在2014年内,此趋势的发展将会更加的普遍。

2、php 分页类怎么用啊?

<?php
    class Page {
        private $total_rows;//数据库总条数
        private $per_page_rows;//每页显示条数
        private $limit;
        private $uri;
        private $total_pages;//总页数
        private $config=array("header"=>"记录条数","prev"=>"上一页","next"=>"下一页","first"=>"首 页","last"=>"尾 页");
        private $list_length=8;
        public function __construct($total_rows,$per_page_rows=10,$url_args){
            $this->total_rows=$total_rows;
            $this->per_page_rows=$per_page_rows;
            $this->uri=$this->get_uri($url_args);
            $this->page = !empty($_GET['page']) ? $_GET['page'] : 1;
            $this->total_pages=ceil($this->total_rows/$this->per_page_rows);
            $this->limit=$this->set_limit();
        }
        private function set_limit() {
            return "limit ".($this->page-1)*$this->per_page_rows.",{$this->per_page_rows}";
        }
        private function get_uri($url_args) {
            $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"],"?") ? "" : "?").$url_args;
            $parse=parse_url($url);
            if (isset($parse['query'])) {
                parse_str($parse['query'],$params);//把url字符串解析为数组
                unset($params['page']);//删除数组下标为page的值
                $url=$parse['path'].'?'.http_build_query($params);//再次构建url
            }
                return $url;
        }
        public function __get($args) {
            if ($args=="limit") {
                return $this->limit;
            }else{
                return null;
            }
        }
        private function start_page(){
            if ($this->total_rows==0) {
                return 0;
            }else{
                return (($this->page-1)*$this->per_page_rows)+1;
            }
        }
        private function end_page(){
            return min($this->page*$this->per_page_rows,$this->total_rows);
        }
        private function go_first() {
            $html="";
            if ($this->page==1) {
                $html.="&nbsp;{$this->config['first']}&nbsp;";
            }else{
                $html.="&nbsp;<a href='{$this->uri}&page=1'>{$this->config['first']}</a>&nbsp;";
            }
            return $html;
        }
        private function go_prev() {
            $html="";
            if ($this->page==1) {
                $html.="&nbsp;{$this->config['prev']}&nbsp;";
            }else{
                $html.="&nbsp;<a href='{$this->uri}&page={$this->page}-1'>{$this->config['prev']}</a>&nbsp;";
            }
            return $html;
        }
        private function go_next() {
            $html="";
            if ($this->page==$this->total_pages) {
                $html.="&nbsp;{$this->config['next']}&nbsp;";
            }else{
                $html.="&nbsp;<a href='{$this->uri}&page={$this->page}+1'>{$this->config['next']}</a>&nbsp;";
            }
            return $html;
        }
        private function go_last() {
            $html="";
            if ($this->page==$this->total_pages) {
                $html.="&nbsp;{$this->config['last']}&nbsp;";
            }else{
                $html.="&nbsp;<a href='{$this->uri}&page={$this->total_pages}'>{$this->config['last']}</a>&nbsp;";
            }
            return $html;
        }
        private function go_page() {
            return '&nbsp;<input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->total_pages.')?'.$this->total_pages.':this.value;location=''.$this->uri.'&page='+page+''}" value="'.$this->page.'" style="width:25px;" /><input type="button" onclick="javascript:var page=(this.previousSibling.value>'.$this->total_pages.')?'.$this->total_pages.':this.previousSibling.value;location=''.$this->uri.'&page='+page+''" value="GO" />&nbsp;';
        }
        private function page_list() {
            $link_page="";
            $i_num=floor($this->list_length/2);
            for ($i = $i_num; $i >= 1; $i--) {
                $page=$this->page-$i;
                if ($page<1) {
                    continue;
                }else{
                    $link_page.="&nbsp;<a href='{$this->uri}&page={$page}'>{$page}</a>&nbsp;";
                }
            }
            $link_page.="&nbsp;{$this->page}&nbsp;";
            for ($i = 1; $i < $i_num; $i++) {
                $page=$this->page+$i;
                if ($page<=$this->total_pages) {
                    $link_page.="&nbsp;<a href='{$this->uri}&page={$page}'>{$page}</a>&nbsp;";
                }else{
                    break;
                }
            }
            return $link_page;
        }
        public function out_page($display=array(0,1,2,3,4,5,6,7,8)) {
            $display_html='';
            $html[0]="&nbsp;共有<b>{$this->total_rows}</b>{$this->config['header']}&nbsp;";
            $html[1]="&nbsp;每页显示<b>".($this->end_page()-$this->start_page()+1)."</b>条,本页显示从<b>{$this->start_page()}</b>--<b>{$this->end_page()}</b>{$this->config['header']}&nbsp;";
            $html[2]="&nbsp;<b>{$this->page}</b>/<b>{$this->total_pages}</b>页&nbsp;";
            $html[3]=$this->go_first();
            $html[4]=$this->go_prev();
            $html[5]=$this->page_list();
            $html[6]=$this->go_next();
            $html[7]=$this->go_last();
            $html[8]=$this->go_page();
            foreach ($display as $index){
                $display_html.=$html[$index];
            }
            return $display_html;
        }
    }
?>

3、如何用php实现分页效果

将原代码(所有用到分页的代码我都加有注释)和设计页面和IE浏览后的页面都传给你,以方便你详查。如果这里不好看,就将此代码复制到Dreamweaver编辑器里,加上你自己的数据库。我不知道你用的是什么编辑器,我用的是Dreamweaver。 这里是原代码页面<?php
include("inc/conn.php"); //包含你的数据库文件
?><body>
<?php
$sql="select * from book"; //sql语句我就不用多讲了吧,其中book是我要连接的表,(可自己定义)后面将不作解释
$result=mysql_query($sql);
$number=mysql_num_rows($result); //获得总共多少条记录
$pagesize=10; //定义每个页面要显示多少条记录
$totalpage=ceil($number/$pagesize); //获得总的页数,ceil($number/$pagesize)总的记录/每页显示的记录
$pageno=$_GET['pageno'];
if($pageno==""){
$pageno=1; //设定,如果当前页为空时就显示为第1页
}
$startno=$pagesize*($pageno-1); //得到每页的起始页。$pagesize*($pageno-1)用每页多少条记录*(当前页-1),这是得到起始页的规则
$sql2="select * from book limit ".$startno.",".$pagesize; //用sql2语句中limit得出每一页的起始页和每一页要显示多少条记录
$result2=mysql_query($sql2);
?>
<table width="600" border="0" align="center" cellpadding="5" cellspacing="1" bgcolor="#0000FF">
<tr>
<th align="center" bgcolor="#FFFFFF">书名:</th>
<th align="center" bgcolor="#FFFFFF">作者:</th>
<th align="center" bgcolor="#FFFFFF">价格:</th>
</tr>
<?php
while($rows=mysql_fetch_array($result2)){ //这里是循环,不用讲的吧,如果不懂再来问我
?>
<tr>
<td align="center" bgcolor="#FFFFFF"><?php echo $rows['Bookname']?></td>
<td align="center" bgcolor="#FFFFFF"><?php echo $rows['editor']?></td>
<td align="center" bgcolor="#FFFFFF"><?php echo $rows['price']?></td>
</tr>
<?php } ?>
<tr>
<td align="center" bgcolor="#FFFFFF">共<?php echo $number //显示总共多少条记录 ?>条记录</td> <td align="center" bgcolor="#FFFFFF"><?php
if($pageno==1){
echo "[<a href=?pageno=".($pageno+1).">下一页</a>][<a href=?pageno=".$totalpage.">末页</a>]";
} //如果是第一页时: 没有首页和上页,只有下页和末页(后两者有连接)
if($pageno<$totalpage && $pageno>1){
echo "[<a href=?pageno=1>首页</a>][<a href=?pageno=".($pageno-1).">上一页</a>][<a href=?pageno=".($pageno+1).">下一页</a>][<a href=?pageno=".$totalpage.">末页</a>]";
} //如果是第一页和末页之间的页数:首页,上页,下页,末页都有(四者都有连接)
if($pageno==$totalpage){
echo "[<a href=?pageno=1>首页</a>][<a href=?pageno=".($pageno-1).">上一页</a>]";
} //如果是末页时: 只有首页和上页,没有下页和末页(前两者有连接) (到此为止分布做完了,下面的是跳转,顺便也跟你说说吧,呵呵)
?></td>
<td align="center" bgcolor="#FFFFFF"><form id="form1" name="form1" method="get" action="">
<select name="pageno">
<option selected="selected">第<?php echo $pageno?>页</option>
<?php
for($i=1;$i<=$totalpage;$i++){ //通过for定义变量i<=总页数将总共有多少页循环出来
?>
<option value="<?php echo $i?>">第<?php echo $i //显示当前所看到的页数?>页</option>
<?php } ?>
</select>
<input type="submit" name="Submit" value="go" />
</form>
</td>
</tr>
</table>
</body> 这里是设计页面 这里是IE浏览后看到的页面

4、找个简单实用的php分页类30分

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>通讯录</title>
<script type="text/javascript">
function onsure(url){
var sure = confirm("确定要删除?");
if(sure){
location.href = url;
}else{
return false;
}
}
</script>
<style>
a{padding:5px 10px; border:1px solid #ccc; background-color:#EEE; text-decoration:none;}
a:hover{background-color:#ccc;}
</style>
</head>

<body>

<?php if(!empty($_SESSION['user'])){ ?>
<marquee>你好,欢迎"<?php echo $_SESSION['user'] //$_COOKIE['user'] ?>"回来!<a href="unset.php">安全退出</a></marquee>
<?php } ?>
<table width='100%' border=1>
<caption align="top"><h1>通讯录</h1></caption>
<tr>
<th colspan=7>
<form action="index.php" method="get">
<input type="text" name="key" value="<?php echo $_GET['key'] ?>" />
<input type="submit" value="查询" />
</form>
</th>
</tr>
<tr>
<th>用户名</th>
<th>性别</th>
<th>爱好</th>
<th>地址</th>
<th>手机</th>
<th>座机</th>

<?php if(!empty($_SESSION['user'])){ ?>
<th>操作</th>
<?php } ?>
</tr>
<?php
include "connect.php";
/********查询***********/
#获取查询关键字
$key = $_GET['key'];

#求记录总数
$sql = "select count(*) from user where user like '%$key%'";
$query = mysql_query($sql);
$row = mysql_fetch_row($query);
$countnum = $row[0];

#每页显示的记录数
$numrows = 3;

#总页数
$countPage = ceil($countnum/$numrows);

#当前页
$page = intval($_GET['page']) > 0 ? intval($_GET['page']) : 1;

#控制分栏页码
$sort = 5;

#求开始页码
$half = intval($sort/2);

if($countPage <= 5 || $page <= $half ){
$start = 1;
}else{
$start = $page - $half;
}

#求结束页码
if($countPage <= 5 || $page+$half > $countPage){
$end = $countPage;
}else{
$end = $start + $sort - 1;
}

#求出偏移量
$offset = ($page - 1) * $numrows;

$sql = "select * from user where user like '%$key%' limit $offset,$numrows";
$query = mysql_query($sql);
while($val = mysql_fetch_assoc($query)){
?>
<tr>
<td><?php echo str_replace($key,"<font color='red'>$key</font>",$val['user']) ?></td>
<td><?php echo $val['sex'] == 1 ? '先生' : '女士'; ?></td>
<td><?php echo $val['like'] ?></td>
<td><?php echo $val['address'] ?></td>
<td><?php echo $val['mobeil'] ?></td>
<td><?php echo $val['tel'] ?></td>

<?php if(!empty($_SESSION['user'])){ ?>
<td align="center"><a href="#" onclick="onsure('del.php?id=<?php echo $val['id'] ?>')">删除</a> | <a href="show.php?id=<?php echo $val['id'] ?>">修改</a></td>
<?php } ?>
</tr>
<?php
}
?>
<tr height="50">
<th colspan=<?php if(!empty($_SESSION['user'])){ echo '"7"'; }else{ echo '"6"';} ?> align="center" >
总共<?php echo $countPage; ?>页/当前第<?php echo $page ?>页
<a href="index.php?page=1&key=<?php echo $key?>">首页</a> 
<a href="?page=<?php echo $page-1 ?>&key=<?php echo $key?>">上一页</a> 
<?php for($i = $start; $i<= $end; $i++){
if($i == $page){
echo $i . '';
}else{
?>

<a href="?page=<?php echo $i ?>&key=<?php echo $key?>"><?php echo $i ?></a> 
<?php
}
} ?>
<!--a href="?page=<?php echo $page+1 ?>">...</a> 
<a href="?page=<?php echo $countPage; ?>"><?php echo $countPage; ?></a> -->

<a href="?page=<?php echo $page+1 ?>&key=<?php echo $key?>">下一页</a> 
<a href="?page=<?php echo $countPage; ?>&key=<?php echo $key?>">尾页</a> 
</th>
</tr>
</table>
<a href="form.html">添加新联系人</a>
<a href="login.html">管理员登陆</a>
</body>
</html>

5、php实现分页功能

具体代码如下:
/**
* 获取分页的HTML内容
* @param integer $page 当前页
* @param integer $pages 总页数
* @param string $url 跳转url地址 最后的页数以 '&page=x' 追加在url后面
*
* @return string HTML内容;
*/
public static function getPageHtml($page, $pages, $url){
//最多显示多少个页码
$_pageNum = 5;
//当前页面小于1 则为1
$page = $page<1?1:$page;
//当前页大于总页数 则为总页数
$page = $page > $pages ? $pages : $page;
//页数小当前页 则为当前页
$pages = $pages < $page ? $page : $pages;

//计算开始页
$_start = $page - floor($_pageNum/2);
$_start = $_start<1 ? 1 : $_start;
//计算结束页
$_end = $page + floor($_pageNum/2);
$_end = $_end>$pages? $pages : $_end;

//当前显示的页码个数不够最大页码数,在进行左右调整
$_curPageNum = $_end-$_start+1;
//左调整
if($_curPageNum<$_pageNum && $_start>1){
$_start = $_start - ($_pageNum-$_curPageNum);
$_start = $_start<1 ? 1 : $_start;
$_curPageNum = $_end-$_start+1;
}
//右边调整
if($_curPageNum<$_pageNum && $_end<$pages){
$_end = $_end + ($_pageNum-$_curPageNum);
$_end = $_end>$pages? $pages : $_end;
}

$_pageHtml = '<ul class="pagination">';
/*if($_start == 1){
$_pageHtml .= '<li><a title="第一页">«</a></li>';
}else{
$_pageHtml .= '<li><a title="第一页" href="'.$url.'&page=1">«</a></li>';
}*/
if($page>1){
$_pageHtml .= '<li><a title="上一页" href="'.$url.'&page='.($page-1).'">«</a></li>';
}
for ($i = $_start; $i <= $_end; $i++) {
if($i == $page){
$_pageHtml .= '<li class="active"><a>'.$i.'</a></li>';
}else{
$_pageHtml .= '<li><a href="'.$url.'&page='.$i.'">'.$i.'</a></li>';
}
}
/*if($_end == $pages){
$_pageHtml .= '<li><a title="最后一页">»</a></li>';
}else{
$_pageHtml .= '<li><a title="最后一页" href="'.$url.'&page='.$pages.'">»</a></li>';
}*/
if($page<$_end){
$_pageHtml .= '<li><a title="下一页" href="'.$url.'&page='.($page+1).'">»</a></li>';
}
$_pageHtml .= '</ul>';
echo $_pageHtml;
}

6、这个简单的PHP分页类,该如何调用?感谢。~

0代表开始的下标,比如一页显示10条的话,那么第一页就是0,10,第二页就是(2-1)*10,10,第三页就是(3-1)*10,10
所以你那个0 就是写 limit($page-1)*$pagenum,$pagenum

7、用PHP如何实现分页并能够实现上一页,下一页,跳转到()页的功能?

<html><head>
<title>分页示例(php</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<?php
$pagesize=10; //设定每一页显示的记录数

$conn=mysql_connect("localhost","root","jrq");
mysql_select_db("sj",$conn);
$rs = mysql_query( "select * from `dw_newsdata`",$conn); //这里有第二个可选参数,指定打开的连接
//-----------------------------------------------------------------------------------------------//
//分页逻辑处理
//-----------------------------------------------------------------------------------------------
$tmpArr = mysql_fetch_array($rs);
$numAL = mysql_num_rows($rs); //取得记录总数$rs
$pages=intval($numAL/$pagesize); //计算总页数

if ($numAL % $pagesize) $pages++;

//设置缺省页码
//↓判断“当前页码”是否赋值过
if (isset($_GET['page'])){ $page=intval($_GET['page']); }else{ $page=1; }//否则,设置为第一页

//↓计算记录偏移量
$offset=$pagesize*($page - 1);

//↓读取指定记录数
$rs=mysql_query("select * from `dw_newsdata` limit $offset,$pagesize",$conn);//取得—当前页—记录集!
$curNum = mysql_num_rows($rs); //$curNum - 当前页实际记录数,for循环输出用
?>
<table border="0" width="80%">
<tr>
<td width="50%" bgcolor="#E0E0E0">标题</td>
<td width="50%" bgcolor="#E0E0E0">发布时间</td>
</tr>

<?php
while ($tmpArr = mysql_fetch_array($rs)) //提取一行,并循环判断
{
$i=0;

// for($a=0;$a<$ColNum;$a++) //==for结束==
?>
<tr>
<td width="50%"><?= $tmpArr[1]; //$tmpArr["news_title"] ; ?></td>
<td width="50%"><?php echo $tmpArr[2]; //$tmpArr["news_cont"]; ?></td>
</tr>

<?php

}//==while结束==
?>
</table>

<?php
//============================//
// 翻页显示 一
//============================//
echo "<p>"; // align=center
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;

if ($page > 1)
{
echo "<a href='?page=".$first."'>首页</a> ";
echo "<a href='?page=".$prev."'>上一页</a> ";
}

if ($page < $pages)
{
echo "<a href='?page=".$next."'>下一页</a> ";
echo "<a href='?page=".$last."'>尾页</a> ";
}

//============================//
// 翻页显示 二
//============================//
echo " | 共有".$pages."页(".$page."/".$pages.")";

for ($i=1;$i< $page;$i++){echo "<a href='?page=".$i."'>[".$i ."]</a> ";} // 1-先输出当前页之前的

if ($page > 0) echo "[".$page."]";; // 2-再输出当前页

for ($i=$page+1;$i<=$pages;$i++){echo "<a href='?page=".$i."'>[".$i ."]</a> ";}// 3-接着输出当前页之后

echo "转到第 <INPUT maxLength=3 size=3 value=".($page+1)." name=gotox> 页 <INPUT hideFocus onclick=\"location.href='?page=gotox.value';\" type=button value=Go name=cmd_goto>";

echo "</p>";

?>

</body>
</html>

8、php+mysql优化,百万至千万级快速分页mysql性能到底能有多高

php+Mysql 优化,百万至千万级快速分页

MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始。有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了。用事实说话,看例子:
数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。
最后collect 为 10万条记录,数据库表占用硬盘1.6G。OK ,看下面这条sql语句:
select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的
select id,title from collect limit 90000,10; 从9万条开始分页,结果?
8-9秒完成,my god 哪出问题了????其实要优化这条数据,网上找得到答案。看下面一条语句:
select id from collect order by id limit 90000,10; 很快,0.04秒就OK。为什么?因为用了id主键做索引当然快。网上的改法是:
select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;
这就是用了id做索引的结果。可是问题复杂那么一点点,就完了。看下面的语句
select id from collect where vtype=1 order by id limit 90000,10; 很慢,用了8-9秒!
到了这里我相信很多人会和我一样,有崩溃感觉!vtype 做了索引了啊?怎么会慢呢?vtype做了索引是不错,你直接 select id from collect where vtype=1 limit 1000,10; 是很快的,基本上0.05秒,可是提高90倍,从9万开始,那就是0.05*90=4.5秒的速度了。和测试结果8-9秒到了一个数量级。从这里开始有人提出了分表的思路,这个和discuz 论坛是一样的思路。思路如下:
建一个索引表: t (id,title,vtype) 并设置成定长,然后做分页,分页出结果再到 collect 里面去找info 。 是否可行呢?实验下就知道了。
10万条记录到 t(id,title,vtype) 里,数据表大小20M左右。用
select id from t where vtype=1 order by id limit 90000,10; 很快了。基本上0.1-0.2秒可以跑完。为什么会这样呢?我猜想是因为collect 数据太多,所以分页要跑很长的路。limit 完全和数据表的大小有关的。其实这样做还是全表扫描,只是因为数据量小,只有10万才快。OK,来个疯狂的实验,加到100万条,测试性能。
加了10倍的数据,马上t表就到了200多M,而且是定长。还是刚才的查询语句,时间是0.1-0.2秒完成!分表性能没问题?错!因为我们的limit还是9万,所以快。给个大的,90万开始
select id from t where vtype=1 order by id limit 900000,10; 看看结果,时间是1-2秒!
why   分表了时间还是这么长,非常之郁闷!有人说定长会提高limit的性能,开始我也以为,因为一条记录的长度是固定的,mysql 应该可以算出90万的位置才对啊? 可是我们高估了mysql 的智能,他不是商务数据库,事实证明定长和非定长对limit影响不大?怪不得有人说 discuz到了100万条记录就会很慢,我相信这是真的,这个和数据库设计有关!
难道MySQL 无法突破100万的限制吗???到了100万的分页就真的到了极限???
答案是: NO !!!! 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法,来个疯狂的测试!一张表搞定100万记录,并且10G 数据库,如何快速分页!
好了,我们的测试又回到 collect表,开始测试结论是: 30万数据,用分表法可行,超过30万他的速度会慢道你无法忍受!当然如果用分表+我这种方法,那是绝对完美的。但是用了我这种方法后,不用分表也可以完美解决!
答案就是:复合索引!有一次设计mysql索引的时候,无意中发现索引名字可以任取,可以选择几个字段进来,这有什么用呢?开始的select id from collect order by id limit 90000,10; 这么快就是因为走了索引,可是如果加了where 就不走索引了。抱着试试看的想法加了 search(vtype,id) 这样的索引。然后测试
select id from collect where vtype=1 limit 90000,10; 非常快!0.04秒完成!
再测试: select id ,title from collect where vtype=1 limit 90000,10; 非常遗憾,8-9秒,没走search索引!
再测试:search(id,vtype),还是select id 这个语句,也非常遗憾,0.5秒。
综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的!
好了,回到原题,如何将上面的研究成功快速应用于开发呢?如果用复合查询,我的轻量级框架就没的用了。分页字符串还得自己写,那多麻烦?这里再看一个例子,思路就出来了:
select * from collect where id in (9000,12,50,7000); 竟然 0秒就可以查完!
mygod ,mysql 的索引竟然对于in语句同样有效!看来网上说in无法用索引是错误的!
有了这个结论,就可以很简单的应用于轻量级框架了:
代码如下:
$db=dblink();
$db->pagesize=20;
$sql="select id from collect where vtype=$vtype";
$db->execute($sql);
$strpage=$db->strpage(); //将分页字符串保存在临时变量,方便输出
while($rs=$db->fetch_array()){
  $strid.=$rs['id'].',';
}
$strid=substr($strid,0,strlen($strid)-1); //构造出id字符串
$db->pagesize=0; //很关键,在不注销类的情况下,将分页清空,这样只需要用一次数据库连接,不需要再开;
$db->execute("select id,title,url,sTime,gTime,vtype,tag from collect where id in ($strid)");
< php while($rs=$db->fetch_array()): >
<tr>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['id']; $amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['url']; $amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['sTime']; $amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['gTime']; $amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['vtype']; $amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;<a act=show&id=< php echo $rs['id']; $amp;>quot;$ target="_blank"$amp;>amp;$lt; php echo $rs['title']; $amp;>amp;$lt;/a$amp;>amp;$lt;/td>
  <td$amp;>amp;$amp;nbsp;< php echo $rs['tag']; $amp;>amp;$lt;/td>
</tr>
< php endwhile; >
</table>
< php
echo $strpage;
通过简单的变换,其实思路很简单:1)通过优化索引,找出id,并拼成 "123,90000,12000" 这样的字符串。2)第2次查询找出结果。
小小的索引+一点点的改动就使mysql 可以支持百万甚至千万级的高效分页!
通过这里的例子,我反思了一点:对于大型系统,PHP千万不能用框架,尤其是那种连sql语句都看不到的框架!因为开始对于我的轻量级框架都差点崩溃!只适合小型应用的快速开发,对于ERP,OA,大型网站,数据层包括逻辑层的东西都不能用框架。如果程序员失去了对sql语句的把控,那项目的风险将会成几何级数增加!尤其是用mysql 的时候,mysql 一定需要专业的dba 才可以发挥他的最佳性能。一个索引所造成的性能差别可能是上千倍!
PS: 经过实际测试,到了100万的数据,160万数据,15G表,190M索引,就算走索引,limit都得0.49秒。所以分页最好别让别人看到10万条以后的数据,要不然会很慢!就算用索引。经过这样的优化,mysql到了百万级分页是个极限!但有这样的成绩已经很不错,如果你是用sqlserver肯定卡死!而 160万的数据用 id in (str) 很快,基本还是0秒。如果这样,千万级的数据,mysql应该也很容易应付。

9、怎么解决wordpress分页title标题重复不利于SEO的问题

我们都知道,wordpress分页调用title标签在header.php中,为此我们可以通过在header.php中title标签上category加入分页页码的调用标签从而解决wordpress分页页面title标题重复的问题,告诉搜索引擎这是两个页面,最终达到SEO效果。

在这里,我主要讲的是category,即分类目录的标题重复,其他页面也类似。

在没有添加页码之前,我们可以在header.php中找到这行代码:

<?php if (is_category() ) { ?><?php single_cat_title(); ?> - <? bloginfo('name'); ?><?php } ?>

此时,如果分类目录文章超出一页,我们可以看到所有分类目录标题都是重复的,即“分类目录标题-博客标题”,我们可以修改成下面这样,

<?php if ( is_category() ) { ?><?php single_cat_title(); ?> - <? bloginfo('name'); $paged = get_query_var('paged'); if ( $paged > 1 ) printf('– 第 %s 页 ',$paged); ?><?php } ?>

这段代码就表示首先获取页数,如果不是第一页那么就加上页码,表示第几页,通过这个办法可以有效的杜绝分页页面重复标题的问题。

从而实现分类目录标题为 “分类目录标题-博客标题-页码”,除第一页之外。

同理,如果是首页,则可以为

<?php if (is_home()) { ?><? bloginfo('name'); ?>$paged = get_query_var('paged'); if ( $paged > 1 ) printf('– 第 %s 页 ',$paged);<?php } ?>

其他页面也类似,只需将

$paged = get_query_var('paged'); if ($paged > 1 ) printf('– 第 %s 页 ',$paged); 加入到适当位置即可。

谢谢采纳

与php分页类seo相关的知识