导航:首页 > 编程语言 > php分页优化

php分页优化

发布时间:2022-09-10 04:05:50

php查询速度慢,数据到100W分页速度3秒多

分页本来就是数据越多越慢,正常情况下,绝对有条件限制,例如时间
还可以不用limit,用id段查询,弊端是不能断

② thinkPHP数据分页,为什么点击分页按钮的时候会把整个模板模板一直重复渲染

这个看你前端是怎么实现的,你页面要无刷新的话,就用无刷新的,不是无刷新的,当然会重新渲染整个页面了。

③ 怎样提高php运行效率

1,数据库模型很重要,建表要做好索引,以及数据拆分

2,缓存,适当运用缓存

3,尽可能使用官方的函数,不要自己造车

④ thinkphp怎么实现json无刷分页

一、分页方法

/**
* TODO 基础分页的相同代码封装,使前台的代码更少
* @param $m 模型,引用传递
* @param $where 查询条件
* @param int $pagesize 每页查询条数
* @return \Think\Page
*/
function getpage(&$m,$where,$pagesize=10){
$m1=clone $m;//浅复制一个模型
$count = $m->where($where)->count();//连惯操作后会对join等操作进行重置
$m=$m1;//为保持在为定的连惯操作,浅复制一个模型
$p=new Think\Page($count,$pagesize);
$p->lastSuffix=false;
$p->setConfig('header','<li class="rows">共<b>%TOTAL_ROW%</b>条记录 每页<b>%LIST_ROW%</b>条 第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>');
$p->setConfig('prev','上一页');
$p->setConfig('next','下一页');
$p->setConfig('last','末页');
$p->setConfig('first','首页');
$p->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');

$p->parameter=I('get.');

$m->limit($p->firstRow,$p->listRows);

return $p;
}

getpage方法可以放在TP框架的 Application/Common/Common/function.php,这个文档可以专门放置一些通用的方法,在哪里都可以调用(如:Controller文件,View文件等)。

二、调用分页方法
$m=M('procts');
$p=getpage($m,$where,10);
$list=$m->field(true)->where($where)->order('id desc')->select();
$this->list=$list;
$this->page=$p->show();

再是View代码
<div class="pagination">
{$page}
</div>

三、最后就是分页的样式了,这个有些乱,因后台框架网上下载的,样式还没来的及整理,这个样式也可以自己实现,简单的。

