這個問題很多年了,客戶是IC行業,分類大概有幾百個或者上千個,用douphp來做發現非???。
發現瓶頸出現在獲取分類這里,所以優化了一下,優化完了以后基本秒開頁面。
代碼修改如下:
/**
* +----------------------------------------------------------
* 獲取當前分類下所有子分類
* +----------------------------------------------------------
* $table 數據表名
* $parent_id 父類ID
* $child 子類ID零時存儲器
* +----------------------------------------------------------
*/
function dou_child_id($table, $parent_id = '0', &$child_id = '') {
$data = $this->fn_query("SELECT * FROM " . $this->table($table) . " WHERE parent_id = '{$parent_id}' ORDER BY sort ASC, cat_id ASC");
foreach ((array) $data as $value) {
if ($value['parent_id'] == $parent_id) {
$child_id .= ',' . $value['cat_id'];
$this->dou_child_id($table, $value['cat_id'], $child_id);
}
}
return $child_id;
}
/**
* +----------------------------------------------------------
* 獲取無層次商品分類,將所有分類存至同一級數組,用$mark作為標記區分
* +----------------------------------------------------------
* $table 數據表名
* $parent_id 默認獲取一級導航
* $level 無限極分類層次
* $current_id 當前頁面欄目ID
* $category_nolevel 儲存分類信息的數組
* $mark 無限極分類標記
* +----------------------------------------------------------
*/
function get_category_nolevel($table, $parent_id = 0, $level = 0, $current_id = '', &$category_nolevel = array(), $mark = '-') {
$data = $this->fn_query("SELECT * FROM " . $this->table($table) . " WHERE parent_id = {$parent_id} ORDER BY sort ASC, cat_id ASC");
foreach ((array) $data as $value) {
if ($value['parent_id'] == $parent_id && $value['cat_id'] != $current_id) {
$value['url'] = $this->rewrite_url($table, $value['cat_id']);
$value['mark'] = str_repeat($mark, $level);
$category_nolevel[] = $value;
$this->get_category_nolevel($table, $value['cat_id'], $level + 1, $current_id, $category_nolevel);
}
}
return $category_nolevel;
}
/**
* +----------------------------------------------------------
* 獲取有層次的欄目分類,有幾層分類就創建幾維數組
* +----------------------------------------------------------
* $table 數據表名
* $parent_id 默認獲取一級導航
* $current_id 當前頁面欄目ID
* +----------------------------------------------------------
*/
function get_category($table, $parent_id = 0, $current_id = '') {
$category = array ();
// $cache_key = "cache_".$table.'_'.$parent_id.'_'.$current_id;
// //緩存分類結果
// $cache_data = cache_read($cache_key);
// if (!empty($cache_data)){
// return $cache_data;
// }
// $cache_data = cache_read('cache_'.$table);
// if (empty($cache_data)){
// $data = $this->fn_query("SELECT * FROM " . $this->table($table) . " ORDER BY sort ASC, cat_id ASC");
// cache_write('cache_'.$table,(array)$data);
// }else{
// $data = $cache_data;
// }
//另外一種解決方案
$data = $this->fn_query("SELECT * FROM " . $this->table($table) . " WHERE parent_id = {$parent_id} ORDER BY sort ASC, cat_id ASC");
if (empty($data)){
return false;
}
foreach ((array) $data as $value) {
// $parent_id將在嵌套函數中隨之變化
if ($value['parent_id'] == $parent_id) {
$value['url'] = $this->rewrite_url($table, $value['cat_id']);
$value['cur'] = $value['cat_id'] == $current_id ? true : false;
$value['image'] = $this->dou_file($value['image']);
$child = $this->get_category($table, $value['cat_id'], $current_id);
$value['child'] = $child;
// foreach ($data as $child) {
// // 篩選下級導航
// if ($child['parent_id'] == $value['cat_id']) {
// // 嵌套函數獲取子分類
// $value['child'] = $this->get_category($table, $value['cat_id'], $current_id);
// break;
// }
// }
$category[] = $value;
}
}
// cache_write($cache_key,$category);
return $category;
}