<?php
/*生成錯誤日志呢?這里phpcms 作者是動態生成一個XML文件來做錯誤日志的。不錯不錯. 他使用了 in_array() 函數來實現(因為比較簡單,自己理解下)in_array()函數是檢查數組中是否存在某個值,只記錄 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 這三個級別的錯誤日志信息。\n 是文本換行符 \t是制表符. 這里他使用了一個比較漂亮而不常用的函數 wddx_serialize_value () wddx 其實也是一種 xml 。 wddx_serialize_value() 這個函數就是把一般變量以XML格式輸出。這樣我們就不用自己模擬寫xml了。方便吧。呵呵 第一個參數就是: 要格式輸出的變量,第二個參數是輸出的xml的介紹信息. 下面就是 error_log() 函數。這個函數十分有用了。就是生成錯誤日志XML文件。不需要我們fopen 了。方便吧。它還有很多功能。詳細的看手冊。chmod 設置日志文件的權限是 可讀可寫可執行。 在php5中。我習慣使用 extends Exception 來定義自己的出錯信息。所以很少用 set_error_handle(). 如果沒開啟日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就運行了。他的作用是:配置錯誤信息回報的等級。這是我從手冊中找出來的,參考一下。
E_WARNING 通常都會顯示出來,但不會中斷程序的執行。這對除錯很有效。例如:用有問題的正則表達式呼叫 ereg()。
E_ERROR 通常會顯示出來,亦會中斷程序執行。意即用這個遮罩無法追查到內存配置或其它的錯誤。
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 是實現在服務器端的。安全但負載重點。這樣做的好處?效率很好。如果你在虛擬主機的話。大家的session cookie 都放在了php.ini里面設置的默認地方。文件夾臃腫就會慢羅。是吧。第二就是安全羅。 記得一定要定義在 session_start()函數之前
*/
session_start();
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);
/**
php5開始有時區的概念了。記得就行
*/
header('Content-type: text/html; charset='.$CONFIG['charset']);
/**
* 標頭 (header) 是服務器以 HTTP 協議傳 HTML 資料到瀏覽器前所送出的字符串,在標頭與 HTML 文件之間尚需空一行分隔。
設置頁面編碼. php編碼有: 頁面編碼。數據庫編碼。文件內碼。如果三碼相同就一般不會出現亂碼. 文件內碼是什么呢?每個文件都有自己的內部編碼。一般都用UTF8比較爽。怎么改變文件內碼?你用DW也行 UE 也行。隨便。 數據庫編碼那肯定是要指定的了。mysql5開始也有字符集模式這個最好也設置這樣可以兼容更多平臺。
頁面編碼:<meta http-equiv="Content-Type" c /> 這句就是。一般的HTML頭文件都有。那 還需要header('Content-type: text/html; charset='.$CONFIG['charset']);嗎? 其實需要的。因為有些自己寫的提示層呀。或是文件里沒指定頁面編碼的。就很容易出現亂碼那么我們就防范于未然。 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); //進行正則表達式匹配
$PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown';
/**
函數 getenv() 是獲取環境變量。環境變量:HTTP_CLIENT_IP 是獲取客戶端的IP 。但有可能人家是通過代理來訪問你的程序的呢。那么這時候就要用 環境變量:
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']);
/**
獲取當前運行的腳本名: 剛開始看是不是有點亂呢。 咋沒用if else 呢。 看這樣的東西。我們最好從右看到左。這樣比較好明白點。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] 這三個服務器全局變量都是獲取 當前腳本名的。主要看服務器當前環境了。那個存在的就獲取那個。
isset() 函數 十分有用。 測試一個變量是否已經定義。 注: $a= NULL ; isset($a) 這樣會返回false的哦。 注意 isset 和empty 兩個函數的用法。用得不好會出大問題的。自己看手冊。
*/
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME']; //獲取服務器的名字。
$PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; //獲取訪問的url包括文件名。
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //測試服務器是否啟動了ssl 連接如果是的話。就用https://安全連接來進行通信
$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 : '');
/**
獲取當前腳本的URL
*/
$db_file = $db_class = 'db_'.$CONFIG['database'];
if(!defined('IN_ADMIN')) //如果不是在后臺。 常量 IN_ADMIN 是后臺標志
{
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")這個函數是求得文件最后修改的時間的,$CONFIG['phpcacheexpires'])是系統設置的緩存在機器上存貯的時間,所以這兩個時間加起來就是緩存文件實際的生存時間了。
?>