.pagination ul {
display: inline-block;
margin-bottom: 0;
margin-left: 0;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
-moz-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.pagination ul li {
display: inline;
}

.pagination ul li.rows {
line-height: 30px;
padding-left: 5px;
}
.pagination ul li.rows b{color: #f00}

.pagination ul li a, .pagination ul li span {
float: left;
padding: 4px 12px;
line-height: 20px;
text-decoration: none;
background-color: #fff;
background: url('../images/bottom_bg.png') 0px 0px;
border: 1px solid #d3dbde;
/*border-left-width: 0;*/
margin-left: 2px;
color: #08c;
}
.pagination ul li a:hover{
color: red;
background: #0088cc;
}
.pagination ul li.first-child a, .pagination ul li.first-child span {
border-left-width: 1px;
-webkit-border-bottom-left-radius: 3px;
border-bottom-left-radius: 3px;
-webkit-border-top-left-radius: 3px;
border-top-left-radius: 3px;
-moz-border-radius-bottomleft: 3px;
-moz-border-radius-topleft: 3px;
}
.pagination ul .disabled span, .pagination ul .disabled a, .pagination ul .disabled a:hover {
color: #999;
cursor: default;
background-color: transparent;
}
.pagination ul .active a, .pagination ul .active span {
color: #999;
cursor: default;
}
.pagination ul li a:hover, .pagination ul .active a, .pagination ul .active span {
background-color: #f0c040;
}
.pagination ul li.last-child a, .pagination ul li.last-child span {
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
-webkit-border-bottom-right-radius: 3px;
border-bottom-right-radius: 3px;
-moz-border-radius-topright: 3px;
-moz-border-radius-bottomright: 3px;
}

.pagination ul li.current a{color: #f00 ;font-weight: bold; background: #ddd}

⑤ thinkphp 分页时 怎么让序号列自增的实现

实现步骤如下:1、定义全局变量:var record_start = 0;2、Grid的columns部分的定义:

columns : [new Ext.grid.RowNumberer({
header : "序号",
width : 40,
renderer:function(value,metadata,record,rowIndex){
return record_start + 1 + rowIndex;
}
}), {
header : "项目编号",
width : 50,
sortable : false,
dataIndex : "projectNumber"
}, {
header : "项目名称",
sortable : false,
dataIndex : "psName"
}, {
header : "基站名",
sortable : false,
dataIndex : "psSiteName"
}]

⑥ PHP如何实现分页显示

【文件名】: c_mysql_page.inc // 【作 用】: MySQL分页函数类 // 【作 者】: 天灰 // // 【最后修改日期】: 2001/07/16[cxx] // 【变量定义规则】:‘C_’=字符型,‘I_’=整型,‘N_’=数字型,‘L_’=布尔型,‘A_’=数组型 //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ // ※c_mysql_page() 构造函数,设置分页初始参数 // ※page_standard() 分页显示函数(标准型) // ※GetRecordStartEnd() 获得取记录的开始结束位置 // ※getmaxpage() 获得记录集的最大页数 // ※checkpage() 检查当前页数是否在0和最大页数之间 //------------------------------------------------------------------------------------------ class c_mysql_page { //------------------------------------------------------------------------------------------ // 变量定义 //------------------------------------------------------------------------------------------ var $I_pagesize = 10; //每页记录数 var $C_width = '80%'; //表格宽度 //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ // 函数名:c_mysql_page ($I_pagesize, $c_width) // 作 用:构造函数,设置分页初始参数 // 参 数:$I_pagesize, $c_width // 返回值:变量 // 备 注:构造函数随着类的建立而自动执行 //------------------------------------------------------------------------------------------ function c_mysql_page ($I_pagesize=10, $C_width='80%') { if (isset($I_pagesize)){$this -> I_pagesize = $I_pagesize;} if (isset($C_width)){$this -> C_width = $C_width;} } //------------------------------------------------------------------------------------------ // 函数名:page_standard($I_sumrecord,$C_page,$C_url="self",$C_otherpara="") // 作 用:分页显示函数(标准型) // 参 数:$I_sumrecord 记录总数 // $C_url URL // $C_page URL后的参数 // $C_otherpara URL后的参数2 // $bgcolor 表格的背景颜色 // 返回值: // 备 注:无 //------------------------------------------------------------------------------------------ function page_standard($I_sumrecord,$C_page,$C_url="self",$C_otherpara="",$bgcolor="") { //检查参数 if ((!$I_sumrecord) || (!$C_page)){AlertExit("参数不全!");} global $PHP_SELF,$$C_page; //全局变量$C_page //检测$I_pagesize是否合法 if($this -> I_pagesize < 1){AlertExit("请设定每页的记录数!");} if($I_sumrecord < 1){return false;} //检测总记录数 if($C_url == "self"){$C_url = $PHP_SELF;} //设置URL $I_page = $$C_page; //重新赋当前页值 $I_maxpage = $this -> getmaxpage($I_sumrecord); //取出总页数 $I_page = $this -> checkPage($I_maxpage,$I_page); //检查当前页号 //显示表 echo ""; echo ""; echo "共" . $I_sumrecord. "条主题 当前第" . $I_page . "/". $I_maxpage. "页"; if ($I_maxpage > 1) { echo ""; if($I_page > 1 && $I_page < $I_maxpage) { echo "首页"; $pre=$I_page-1; echo "上页"; $next=$I_page+1; echo "下页"; echo "末页"; } elseif($I_page == 1) { $next = $I_page+1; echo "下页"; echo "末页"; } elseif($I_page == $I_maxpage) { echo "首页"; $pre=$I_page-1; echo "上页"; } //显示select echo "转到"; echo "";//OnChange=".WindowLocation($C_url,$C_otherpara,$C_page)." for($i=1;$i I_pagesize; $I_pagesize = $this -> I_pagesize; } //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ // 函数名:getmaxpage($intRecordNum) // 作 用:获得记录集的最大页数 // 参 数:$I_sumrecord 记录总数 // 返回值:最大页数$I_maxpage(整型) // 备 注:无 //------------------------------------------------------------------------------------------ function getmaxpage($I_sumrecord) { if (!$I_sumrecord){AlertExit("参数不全!>

⑦ PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。

我们先从一个常用但性能很差的查询来看一看。

SELECT *
FROM city
ORDER BY id DESC
LIMIT 0, 15

这个查询耗时0.00sec。So,这个查询有什么问题呢?实际上,这个查询语句和参数都没有问题,因为它用到了下面表的主键,而且只读取15条记录。

CREATE TABLE city (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
city varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

真正的问题在于offset(分页偏移量)很大的时候,像下面这样:

SELECT *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

上面的查询在有2M行记录时需要0.22sec,通过EXPLAIN查看SQL的执行计划可以发现该SQL检索了100015行,但最后只需要15行。大的分页偏移量会增加使用的数据,MySQL会将大量最终不会使用的数据加载到内存中。就算我们假设大部分网站的用户只访问前几页数据,但少量的大的分页偏移量的请求也会对整个系统造成危害。Facebook意识到了这一点,但Facebook并没有为了每秒可以处理更多的请求而去优化数据库,而是将重心放在将请求响应时间的方差变小。

对于分页请求,还有一个信息也很重要,就是总共的记录数。我们可以通过下面的查询很容易的获取总的记录数。

SELECT COUNT(*)
FROM city;

然而,上面的SQL在采用InnoDB为存储引擎时需要耗费9.28sec。一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面看看这个语句的查询性能。

SELECT SQL_CALC_FOUND_ROWS *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

这个语句耗时20.02sec,是上一个的两倍。事实证明使用 SQL_CALC_FOUND_ROWS 做分页是很糟糕的想法。
下面来看看到底如何优化。文章分为两部分,第一部分是如何获取记录的总数目,第二部分是获取真正的记录。

高效的计算行数

如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可。相似的,在堆表中也会将行数存储到表的元信息中。但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数。

我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:

SELECT COUNT(*)
FROM city
USE INDEX(PRIMARY);

获取记录

下面进入这篇文章最重要的部分,获取分页要展示的记录。上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句。为了演示,我们创建一个新的表“news”,按照时事性排序(最新发布的在最前面),实现一个高性能的分页。为了简单,我们就假设最新发布的新闻的Id也是最大的。

CREATE TABLE news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL
) ENGINE=InnoDB;

一个比较高效的方式是基于用户展示的最后一个新闻Id。查询下一页的语句如下,需要传入当前页面展示的最后一个Id。

SELECT *
FROM news WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage

查询上一页的语句类似,只不过需要传入当前页的第一个Id,并且要逆序。

SELECT *
FROM news WHERE id > $last_id
ORDER BY id ASC
LIMIT $perpage

上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示“上一页”和“下一页”,例如博客中页脚显示“上一页”,“下一页”的按钮。但如果要实现真正的页面导航还是很难的,下面看看另一种方式。

SELECT id
FROM (
SELECT id, ((@cnt:= @cnt + 1) + $perpage - 1) % $perpage cnt
FROM news
JOIN (SELECT @cnt:= 0)T
WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage * $buttons
)C
WHERE cnt = 0;

通过上面的语句可以为每一个分页的按钮计算出一个offset对应的id。这种方法还有一个好处。假设,网站上正在发布一片新的文章,那么所有文章的位置都会往后移一位,所以如果用户在发布文章时换页,那么他会看见一篇文章两次。如果固定了每个按钮的offset Id,这个问题就迎刃而解了。Mark Callaghan发表过一篇类似的博客,利用了组合索引和两个位置变量,但是基本思想是一致的。

如果表中的记录很少被删除、修改,还可以将记录对应的页码存储到表中,并在该列上创建合适的索引。采用这种方式,当新增一个记录的时候,需要执行下面的查询重新生成对应的页号。

SET p:= 0;
UPDATE news SET page=CEIL((p:= p + 1) / $perpage) ORDER BY id DESC;

当然,也可以新增一个专用于分页的表,可以用个后台程序来维护。

UPDATE pagination T
JOIN (
SELECT id, CEIL((p:= p + 1) / $perpage) page
FROM news
ORDER BY id
)C
ON C.id = T.id
SET T.page = C.page;

现在想获取任意一页的元素就很简单了:

SELECT *
FROM news A
JOIN pagination B ON A.id=B.ID
WHERE page=$offset;

还有另外一种与上种方法比较相似的方法来做分页,这种方式比较试用于数据集相对小,并且没有可用的索引的情况下—比如处理搜索结果时。在一个普通的服务器上执行下面的查询,当有2M条记录时,要耗费2sec左右。这种方式比较简单,创建一个用来存储所有Id的临时表即可(这也是最耗费性能的地方)。

CREATE TEMPORARY TABLE _tmp (KEY SORT(random))
SELECT id, FLOOR(RAND() * 0x8000000) random
FROM city;

ALTER TABLE _tmp ADD OFFSET INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, DROP INDEX SORT,ORDER BY random;

接下来就可以向下面一样执行分页查询了。

SELECT *
FROM _tmp
WHERE OFFSET >= $offset
ORDER BY OFFSET
LIMIT $perpage;

简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。

⑧ 如何对PHP代码进行优化以提高网站访问速度

一、不要将整个页面放到一个table中虽然现在已经很少人使用table来布局,但我觉得还是有必要提一下,原来有些站长为了追求页面的整齐划一,将整个网站页面放入到一个table中,使用表格来布局,如果这样做显然会拖慢整个网页的加载速度。因为table中的内容必须要等到网页中所有内容全部加载完才会显示出来,所以如果其中一部分加载很慢或加载不了,势必会造成网页的加载变慢。最好是使用div+css的方式来布局页面,如果要使用table也不要将所有网页内容加入到一个table中。 一.记得帮页面减肥我们浏览网页实际上是将虚拟主机中的网页内容下载到本地硬盘,再用浏览器解释查看的。下载网页的快慢在显示速度上占了很大比重,所以,网页本身 所占的空间越小,那么浏览速度就会越快。这就要求在做网页的时候遵循一切从简的原则,如:不要使用太大的Flash动画、图片等资源。干净、简洁的页面会 给人一种思路明朗的感觉。 二、PHP等文件访问通过.js调用。 如果在静态页面中需要嵌入动态数据,我们在进行PHP网站优化和其他方法优化时应该注意的是,如果你要在静态的HTML页面里嵌入动态的数据,而这些动态的数据是由PHP程序来提供的话,这样的话,每次有一个人访问你的网站,服务器就要执行并处理一次PHP文件,从数据库抽取相应的数据,再输出到网页,如果同时有几万人访问,无疑会是服务器不堪重负。 所以最好是将数据动态生成到.js文件中,然后再首页通过< SCRIPT > < /SCRIPT> 这样的代码来调用js文件。如此一来,动态数据的显示就在客户端的浏览器中进行,大大降低了服务器资源的消耗,网站速度自然会加快。 三.使用iframe嵌套广告代码。 如果你在网站上插入一些广告,又不想因此拖慢网站速度,那使用iframe比较好。只要将这些广告代码整理到一个独立的页面中,使用iframe调用即可。代码格式如下: 四、尽量使用静态页面和上面说的道理一样,大家都知道,PHP等程序实现了网站的动态交互,如留言板等。但这类程序必须先由服务器执行处理,再生成静态页面,然后用户才能看到。这就必须小高服务器资源。如果网站访问人数多,服务器配置又不够好,很容易就造成网站速度缓慢甚至无法访问。所以如果没有必要,请尽量使用静态页面。 五.网站统计代码应独立放置在网页的最下方之所以放置最下方是因为如果网站统计代码出现故障无妨加载时,会有几十毫秒的延迟,这时如果你将统计代码放置网页前面,就会影响网站加载速度。导致页面很长时间才能访问。

⑨ PHP网页中内容太多如何让他自动分页

<?php /* PHP动态分页测试代码 */ //代码开始↓ if(empty($page)) $page=0; //默认页码值为0(即第一页) $total=152; //整体要显示的条目总数 $pagenum=10; //每页显示条目数 //写各页的内容(可以处理其他事件) for($i=$page*$pagenum;$i<$page*$pagenum+$pagenum;$i++){ $tmpstr="第 ". ($i+1) ." 条记录"; if($i<$total) print "$tmpstr<br>"; } //end of for //得到总页数 $tpage 的值 if($total%$pagenum==0) { //若被整除 $tpage=$total/$pagenum; } else { //否则用floor函数取得最大整数然后+1 $tpage=floor($total/$pagenum)+1; } //智能化的前进后退+段页码方式实现超链 $id_pd=floor($page/5)*5; //当前页页码数段初始id值 $startpagepre=$id_pd-5; $startpagenext=$id_pd+5; $lastpage=$tpage-1; print "<p>"; //处理首页(<<)和前五页(<) if($page==0){ print "<span style=\"color:red\"><<</span> "; }else{ print "<a title=\"首页\" href=\"$php_self?page=0\"><<</a> "; } if($page<5){ print "<span style=\"color:red\"><</span> "; }else{ print "<a title=\"前五页\" href=\"$php_self?page=$startpagepre\"><</a> "; } //写页段中的页码超链 for($i=$id_pd;$i<$id_pd+5;$i++){ $pg=$i+1; //页码数 if($i==$page){ if($i<$tpage) print "<span style=\"color:red\">$pg</span></a> "; }else{ if($i<$tpage) print "<a href=\"$php_self?page=$i\">$pg</a> "; } } //处理后五页(>)和尾页(>>) if($page>$tpage-5){ print "<span style=\"color:red\">></span> "; }else{ print "<a title=\"后五页\" href=\"$php_self?page=$startpagenext\">></a> "; } if($page==$lastpage){ print "<span style=\"color:red\">>></span> "; }else{ print "<a title=\"尾页\" href=\"$php_self?page=$lastpage\">>></a> "; } print "总页数 <span style=\"color:red\">$tpage</span></p>"; ?>

阅读全文

与php分页优化相关的资料

热点内容
编译器原理与实现书 浏览:708
dos选择命令 浏览:16
apm固件编译到单片机 浏览:120
联通深蓝卡都包含什么app 浏览:263
如何判断网络服务器正常 浏览:649
路由器搭桥远端服务器地址是什么 浏览:515
编译动态库时会连接依赖库吗 浏览:707
淘宝手机加密是随机的吗 浏览:672
解压包子怎么装饰 浏览:585
四个数凑24算法 浏览:676
哪一种不是vi编译器的模式 浏览:169
xp在此处打开命令窗口 浏览:128
代码编译运行用什么软件 浏览:999
动态库在程序编译时会被连接到 浏览:761
python超简单编程 浏览:260
获取命令方 浏览:977
怎样制作文件夹和图片 浏览:60
调研编译写信息 浏览:861
python冯诺依曼 浏览:419
同时安装多个app有什么影响 浏览:254