最近在做一个客户导入的功能,整理的一个导入的进度条类:
<?php
/**
* @File name: Loading.php
* @Author: jiumi.jin
* @Create time: 10/11/2012
* @Main function: loading
*/
class Loading {
private $width = 500;
private $total = 0;
private $start_time;
private $faileLines = array();
private $faileCounter = 0;
/**
* 构造
* @param 进度条长度 $width
* @param 要处理的数据长度 $length
*/
public function __construct($param){
ob_start();
//$this->width = $width;
$this->total = $param['length'];
$this->start_time = time();
ob_end_clean();
}
/**
* 执行进度跟踪
* @param $num 执行的数据点,这个数字应该是0 到 数据的总长度
* @return bool
*/
public function run($num){
$successNum = $num - $this->faileCounter;
$percent = number_format($num / $this->total * 100,2) . '%';
echo "<script>updatePercent('$successNum',$this->faileCounter,'$percent');</script>";
print str_pad("",100000);
ob_flush();
return true;
}
/**
* 占用内存跟踪
* @param $i 进度
* @param $progress_mem 占用内存
* @return bool
*/
public function run_mem($i,$progress_mem){
echo "<script>showMem($i,$progress_mem);</script>";
print str_pad("",100000);
ob_flush();
return true;
}
/**
* 设置出错的点
* 例如导入excel的时候,有不符合模板规范的行数可以在这里设置
* @param $line 错误行数
* @param $errMes 错误信息
*/
public function setFaileLine($line,$errMes){
$line = intval($line);
if ($line != 0) {
$this->faileCounter++;
$this->faile = true;
$this->faileLines[$this->faileCounter]['line'] = $line;
$this->faileLines[$this->faileCounter]['errMessage'] = $errMes;
echo "<script>showErr('".$this->getFaileLine()."');</script>";
print str_pad("",100000);
ob_flush();
return true;
}
}
public function getFaileCounter(){
return $this->faileCounter;
}
/**
* 获取出错的点
*
* @return string $html
*/
public function getFaileLine(){
$html = '';
if(!empty($this->faileLines)){
foreach($this->faileLines as $failline){
$html .= '错误位置:'.$failline['line'].', 错误信息:'.$failline['errMessage'].'<br/>';
}
}else{
$html .= '没有错误信息';
}
return $html;
}
/**
* echo出进度条的html页面和js函数
* 应该在实例化类后立刻执行此方法,否则会失败
*
* @return unknown
*/
public function createHtml(){
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/transitional.dtd\">
<html>
<head>
<script>
function updatePercent(have_process,errCount,percent){
document.getElementById('msg').innerHTML = '成功处理了 '+have_process+' 条数据';
document.getElementById('errMsg').innerHTML = '失败 '+errCount+' 条数据';
document.getElementById('progress').style.width = percent;
document.getElementById('percent').innerHTML = percent;
if(document.getElementById('progress').style.width == '100%'){
document.getElementById('percent').innerHTML = '处理完毕!';
stop();
}
}
function showErr(msg){
document.getElementById('allErr').innerHTML = msg;
}
//计时
var CallTimeLen = \"0\";
var timer1 = null;
function start(){
var hour=\"0\";
var minute=\"0\";
var second=\"0\";
CallTimeLen = parseInt(CallTimeLen)+1;
hour = parseInt(CallTimeLen/3600);
minute = parseInt(CallTimeLen/60);
second = CallTimeLen%60;
document.getElementById('time_h').innerHTML = hour;
document.getElementById('time_m').innerHTML = minute;
document.getElementById('time_s').innerHTML = second;
window.timer1 = window.setTimeout(\"start()\",1000);
}
setTimeout(\"start()\",0);
function stop(){
clearTimeout(window.timer1);
}
function showMem(i,progress){
document.getElementById('showM').innerHTML = '_____'+i+': '+progress;
}
</script>
</head>
<body>
<div style=\"margin:0 auto; margin-top:4px; margin-bottom:0; padding: 8px; padding-bottom:0; border: 1px solid gray; background: #EAEAEA; width:".$this->width."px\">
<div><font color=\"gray\"><span style=\"font-size:12px;\">此操作需要等待一段时间,在执行完毕之前,请不要关闭此页面</span></font></div>
<div style=\"padding: 0; background-color: white; border: 1px solid navy; width:".$this->width."px\">
<div id=\"progress\" style=\"padding: 0; background-color: #FFCC66; border: 0; width: 0px; text-align: center; height: 16px\"></div>
</div>
<div id=\"msg\" style=\"font-size:12px;\"></div>
<div id=\"errMsg\" style=\"font-size:12px;\"></div>
已用时:<span id=\"time_h\"> </span>时
<span id=\"time_m\"> </span>分
<span id=\"time_s\"> </span>秒
<div id=\"showM\" style=\"font-size:12px;\"></div>
<div id=\"percent\" style=\"position: relative; top: -32px; text-align: center; font-weight: bold; font-size: 8pt;\">0%</div>
</div>
<div id=\"allErr\">
</div>
<body>
</html>";
return true;
}
}
CI框架的调用:
$this->load->library('loading',array('length'=>$totle)); //加载进度条类,这是CI框架
$this->loading->createHtml();
//$start_mem = memory_get_usage();
foreach($customers as $key=>$customer){
$return = $this->insert_import($customer);
if($return != 1){
$this->loading->setFaileLine($key+1,$return); //记录错误
}else{
$this->loading->run($key+1); //成功进度条
}
//$progress_mem = memory_get_usage();
//$this->loading->run_mem($key,$progress_mem-$start_mem); //测试查看内存使用情况的
}