common.inc.php文件23-73行代碼分析

          <?php
          /*生成錯(cuò)誤日志呢?這里phpcms 作者是動(dòng)態(tài)生成一個(gè)XML文件來做錯(cuò)誤日志的。不錯(cuò)不錯(cuò). 他使用了 in_array() 函數(shù)來實(shí)現(xiàn)(因?yàn)楸容^簡單,自己理解下)in_array()函數(shù)是檢查數(shù)組中是否存在某個(gè)值,只記錄 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 這三個(gè)級(jí)別的錯(cuò)誤日志信息。\n 是文本換行符  \t是制表符. 這里他使用了一個(gè)比較漂亮而不常用的函數(shù) wddx_serialize_value () wddx 其實(shí)也是一種 xml 。 wddx_serialize_value() 這個(gè)函數(shù)就是把一般變量以XML格式輸出。這樣我們就不用自己模擬寫xml了。方便吧。呵呵 第一個(gè)參數(shù)就是: 要格式輸出的變量,第二個(gè)參數(shù)是輸出的xml的介紹信息. 下面就是 error_log() 函數(shù)。這個(gè)函數(shù)十分有用了。就是生成錯(cuò)誤日志XML文件。不需要我們fopen 了。方便吧。它還有很多功能。詳細(xì)的看手冊(cè)。chmod 設(shè)置日志文件的權(quán)限是 可讀可寫可執(zhí)行。  在php5中。我習(xí)慣使用 extends Exception 來定義自己的出錯(cuò)信息。所以很少用 set_error_handle(). 如果沒開啟日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就運(yùn)行了。他的作用是:配置錯(cuò)誤信息回報(bào)的等級(jí)。這是我從手冊(cè)中找出來的,參考一下。
          E_WARNING 通常都會(huì)顯示出來,但不會(huì)中斷程序的執(zhí)行。這對(duì)除錯(cuò)很有效。例如:用有問題的正則表達(dá)式呼叫 ereg()。
          E_ERROR 通常會(huì)顯示出來,亦會(huì)中斷程序執(zhí)行。意即用這個(gè)遮罩無法追查到內(nèi)存配置或其它的錯(cuò)誤。
          E_PARSE 從語法中解析錯(cuò)誤。
          E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯(cuò)誤。
          E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯(cuò)誤警告。
          他的作用是把一般出錯(cuò)信息輸出過來。 */
          if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']);
          /**
          定義session 的存儲(chǔ)路徑,session 其實(shí) 也是cookie 不過 session 是實(shí)現(xiàn)在服務(wù)器端的。安全但負(fù)載重點(diǎn)。這樣做的好處?效率很好。如果你在虛擬主機(jī)的話。大家的session cookie 都放在了php.ini里面設(shè)置的默認(rèn)地方。文件夾臃腫就會(huì)慢羅。是吧。第二就是安全羅。 記得一定要定義在 session_start()函數(shù)之前
          */
          session_start();
          if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);
          /**
          php5開始有時(shí)區(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)碼。如果三碼相同就一般不會(huì)出現(xiàn)亂碼. 文件內(nèi)碼是什么呢?每個(gè)文件都有自己的內(nèi)部編碼。一般都用UTF8比較爽。怎么改變文件內(nèi)碼?你用DW也行  UE 也行。隨便。 數(shù)據(jù)庫編碼那肯定是要指定的了。mysql5開始也有字符集模式這個(gè)最好也設(shè)置這樣可以兼容更多平臺(tái)。

          頁面編碼:<meta http-equiv="Content-Type" c />  這句就是。一般的HTML頭文件都有。那 還需要header('Content-type: text/html; charset='.$CONFIG['charset']);嗎?  其實(shí)需要的。因?yàn)橛行┳约簩懙奶崾緦友健;蚴俏募餂]指定頁面編碼的。就很容易出現(xiàn)亂碼那么我們就防范于未然。 header 一個(gè)編碼過去。那就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 。但有可能人家是通過代理來訪問你的程序的呢。那么這時(shí)候就要用 環(huán)境變量:
          HTTP_X_FORWARDED_FOR 了。包括getenv('REMOTE_ADDR') $_SERVER['REMOTE_ADDR']   都是獲取人家IP的。反正碰羅。碰到那個(gè)能獲取就大工告成。
          */
          $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)行的腳本名:  剛開始看是不是有點(diǎn)亂呢。 咋沒用if else 呢。 看這樣的東西。我們最好從右看到左。這樣比較好明白點(diǎn)。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] 這三個(gè)服務(wù)器全局變量都是獲取 當(dāng)前腳本名的。主要看服務(wù)器當(dāng)前環(huán)境了。那個(gè)存在的就獲取那個(gè)。
          isset() 函數(shù) 十分有用。 測(cè)試一個(gè)變量是否已經(jīng)定義。 注: $a= NULL ; isset($a) 這樣會(huì)返回false的哦。 注意 isset 和empty 兩個(gè)函數(shù)的用法。用得不好會(huì)出大問題的。自己看手冊(cè)。  
          */
          $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://'; //測(cè)試服務(wù)器是否啟動(dòng)了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')) //如果不是在后臺(tái)。 常量 IN_ADMIN 是后臺(tái)標(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")這個(gè)函數(shù)是求得文件最后修改的時(shí)間的,$CONFIG['phpcacheexpires'])是系統(tǒng)設(shè)置的緩存在機(jī)器上存貯的時(shí)間,所以這兩個(gè)時(shí)間加起來就是緩存文件實(shí)際的生存時(shí)間了。
           
          ?>

          posted on 2008-12-10 01:25 丁克設(shè)計(jì) 閱讀(310) 評(píng)論(0)  編輯  收藏 所屬分類: PHPCMS整站代碼講解

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 青州市| 清苑县| 潼关县| 天祝| 若尔盖县| 远安县| 丰县| 连平县| 亚东县| 千阳县| 扶风县| 康保县| 石屏县| 杭锦旗| 门源| 梓潼县| 兴业县| 滨州市| 宜阳县| 多伦县| 双城市| 寻甸| 镇巴县| 康平县| 紫阳县| 海林市| 贞丰县| 静安区| 台江县| 客服| 将乐县| 富宁县| 曲阳县| 佳木斯市| 洛扎县| 乌鲁木齐市| 灵川县| 湘潭县| 赤壁市| 普陀区| 乡宁县|