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

          <?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'])是系統設置的緩存在機器上存貯的時間,所以這兩個時間加起來就是緩存文件實際的生存時間了。
           
          ?>

          posted on 2008-12-10 01:25 丁克設計 閱讀(307) 評論(0)  編輯  收藏 所屬分類: PHPCMS整站代碼講解

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 巧家县| 垣曲县| 拉萨市| 乐亭县| 桐梓县| 额敏县| 苏尼特右旗| 石林| 石嘴山市| 林州市| 黄梅县| 青州市| 海安县| 和龙市| 尼勒克县| 墨江| 云龙县| 庆云县| 苏尼特左旗| 丰台区| 香格里拉县| 荔浦县| 太仓市| 张家口市| 凤翔县| 泰来县| 镇原县| 海伦市| 普宁市| 奇台县| 大城县| 泰安市| 西林县| 湟中县| 阳高县| 迁安市| 丰原市| 山东| 武乡县| 山西省| 镇巴县|