common.inc.php文件23-73行代碼分析
<?php
/*生成錯誤日志呢?這里phpcms 作者是動態(tài)生成一個XML文件來做錯誤日志的。不錯不錯. 他使用了 in_array() 函數(shù)來實現(xiàn)(因為比較簡單,自己理解下)in_array()函數(shù)是檢查數(shù)組中是否存在某個值,只記錄 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 這三個級別的錯誤日志信息。\n 是文本換行符 \t是制表符. 這里他使用了一個比較漂亮而不常用的函數(shù) wddx_serialize_value () wddx 其實也是一種 xml 。 wddx_serialize_value() 這個函數(shù)就是把一般變量以XML格式輸出。這樣我們就不用自己模擬寫xml了。方便吧。呵呵 第一個參數(shù)就是: 要格式輸出的變量,第二個參數(shù)是輸出的xml的介紹信息. 下面就是 error_log() 函數(shù)。這個函數(shù)十分有用了。就是生成錯誤日志XML文件。不需要我們fopen 了。方便吧。它還有很多功能。詳細(xì)的看手冊。chmod 設(shè)置日志文件的權(quán)限是 可讀可寫可執(zhí)行。 在php5中。我習(xí)慣使用 extends Exception 來定義自己的出錯信息。所以很少用 set_error_handle(). 如果沒開啟日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就運(yùn)行了。他的作用是:配置錯誤信息回報的等級。這是我從手冊中找出來的,參考一下。
E_WARNING 通常都會顯示出來,但不會中斷程序的執(zhí)行。這對除錯很有效。例如:用有問題的正則表達(dá)式呼叫 ereg()。
E_ERROR 通常會顯示出來,亦會中斷程序執(zhí)行。意即用這個遮罩無法追查到內(nèi)存配置或其它的錯誤。
E_PARSE 從語法中解析錯誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯誤警告。
他的作用是把一般出錯信息輸出過來。 */
if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']);
/**
定義session 的存儲路徑,session 其實 也是cookie 不過 session 是實現(xiàn)在服務(wù)器端的。安全但負(fù)載重點。這樣做的好處?效率很好。如果你在虛擬主機(jī)的話。大家的session cookie 都放在了php.ini里面設(shè)置的默認(rèn)地方。文件夾臃腫就會慢羅。是吧。第二就是安全羅。 記得一定要定義在 session_start()函數(shù)之前
*/
session_start();
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);
/**
php5開始有時區(qū)的概念了。記得就行
*/
header('Content-type: text/html; charset='.$CONFIG['charset']);
/**
* 標(biāo)頭 (header) 是服務(wù)器以 HTTP 協(xié)議傳 HTML 資料到瀏覽器前所送出的字符串,在標(biāo)頭與 HTML 文件之間尚需空一行分隔。
設(shè)置頁面編碼. php編碼有: 頁面編碼。數(shù)據(jù)庫編碼。文件內(nèi)碼。如果三碼相同就一般不會出現(xiàn)亂碼. 文件內(nèi)碼是什么呢?每個文件都有自己的內(nèi)部編碼。一般都用UTF8比較爽。怎么改變文件內(nèi)碼?你用DW也行 UE 也行。隨便。 數(shù)據(jù)庫編碼那肯定是要指定的了。mysql5開始也有字符集模式這個最好也設(shè)置這樣可以兼容更多平臺。
頁面編碼:<meta http-equiv="Content-Type" c /> 這句就是。一般的HTML頭文件都有。那 還需要header('Content-type: text/html; charset='.$CONFIG['charset']);嗎? 其實需要的。因為有些自己寫的提示層呀。或是文件里沒指定頁面編碼的。就很容易出現(xiàn)亂碼那么我們就防范于未然。 header 一個編碼過去。那就OK了。多好。
*/
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown'))
{
$PHP_IP = getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown'))
{
$PHP_IP = getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown'))
{
$PHP_IP = getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))
{
$PHP_IP = $_SERVER['REMOTE_ADDR'];
}
preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches); //進(jìn)行正則表達(dá)式匹配
$PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown';
/**
函數(shù) getenv() 是獲取環(huán)境變量。環(huán)境變量:HTTP_CLIENT_IP 是獲取客戶端的IP 。但有可能人家是通過代理來訪問你的程序的呢。那么這時候就要用 環(huán)境變量:
HTTP_X_FORWARDED_FOR 了。包括getenv('REMOTE_ADDR') $_SERVER['REMOTE_ADDR'] 都是獲取人家IP的。反正碰羅。碰到那個能獲取就大工告成。
*/
$PHP_TIME = time();
$PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $_SERVER['ORIG_PATH_INFO']);
/**
獲取當(dāng)前運(yùn)行的腳本名: 剛開始看是不是有點亂呢。 咋沒用if else 呢。 看這樣的東西。我們最好從右看到左。這樣比較好明白點。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] 這三個服務(wù)器全局變量都是獲取 當(dāng)前腳本名的。主要看服務(wù)器當(dāng)前環(huán)境了。那個存在的就獲取那個。
isset() 函數(shù) 十分有用。 測試一個變量是否已經(jīng)定義。 注: $a= NULL ; isset($a) 這樣會返回false的哦。 注意 isset 和empty 兩個函數(shù)的用法。用得不好會出大問題的。自己看手冊。
*/
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME']; //獲取服務(wù)器的名字。
$PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; //獲取訪問的url包括文件名。
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //測試服務(wù)器是否啟動了ssl 連接如果是的話。就用https://安全連接來進(jìn)行通信
$PHP_PORT = $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];
$PHP_SITEURL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.PHPCMS_PATH;
$PHP_URL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.$PHP_SELF.($PHP_QUERYSTRING ? '?'.$PHP_QUERYSTRING : '');
/**
獲取當(dāng)前腳本的URL
*/
$db_file = $db_class = 'db_'.$CONFIG['database'];
if(!defined('IN_ADMIN')) //如果不是在后臺。 常量 IN_ADMIN 是后臺標(biāo)志
{
if($CONFIG['dbiscache']) $db_file .= '_cache';
if($CONFIG['phpcache'] == '2') // 如果在config.inc.php 里面開啟了緩存
{
$cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING); //把腳本名和后面的get信息 md5加密,以此來生成下面的緩存目錄和緩存文件
$cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/'; //緩存目錄
$cachefile = $cachefiledir.$cachefileid.'.html'; //緩存文件: xxx.html 格式
if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))
/*生成錯誤日志呢?這里phpcms 作者是動態(tài)生成一個XML文件來做錯誤日志的。不錯不錯. 他使用了 in_array() 函數(shù)來實現(xiàn)(因為比較簡單,自己理解下)in_array()函數(shù)是檢查數(shù)組中是否存在某個值,只記錄 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 這三個級別的錯誤日志信息。\n 是文本換行符 \t是制表符. 這里他使用了一個比較漂亮而不常用的函數(shù) wddx_serialize_value () wddx 其實也是一種 xml 。 wddx_serialize_value() 這個函數(shù)就是把一般變量以XML格式輸出。這樣我們就不用自己模擬寫xml了。方便吧。呵呵 第一個參數(shù)就是: 要格式輸出的變量,第二個參數(shù)是輸出的xml的介紹信息. 下面就是 error_log() 函數(shù)。這個函數(shù)十分有用了。就是生成錯誤日志XML文件。不需要我們fopen 了。方便吧。它還有很多功能。詳細(xì)的看手冊。chmod 設(shè)置日志文件的權(quán)限是 可讀可寫可執(zhí)行。 在php5中。我習(xí)慣使用 extends Exception 來定義自己的出錯信息。所以很少用 set_error_handle(). 如果沒開啟日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就運(yùn)行了。他的作用是:配置錯誤信息回報的等級。這是我從手冊中找出來的,參考一下。
E_WARNING 通常都會顯示出來,但不會中斷程序的執(zhí)行。這對除錯很有效。例如:用有問題的正則表達(dá)式呼叫 ereg()。
E_ERROR 通常會顯示出來,亦會中斷程序執(zhí)行。意即用這個遮罩無法追查到內(nèi)存配置或其它的錯誤。
E_PARSE 從語法中解析錯誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯誤警告。
他的作用是把一般出錯信息輸出過來。 */
if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']);
/**
定義session 的存儲路徑,session 其實 也是cookie 不過 session 是實現(xiàn)在服務(wù)器端的。安全但負(fù)載重點。這樣做的好處?效率很好。如果你在虛擬主機(jī)的話。大家的session cookie 都放在了php.ini里面設(shè)置的默認(rèn)地方。文件夾臃腫就會慢羅。是吧。第二就是安全羅。 記得一定要定義在 session_start()函數(shù)之前
*/
session_start();
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);
/**
php5開始有時區(qū)的概念了。記得就行
*/
header('Content-type: text/html; charset='.$CONFIG['charset']);
/**
* 標(biāo)頭 (header) 是服務(wù)器以 HTTP 協(xié)議傳 HTML 資料到瀏覽器前所送出的字符串,在標(biāo)頭與 HTML 文件之間尚需空一行分隔。
設(shè)置頁面編碼. php編碼有: 頁面編碼。數(shù)據(jù)庫編碼。文件內(nèi)碼。如果三碼相同就一般不會出現(xiàn)亂碼. 文件內(nèi)碼是什么呢?每個文件都有自己的內(nèi)部編碼。一般都用UTF8比較爽。怎么改變文件內(nèi)碼?你用DW也行 UE 也行。隨便。 數(shù)據(jù)庫編碼那肯定是要指定的了。mysql5開始也有字符集模式這個最好也設(shè)置這樣可以兼容更多平臺。
頁面編碼:<meta http-equiv="Content-Type" c /> 這句就是。一般的HTML頭文件都有。那 還需要header('Content-type: text/html; charset='.$CONFIG['charset']);嗎? 其實需要的。因為有些自己寫的提示層呀。或是文件里沒指定頁面編碼的。就很容易出現(xiàn)亂碼那么我們就防范于未然。 header 一個編碼過去。那就OK了。多好。
*/
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown'))
{
$PHP_IP = getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown'))
{
$PHP_IP = getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown'))
{
$PHP_IP = getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))
{
$PHP_IP = $_SERVER['REMOTE_ADDR'];
}
preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches); //進(jìn)行正則表達(dá)式匹配
$PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown';
/**
函數(shù) getenv() 是獲取環(huán)境變量。環(huán)境變量:HTTP_CLIENT_IP 是獲取客戶端的IP 。但有可能人家是通過代理來訪問你的程序的呢。那么這時候就要用 環(huán)境變量:
HTTP_X_FORWARDED_FOR 了。包括getenv('REMOTE_ADDR') $_SERVER['REMOTE_ADDR'] 都是獲取人家IP的。反正碰羅。碰到那個能獲取就大工告成。
*/
$PHP_TIME = time();
$PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $_SERVER['ORIG_PATH_INFO']);
/**
獲取當(dāng)前運(yùn)行的腳本名: 剛開始看是不是有點亂呢。 咋沒用if else 呢。 看這樣的東西。我們最好從右看到左。這樣比較好明白點。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] 這三個服務(wù)器全局變量都是獲取 當(dāng)前腳本名的。主要看服務(wù)器當(dāng)前環(huán)境了。那個存在的就獲取那個。
isset() 函數(shù) 十分有用。 測試一個變量是否已經(jīng)定義。 注: $a= NULL ; isset($a) 這樣會返回false的哦。 注意 isset 和empty 兩個函數(shù)的用法。用得不好會出大問題的。自己看手冊。
*/
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME']; //獲取服務(wù)器的名字。
$PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; //獲取訪問的url包括文件名。
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //測試服務(wù)器是否啟動了ssl 連接如果是的話。就用https://安全連接來進(jìn)行通信
$PHP_PORT = $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];
$PHP_SITEURL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.PHPCMS_PATH;
$PHP_URL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.$PHP_SELF.($PHP_QUERYSTRING ? '?'.$PHP_QUERYSTRING : '');
/**
獲取當(dāng)前腳本的URL
*/
$db_file = $db_class = 'db_'.$CONFIG['database'];
if(!defined('IN_ADMIN')) //如果不是在后臺。 常量 IN_ADMIN 是后臺標(biāo)志
{
if($CONFIG['dbiscache']) $db_file .= '_cache';
if($CONFIG['phpcache'] == '2') // 如果在config.inc.php 里面開啟了緩存
{
$cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING); //把腳本名和后面的get信息 md5加密,以此來生成下面的緩存目錄和緩存文件
$cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/'; //緩存目錄
$cachefile = $cachefiledir.$cachefileid.'.html'; //緩存文件: xxx.html 格式
if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))
//filemtime("file")這個函數(shù)是求得文件最后修改的時間的,$CONFIG['phpcacheexpires'])是系統(tǒng)設(shè)置的緩存在機(jī)器上存貯的時間,所以這兩個時間加起來就是緩存文件實際的生存時間了。
?>
posted on 2008-12-10 01:25 丁克設(shè)計 閱讀(308) 評論(0) 編輯 收藏 所屬分類: PHPCMS整站代碼講解