<?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'])是系统设置的缓存在机器上存贮的时间,所以这两个时间加起来就是缓存文件实际的生存时间了。
?>