common.inc.php文件73-111行代碼分析
<?
{ //如果緩存文件存在和緩存沒有過期效,那么就返回緩存文件名
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //獲取傳遞過來的變量。有什么用的呢?請看下面解釋
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
/**
parse_str:本函數(shù)可將瀏覽器返回的 GET 方法的 QUERY_STRING 字符串解析。返回的變量名及值就依 QUERY_STRING 的名稱及值.
上面這部分相對復(fù)雜了點(diǎn)。但沒關(guān)系。慢慢講解. 首先緩存只針對前臺.所以我們一開始就判斷.這個腳本是運(yùn)行在前臺的而不是在后臺 !defined('IN_ADMIN') 來判斷.
然后呢.再看客戶配置 config.inc.php文件是否開啟了緩存. ==2 就是開啟了. .接著開始用一系列的規(guī)則來找出緩存的文件名和目錄: 以 腳本名:xx.php和后續(xù)傳遞的參數(shù) ?xx=ee&bb=jj 他兩的字符竄的MD5 .以這個md5竄來定義出了緩存目錄.和緩存文件 .接著再判斷這個緩存文件是否存在和是否沒過緩存有效期.如果沒有就返回這個緩存文件的名字.
然后到主菜了. 最后一個if邏輯是做什么的呢? 不知道大家有沒見過 這樣的網(wǎng)址:http://www.beihai.com/dd.php/xx-23/cc-22.html 他們其實都算是偽靜態(tài).優(yōu)化URL用的.咋看起來還很象靜態(tài).爽. 但你可能想.這樣的地址.我們寫PHP程序的.怎么獲取get 變量呢? 最后if 就是解答這個問題的. 先剝離url來獲取 傳遞的字符竄.然后 str_replace 來把 '/' '-' 替換成標(biāo)準(zhǔn)的 '&' '=' 好象: http://www.beihai.com/dd.php&xx=23&cc=22 看這樣你應(yīng)該看明白了吧.然后用 parse_str() 函數(shù)來把xx 變 $xx=23 cc 變 $cc=22 php真是什么都給你想到了.強(qiáng).看明白了吧.OK.過了.
{ //如果緩存文件存在和緩存沒有過期效,那么就返回緩存文件名
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //獲取傳遞過來的變量。有什么用的呢?請看下面解釋
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
/**
parse_str:本函數(shù)可將瀏覽器返回的 GET 方法的 QUERY_STRING 字符串解析。返回的變量名及值就依 QUERY_STRING 的名稱及值.
上面這部分相對復(fù)雜了點(diǎn)。但沒關(guān)系。慢慢講解. 首先緩存只針對前臺.所以我們一開始就判斷.這個腳本是運(yùn)行在前臺的而不是在后臺 !defined('IN_ADMIN') 來判斷.
然后呢.再看客戶配置 config.inc.php文件是否開啟了緩存. ==2 就是開啟了. .接著開始用一系列的規(guī)則來找出緩存的文件名和目錄: 以 腳本名:xx.php和后續(xù)傳遞的參數(shù) ?xx=ee&bb=jj 他兩的字符竄的MD5 .以這個md5竄來定義出了緩存目錄.和緩存文件 .接著再判斷這個緩存文件是否存在和是否沒過緩存有效期.如果沒有就返回這個緩存文件的名字.
然后到主菜了. 最后一個if邏輯是做什么的呢? 不知道大家有沒見過 這樣的網(wǎng)址:http://www.beihai.com/dd.php/xx-23/cc-22.html 他們其實都算是偽靜態(tài).優(yōu)化URL用的.咋看起來還很象靜態(tài).爽. 但你可能想.這樣的地址.我們寫PHP程序的.怎么獲取get 變量呢? 最后if 就是解答這個問題的. 先剝離url來獲取 傳遞的字符竄.然后 str_replace 來把 '/' '-' 替換成標(biāo)準(zhǔn)的 '&' '=' 好象: http://www.beihai.com/dd.php&xx=23&cc=22 看這樣你應(yīng)該看明白了吧.然后用 parse_str() 函數(shù)來把xx 變 $xx=23 cc 變 $cc=22 php真是什么都給你想到了.強(qiáng).看明白了吧.OK.過了.
恩.終于把common.inc.php 這個文件大概講解完了. 這個文件里面包含了很多東西.都是些挺不錯的思想.大家應(yīng)該好好學(xué)習(xí).這樣我們寫出來的PHP程序會更加強(qiáng)壯.
,偶現(xiàn)在晚上都在邊陪老婆邊看電影邊弄linux 的C,還是學(xué)習(xí) 階段 所以時間有點(diǎn)緊.白天在公司擠點(diǎn)時間出來分析代碼羅.
對于phpcms 我也是第一次接觸.以前沒裝過也沒用過.現(xiàn)在也沒詳細(xì)用過.所以我看到代碼講什么我就講什么.沒具體講PHPCMS的應(yīng)用等.希望理解.
如果我分析代碼分析得不合理.請指出.功能進(jìn)步學(xué)習(xí).謝謝復(fù)制PHP內(nèi)容到剪貼板PHP代碼: */
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php'; // 包含數(shù)據(jù)庫操作類,下章詳說
require PHPCMS_ROOT.'/include/tag.func.php'; //遇到再說
require PHPCMS_ROOT.'/include/extension.inc.php'; //遇到再說
$db = new $db_class; // 實例化數(shù)據(jù)庫類
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //連接數(shù)據(jù)庫@_@
$db->iscache = $CONFIG['dbiscache']; //是否開啟SQL緩存
$db->expires = $CONFIG['dbexpires']; //緩存時間
if(!cache_read('table.php'))
{
require_once PHPCMS_ROOT.'/include/cache.func.php';
cache_all(); //生成所有緩存
}
/**
cache_read() 函數(shù) 讀緩存文件函數(shù)存在 global.func.php 里面.上菜先:
function cache_read($file, $mode = 'i')
{
$cachefile = PHPCMS_CACHEDIR.$file;
if(!file_exists($cachefile)) return array();
return $mode == 'i' ? include $cachefile : file_get_contents($cachefile); //這一步是用來判斷是不是本站內(nèi)模塊,如果沒有傳入值的話就調(diào)用這個緩存,反之則得到他的內(nèi)容。
}
就這么簡單.文本緩存,在一些大的開源的PHP項目中經(jīng)常見到.主要是為了減輕數(shù)據(jù)庫的負(fù)荷的. 比如在程序啟動文件里面,就把一些后臺配置的常用信息緩存到php文件里面.然后在以后的程序就可以直接使用而不用每次都訪問數(shù)據(jù)庫了.但對經(jīng)常要更新的信息.最好不要用文本緩存這形式,因為PHP文件內(nèi)置的文件鎖flock()不是很好用.大系統(tǒng)中多用戶同時寫訪問的時候有可能會把緩存文件破壞.大系統(tǒng)建議使用 memcached mysql5.1 分區(qū) mysql 主從 來實現(xiàn)負(fù)載均衡 @=@ 廢話太多了. 這個函數(shù)很簡單.自己看下就明白了.如果緩存和模式變量 $mode 是否為 i 是就include 不是就 把文件以字符竄形式讀到內(nèi)存中.
如果 cache_read()找不到緩存文件'table.php'就會返回false,那么就 加栽 cache.func.php 文件.它里面是些創(chuàng)建緩存的一些函數(shù). 然后呢執(zhí)行 cache_all()函數(shù)生成所有的常用信息緩存.
關(guān)于phpcms 的緩存更詳細(xì)包括生成原理.打算在弄完啟動文件common.inc.php 后再開篇寫個詳細(xì)的.
*/
$CACHE = cache_read('common.php');
/**
加載 common.php 緩存文件里面的變量(數(shù)據(jù)) 這樣我們不用從數(shù)據(jù)庫讀了每次.是吧
common.php 文件里面是什么來的呢?上菜:
<?php
return array (
'module' =>
array (
'phpcms' =>
array (
'module' => 'phpcms',
'name' => 'phpcms',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => '',
'linkurl' => '',
),
'member' =>
array (
'module' => 'member',
'name' => '會員',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => 'member',
'linkurl' => '/phpcms/member/',
),
'article' =>
array (
'module' => 'article',
'name' => '文章',
'iscore' => '0',
'iscopy' => '1',
'isshare' => '0',
'moduledir' => 'article',
'linkurl' => '',
)
?>
看到了吧.這個就是全部從數(shù)據(jù)庫里面生成的文本緩存信息.我們不用每次都連接數(shù)據(jù)庫讀數(shù)據(jù)庫.而只要訪問里面的數(shù)組就可以得到一些配置信息.
這個就是文本緩存的作用了,至于怎么會生成這個文本緩存文件的.我會另外開一篇來介紹。
*/
$MODULE = $CACHE['module']; //把緩存中的數(shù)據(jù)(common.php)存放到數(shù)組中。
$CHANNEL = $CACHE['channel'];
$PHPCMS = $CACHE['phpcms'];
$FIELD = $CACHE['field'];
unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']);
/**
unset 掉不需要用的變量.
*/
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php'; // 包含數(shù)據(jù)庫操作類,下章詳說
require PHPCMS_ROOT.'/include/tag.func.php'; //遇到再說
require PHPCMS_ROOT.'/include/extension.inc.php'; //遇到再說
$db = new $db_class; // 實例化數(shù)據(jù)庫類
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //連接數(shù)據(jù)庫@_@
$db->iscache = $CONFIG['dbiscache']; //是否開啟SQL緩存
$db->expires = $CONFIG['dbexpires']; //緩存時間
if(!cache_read('table.php'))
{
require_once PHPCMS_ROOT.'/include/cache.func.php';
cache_all(); //生成所有緩存
}
/**
cache_read() 函數(shù) 讀緩存文件函數(shù)存在 global.func.php 里面.上菜先:
function cache_read($file, $mode = 'i')
{
$cachefile = PHPCMS_CACHEDIR.$file;
if(!file_exists($cachefile)) return array();
return $mode == 'i' ? include $cachefile : file_get_contents($cachefile); //這一步是用來判斷是不是本站內(nèi)模塊,如果沒有傳入值的話就調(diào)用這個緩存,反之則得到他的內(nèi)容。
}
就這么簡單.文本緩存,在一些大的開源的PHP項目中經(jīng)常見到.主要是為了減輕數(shù)據(jù)庫的負(fù)荷的. 比如在程序啟動文件里面,就把一些后臺配置的常用信息緩存到php文件里面.然后在以后的程序就可以直接使用而不用每次都訪問數(shù)據(jù)庫了.但對經(jīng)常要更新的信息.最好不要用文本緩存這形式,因為PHP文件內(nèi)置的文件鎖flock()不是很好用.大系統(tǒng)中多用戶同時寫訪問的時候有可能會把緩存文件破壞.大系統(tǒng)建議使用 memcached mysql5.1 分區(qū) mysql 主從 來實現(xiàn)負(fù)載均衡 @=@ 廢話太多了. 這個函數(shù)很簡單.自己看下就明白了.如果緩存和模式變量 $mode 是否為 i 是就include 不是就 把文件以字符竄形式讀到內(nèi)存中.
如果 cache_read()找不到緩存文件'table.php'就會返回false,那么就 加栽 cache.func.php 文件.它里面是些創(chuàng)建緩存的一些函數(shù). 然后呢執(zhí)行 cache_all()函數(shù)生成所有的常用信息緩存.
關(guān)于phpcms 的緩存更詳細(xì)包括生成原理.打算在弄完啟動文件common.inc.php 后再開篇寫個詳細(xì)的.
*/
$CACHE = cache_read('common.php');
/**
加載 common.php 緩存文件里面的變量(數(shù)據(jù)) 這樣我們不用從數(shù)據(jù)庫讀了每次.是吧
common.php 文件里面是什么來的呢?上菜:
<?php
return array (
'module' =>
array (
'phpcms' =>
array (
'module' => 'phpcms',
'name' => 'phpcms',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => '',
'linkurl' => '',
),
'member' =>
array (
'module' => 'member',
'name' => '會員',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => 'member',
'linkurl' => '/phpcms/member/',
),
'article' =>
array (
'module' => 'article',
'name' => '文章',
'iscore' => '0',
'iscopy' => '1',
'isshare' => '0',
'moduledir' => 'article',
'linkurl' => '',
)
?>
看到了吧.這個就是全部從數(shù)據(jù)庫里面生成的文本緩存信息.我們不用每次都連接數(shù)據(jù)庫讀數(shù)據(jù)庫.而只要訪問里面的數(shù)組就可以得到一些配置信息.
這個就是文本緩存的作用了,至于怎么會生成這個文本緩存文件的.我會另外開一篇來介紹。
*/
$MODULE = $CACHE['module']; //把緩存中的數(shù)據(jù)(common.php)存放到數(shù)組中。
$CHANNEL = $CACHE['channel'];
$PHPCMS = $CACHE['phpcms'];
$FIELD = $CACHE['field'];
unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']);
/**
unset 掉不需要用的變量.
*/
?>
posted on 2008-12-17 23:33 丁克設(shè)計 閱讀(337) 評論(0) 編輯 收藏 所屬分類: PHPCMS整站代碼講解