我要做匯入匯出功能,為了介面友好,提示時想出線進度條顯示進度,但我不知道怎麼做!
我的匯入是匯入csv格式的檔案,直接讀取,然後 insert into 資料表中,匯出也是直接查詢產生csv格式檔案,
我能做了一個進度條,但是不知道怎麼來擷取匯入匯出執行的進度,然後再通過ajax及js更新我的進度條。
回複討論(解決方案)
用戶端支援,通過
sliverlight,flash,html5
或者伺服器端,你查apc擴充,,好像還一個,忘記名字了
這個用ajax很容易實現,你可以查下相關資料
假如有100個操作,你可以讓第一個操作前進1,第二個操作前進3 ...
我建議不要做這個進度條效果,因為可能影響速度
只要弄一個"匯入中"
使用緩衝輸出吧
// 省略其他html+js進度條代碼$i = 0;while($i<100) { // 執行內容 sleep(1); // 根據總量和當前任務計算任務進度$i $i = $i++; echo ''; ob_flash() flash();}
0%';echo str_repeat(' ', 4096);ob_flush();flush();// 執行任務$i = 0;while($i<100) { // 執行內容 sleep(1); // 根據總量和當前任務計算任務進度$i $i++; echo ''; ob_flush(); flush();}
我以前做採集的時候寫的,ie下有用,chrome下試了下進度不跑,懶得該了
http://devp.cosrc.com/scroll2.php
很不錯,很強>>>
PHP code
// 省略其他html+js進度條代碼
$i = 0;
while($i<100) {
// 執行內容
sleep(1);
// 根據總量和當前任務計算任務進度$i
$i = $i++;
echo '';
ob_flash()
flash();
}
我會做進度條,關鍵是我不會這一步 “// 根據總量和當前任務計算任務進度$i”
我查詢怎麼做這一步呢?
引用 6 樓 hnxxwyq 的回複:
PHP code
// 省略其他html+js進度條代碼
$i = 0;
while($i<100) {
// 執行內容
sleep(1);
// 根據總量和當前任務計算任務進度$i
$i = $i++;
echo '';
ob_flash()
flash();
}
……
通常這種進度條是這樣做的
先擷取整體任務,然後以一個維度來量化,再隨時取當前進度,除以整體的,再化整
比如一個檔案內有x行要讀入,那麼雖然每行內容大小不一,但可以看做計算完每行算完成總體進度1/x
那麼如果要每處理完一行,就要響應不斷的查詢和進行一個輸出,會影響效能的,而且你的匯入方式必須能夠量化每一步
比如這樣
$file_size=檔案內資料行數;
$current=0; //第一行,開始
while (沒處理完)
{
匯入一行;
$current++;
輸出 $current/$file_size * 100;
//繼續
}
顯而易見,這得你的處理是逐步的....如果你是用某種現成的直接匯入匯出檔案的函數,你根本不會擷取到中間執行的過程.
引用 6 樓 hnxxwyq 的回複:
PHP code
// 省略其他html+js進度條代碼
$i = 0;
while($i<100) {
// 執行內容
sleep(1);
// 根據總量和當前任務計算任務進度$i
$i = $i++;
echo '';
ob_flash()
flash();
}
……
匯入時,你可以計算下csv的總行數n,然後每次固定讀取m行(可以根據你的認為的效率修正),每次處理m行,則記錄一次執行任務次數i,最後的進度比就是 floor(i*m / n) * 100;
虛擬碼
引用 10 樓 wxhbbdd 的回複:
引用 6 樓 hnxxwyq 的回複:
PHP code
// 省略其他html+js進度條代碼
$i = 0;
while($i<100) {
// 執行內容
sleep(1);
// 根據總量和當前任務計算任務進度$i
$i = $i++;
echo '';
ob……
$n = '總任務量';
$m = '批次任務執行量';
$i = 0;
while($i * $m < $n) {
// 處理m個執行量的內容
// 統計執行任務量
$total = ++$i * $m;
// 計算進度比
$p = floor(min($total, $n) / $n * 100); // 少乘了個100
}
APC實現方法:
安裝APC,參照官方文檔安裝,可以使用PECL模組安裝方法快速簡捷,這裡不說明
配置php.ini,設定參數 apc.rfc1867=1 ,使APC支援上傳進度條功能,在APC源碼說明文檔裡面有說明
代碼範例:
if ($_SERVER['REQUEST_METHOD'] == 'POST') { //上傳請求
$status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
$status['done'] = 1;
echo json_encode($status); //輸出給使用者端頁面裡的ajax調用,相關文檔請自己尋找
exit;
} elseif (isset($_GET['progress_key'])) { //讀取上傳進度
$status = apc_fetch('upload_'.$_GET['progress_key']);
echo json_encode($status);
exit;
} else {
//其他代碼,比如上傳表單等
}
uploadprogress 模組實現方法:
使用PECL模組安裝方法安裝該模組
php.ini裡面設定 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”
代碼範例:
if($_SERVER['REQUEST_METHOD']=='POST') {
if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
$upload_dir = 'your_path/';
$ext = strrchr($_FILES['video']['name'], '.');
$sessid = $_POST['UPLOAD_IDENTIFIER'] ;
$tmpfile = $upload_dir . $sessid;
$sessfile = $upload_dir . $sessid .$ext;
if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {
//上傳成功
} else {
//上傳失敗
} else {
//上傳錯誤
} elseif (!empty($_GET['sessid'])) {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type:text/html;charset=UTF-8");
$unique_id = $_GET['sessid'];
$uploadvalues = uploadprogress_get_info($unique_id);
if (is_array($uploadvalues)) {
echo json_encode($uploadvalues);
} else {
//讀取進度失敗,另外處理邏輯
}
} else {
//顯示上傳表單
}
收藏 留名~~~