特點:
調用效率極高,79萬數據隨機調用測試,只需要500毫秒
調用可指定欄目調用,也可整個表調用
安裝簡單,只需一個函數
PHP代碼:
function ecms_rand($classid,$num){
global $empire,$dbtbpre;
$file_cache = ECMS_PATH."d/news.json"; //緩存文件
//緩存整個news表的數據
if(!file_exists($file_cache)){
//查詢分類
$hm_class=$empire->query("select classid from {$dbtbpre}enewsclass");
while($hm_r=$empire->fetch($hm_class))
{
//查詢分類下面的所有id
$hm_news=$empire->query("SELECT id FROM `{$dbtbpre}ecms_news` WHERE `classid` = {$hm_r[classid]}");
while($hm_nr=$empire->fetch($hm_news))
{
$news_data[$hm_r['classid']][] = $hm_nr[id];
}
}
file_put_contents($file_cache,json_encode($news_data));
}
//獲取緩存數據文件
$file_arrs = json_decode(file_get_contents($file_cache),true);
if($classid=="0"){
$num = ceil($num/count($file_arrs));
foreach($file_arrs as $k=>$v)
{
if(count($v) <= $num){ continue;}
//根據數據表獲取id,每個欄目隨機分配文章id
$key_array = array_rand($file_arrs[$k],$num);
foreach($key_array as $v)
{
$rand_id.= $file_arrs[$k][$v].",";
}
}
$rand_id = rtrim($rand_id,",");
}else{
if(count($file_arrs[$classid]) <= $num){
$key_array = array_rand($file_arrs[$classid],count($file_arrs[$classid]));
}else{
$key_array = array_rand($file_arrs[$classid],$num);
}
//根據數據表獲取id,每個欄目隨機分配文章id
$key_array = array_rand($file_arrs[$classid],$num);
foreach($key_array as $v)
{
$rand_id.= $file_arrs[$classid][$v].",";
}
$rand_id = rtrim($rand_id,",");
}
return $rand_id;
}
安裝方式:
將代碼放到e/class/userfun.php文件中
調用方式:
<?php
$id = ecms_rand(1,50);
?>
調用的文章id:
[e:loop={0,50,3,0,"id in ($id)"}]
<?=$bqr['id']?>
[/e:loop]
效率方面總結:
1、直接讀文件相比數據庫查詢效率更勝一籌,而且文中還沒算上連接和斷開的時間。
2、一次讀取的內容越大,直接讀文件的優勢會越明顯(讀文件時間都是小幅增長,這跟文件存儲的連續性和簇大小等有關係),這個結果恰恰跟預料的相反,說明MYSQL對更大文件讀取可能又附加了某些操作(兩次時間增長了近30%),如果只是單純的賦值轉換應該是差異偏小纔對。
3、寫文件和INSERT幾乎不用測試就可以推測出,數據庫效率只會更差。
4、很小的配置文件如果不需要使用到數據庫特性,更加適合放到獨立文件裏存取,無需單獨創建數據表或記錄,很大的文件比如圖片、音樂等採用文件存儲更爲方便,只把路徑或縮略圖等索引信息放到數據庫裏更合理一些。
5、PHP上如果只是讀文件,file_get_contents比fopen、fclose更有效率,不包括判斷存在這個函數時間會少3秒左右。