在使用php代码进行一些大量的批量操作数据库或查询任务时,经常会遇到内存超出php限制溢出,或执行时间超出指定的时间限制的问题。
我们可以调整php服务器php.ini配置文件中的设置max_execution_time = 60; 最大执行时间以及memory_limit = 60M;最大执行内存,来调整php脚本的最大执行时间以及内存.
或者还可以使用php中的函数set_time_limit()与ini_set():
限制时间:set_time_limit(60);
限制内存:ini_set('memory_limit', '60M');
但以上的方法有一定的局限性,如果使用的是虚拟主机就无法设置php.ini了,更别提服务器配置本来就不高调整参数后反而会使网站出现内存耗尽无法正常打开等问题.所以我们可以使用js代码与php代码结合在php页面中分批执行批量处理任务或查询任务,在很多php源码的后台代码中,进行批量的数据操作,更新创建静态页以及数据栏目时也经常用到该原理.
示例:
比如我们查询指定数据表中数据,然后批量更新指定字段.
<?php
$cid = isset($_GET['cid'])?$_GET['cid']:0;
$danzx = $cid + 100;
$maxzx = 10000;
$queystr="select * from `表名称` where id>'$cid' and id<='$danzx' order by id";
function getsql(){
//.......... 这些省略数据库连接操作返回数组数据
}
$dataarr = getsql($queystr);
foreach($dataarr as $dataarr_v){
//........省略更新指定字段语句
echo $id." 处理完成.br>";
if($id>=$maxzx){
exit();
}
}
if($cid<=$maxzx){
$cid = $cid + 100;
$url="plcl.php?cid=$cid";
echo $url;
echo '<script language="javascript">location="'.$url.'"; </script>';
}
?>
原理也比较简单,首先我们需要创建这个名称为plcl.php的文件,然后设置获取链接中的后缀cid参数来分批执行任务.
$maxzx变量为最大执行的处理次数
$danzx变量为没刷新依次页面进行的处理数据数.
然后就是一些查询以及更新数据的操作语句.
最后也是实现分批分步处理最关键的,通过在文件plcl.php后面加上?cid=$cid,来传递每次执行的cid参数,结合每次执行完指定次数的任务后在页面中输出javascript中的location=""语句来实现自定刷新跳转页面,且传递上次执行的进度参数.