+ -
当前位置:首页 → 问答吧 → 周末没事,在研究discuz和phpcms代码,发点大家共享下

周末没事,在研究discuz和phpcms代码,发点大家共享下

时间:2010-05-22

来源:互联网

再次说明点,上个月工作太忙,然后再论坛上花费的时间少了点,这个月赶紧补补,  嘿嘿,闲话少说,开始代码:
开头,phpcms和discuz核心文件都是从 includes/common.inc.php开始的,我们今天就从这个文件开始
这俩文件开头写的都差不多
复制代码
  1. define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -7)));
  2. define('MICROTIME_START', microtime());
  3. define('IN_PHPCMS', TRUE);
  4. define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  5. define('TIME', time());
  6. set_include_path(PHPCMS_ROOT.'include/');
  7. set_magic_quotes_runtime(0);
  8. unset($LANG, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
  9. require 'config.inc.php';
  10. require 'global.func.php';
  11. require 'dir.func.php';
  12. require 'url.func.php';
  13. require 'output.class.php';
  14. require 'priv_group.class.php';
  15. require 'times.class.php';
  16. require PHPCMS_ROOT.'languages/'.LANG.'/phpcms.lang.php';
  17. ERRORLOG ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);


复制代码
  1. define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -7)));

作用:定义常量DISCUZ_ROOT的值
示例:
echo dirname(__FILE__); //显示 http://www.zhangyongwei.com/include
echo substr(dirname(__FILE__),0,-7);//从后面开始数截掉7个字符,显示 http://www.zhangyongwei.com/
复制代码
  1. define('MICROTIME_START', microtime());
  2. $mtime = explode(' ', microtime());??
  3. $phpcms_starttime = $mtime[1] + $mtime[0];

计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。
作用:microtime()取得Unix 时间戳和微秒数后使用explode()进行切割并存进数组变量$mtime;
示例:
echo microtime(); //将显示 0.29353300 1164349567 (根据时间的不同会显示不同的数字,但格式是一样的
$mtime[0]="0.29353300";
$mtime[1]="1164349567";
[ 此帖被zx68555在2010-05-22 23:21重新编辑 ]

作者: zx68555   发布时间: 2010-05-22

复制代码
  1. unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);

把  $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL  因为php4.1.0以上默认以 $_POST 来替代。unset后防止程序运行在低版本会出现安全等问题。比如变量注入
复制代码
  1. set_magic_quotes_runtime(0);

地球人都知道。关了字符窜入库自动转意 比如  my name is on'x     转成  my name is on \'x  为了最大的程序性能所以我们关掉吧
复制代码
  1. define('IN_PHPCMS', TRUE);

程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不?
复制代码
  1. define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));

为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量 这就是代码规范!
discuz 里也有开头跟这个差不多,我接着讲,讲的乱啊
复制代码
  1. define('DISCUZ_AVATARSHOW', '3560626219401401200');

作用:定义天下秀的常量值


作者: zx68555   发布时间: 2010-05-22

支持。

作者: ricky   发布时间: 2010-05-22

可能有些人会发现有好多地方有这样的代码
复制代码
  1. if(PHP_VERSION < '4.1.0') {
  2.         $_GET = &$HTTP_GET_VARS;
  3.         $_POST = &$HTTP_POST_VARS;
  4.         $_COOKIE = &$HTTP_COOKIE_VARS;
  5.         $_SERVER = &$HTTP_SERVER_VARS;
  6.         $_ENV = &$HTTP_ENV_VARS;
  7.         $_FILES = &$HTTP_POST_FILES;
  8. }

啥意思呢?当PHP版本小于4.1.0 的时候使用传址方式获取内置全局变量
我用红字标明了传址,为什么要使用传址而不是传值方式?
要点:在变量前加 & 符号既是传址
复制代码
  1. $a=1;
  2. $b=$a;
  3. $b++;
  4. echo "b=".$b." a=".$a; //显示:b=2 a=1 可以看到 b变了,而a 却还是没变
  5. echo "<br>";
  6. $c=1;
  7. $d=&$c;  //注意这行  &符号
  8. $d++;
  9. echo "d=".$d." c=".$c; //显示: d=2 c=2 可以看到d变了,可是c也变了

我接着讲
复制代码
  1. require PHPCMS_ROOT.'/include/global.func.php';  

包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。  常量 PHPCMS_ROOT 已经发挥作用。



作者: zx68555   发布时间: 2010-05-22

,有点累,我接着啊,唉,为了提高这个论坛的版块人气,我拼了老命了,我技术也是刚起步,哈哈,跟大家一起学习
复制代码
  1. require 'config.inc.php';
  2. require 'global.func.php';
  3. require 'dir.func.php';
  4. require 'url.func.php';
  5. require 'output.class.php';
  6. require 'priv_group.class.php';
  7. require 'times.class.php';
  8. require PHPCMS_ROOT.'languages/'.LANG.'/phpcms.lang.php';
  9. ERRORLOG ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);
  10. define('IP', ip());
  11. define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
  12. define('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : preg_replace("/(.*)\.php(.*)/i", "\\1.php", $_SERVER['PHP_SELF']));
  13. define('QUERY_STRING', $_SERVER['QUERY_STRING']);
  14. define('PATH_INFO', isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
  15. define('DOMAIN', isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : preg_replace("/([^:]*)[:0-9]*/i", "\\1", $_SERVER['HTTP_HOST']));
  16. define('SCHEME', $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://');
  17. define('SITE_URL', SCHEME.$_SERVER['HTTP_HOST'].PHPCMS_PATH);
  18. define('RELATE_URL', isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : SCRIPT_NAME.(QUERY_STRING ? '?'.QUERY_STRING : PATH_INFO));
  19. define('URL', SCHEME.$_SERVER['HTTP_HOST'].RELATE_URL);
  20. define('RELATE_REFERER',urlencode(RELATE_URL));
  21. if(function_exists('date_default_timezone_set')) date_default_timezone_set(TIMEZONE);
  22. header('Content-type: text/html; charset='.CHARSET);

这是我刚粘的一块,
复制代码
  1. require PHPCMS_ROOT.'languages/'.LANG.'/phpcms.lang.php';  

顾名思义: 这个就是加载语言包了。PHP的国际化目前做得最多的。就是直接用PHP文件来实现。 在 phpcms.lang.php 文件里面定义程序中要用到的中文信息。然后在程序一开始就加载。那里程序里面就可以使用这个文件里面的变量和一切。那么就简单了。模板上就不需要直接写中文信息了。直接用这个文件里面定义的变量等来替换。
复制代码
  1. ERRORLOG ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);

这是对phpcms错误的处理方法
复制代码
  1. define('ERRORLOG', 0); //是否保存错误日志
这是从config.inc.php里拿的 当然这里使用了三目运算符,set_error_handler() 这个函数就大有来头了。php4里面的典型自定义程序出错后行为的一个函数。十分好用。怎么用呢? set_error_handler(函数) 的参数也是一个函数。这个函数。反映了程序出错后行为的。phpcms_error 函数存在 global.func.php 全局函数里面。我给大家找到哈当然,这个函数我这里就不讲了,大家看吧
复制代码
  1. function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)
  2. {
  3.     $filename = str_replace(PHPCMS_ROOT, '.', $filename);
  4.     $filename = str_replace("\\", '/', $filename);
  5.     if(!defined('E_STRICT')) define('E_STRICT', 2048);
  6.     $dt = date('Y-m-d H:i:s');
  7.     $errortype = array (
  8.     E_ERROR           => 'Error',
  9.     E_WARNING         => 'Warning',
  10.     E_PARSE           => 'Parsing Error',
  11.     E_NOTICE          => 'Notice',
  12.     E_CORE_ERROR      => 'Core Error',
  13.     E_CORE_WARNING    => 'Core Warning',
  14.     E_COMPILE_ERROR   => 'Compile Error',
  15.     E_COMPILE_WARNING => 'Compile Warning',
  16.     E_USER_ERROR      => 'User Error',
  17.     E_USER_WARNING    => 'User Warning',
  18.     E_USER_NOTICE     => 'User Notice',
  19.     E_STRICT          => 'Runtime Notice'
  20.     );
  21.     $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
  22.     $err = "<errorentry>\n";
  23.     $err .= "\t<datetime>" . $dt . "</datetime>\n";
  24.     $err .= "\t<errornum>" . $errno . "</errornum>\n";
  25.     $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
  26.     $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
  27.     $err .= "\t<scriptname>" . $filename . "</scriptname>\n";
  28.     $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
  29.     if (in_array($errno, $user_errors))
  30.     {
  31.         $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
  32.     }
  33.     $err .= "</errorentry>\n\n";
  34.     error_log($err, 3, PHPCMS_ROOT.'/data/php_error_log.xml');
  35.     @chmod(PHPCMS_ROOT.'/data/php_error_log.xml', 0777);
  36. }

写的很强大的函数



作者: zx68555   发布时间: 2010-05-22

刚才在QQ群里拉了下人气,哈哈,我还是分析下这个函数吧,
复制代码
  1. function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)

这个鸟函数默认带五个参数 第一个参数 $errno 是程序出错的等级。 第二参数是程序出错的界面信息。第三是出现错误的程序文件名。第四是 第几行出现错误。第五个参数。要不要都行,是当前变量状态,没多大意义,信息都有了,该展现给前台信息,phpcms是生成xml文件来做错误日志的
复制代码
  1. if (in_array($errno, $user_errors))
  2.     {
  3.         $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
  4.     }

他使用了 in_array()--(检查数组中是否存在某个值) 函数来实现。只记录 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 这三个级别的错误日志信息。\n 是文本换行符  \t是制表符. wddx_serialize_value () 这个函数听强的,这个函数就是把一般变量以XML格式输出。这样我们就不用自己模拟写xml了。第一个参数就是: 要格式输出的变量,第二个参数是输出的xml的介绍信息. ,具体函数大家可以看手册。
下面就是 error_log() 函数。这个函数十分有用了。就是生成错误日志XML文件。不需要我们fopen 了。强,是吧,
oh my god ,群里那棒人怎么也不来顶下,累死了,接着啊 chmod 设置日志文件的权限是 可读可写可执行。
这个函数讲完!

作者: zx68555   发布时间: 2010-05-22

经典,绝对支持~

作者: deepblue   发布时间: 2010-05-22

嘿嘿 顶一个。 不算卡楼吧

作者: gin   发布时间: 2010-05-22

  
'700')this.width='700';if(this.offsetHeight>'700')this.height='700';" title="Click Here To EnLarge">嘿嘿,插入下图片,唉,他们都不顶,气死我了,我接着讲啊
在php5中。我习惯使用 extends Exception(继承) 来定义自己的出错信息。所以很少用 set_error_handle(). 如果没开启日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就运行了。把一般出错信息先出过来。建议大家以后写代码页这样,考虑的多点,有用!
复制代码
  1. define('IP', ip());
  2. define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
定义了IP,和HTTP_REFERER 又是三目,isset(),大家也可以去查
讲到这里不得不说$_SERVER这个鸟东西了,PHP服务器变量,大家尽可以去搜搜有什么参数,或者在文件开头打印下,print_r($_SERVER);里面包含了很多变量
偷偷懒把手册上的贴出来啊
复制代码
  1. 服务器变量:$_SERVER
  2. 注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。
  3. $_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在 CGI 1.1 规范中说明,所以应该仔细研究一下。
  4. 这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。
  5. $HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量(注意:$HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同)。
  6. 如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节使用 Register Globals。这些单独的全局变量不是自动全局变量。
  7. 或许会发现下面列出的某些 $_SERVER 元素并不可用。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。
  8. “PHP_SELF”
  9. 当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。
  10. 如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。
  11. “argv”
  12. 传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。
  13. “argc”
  14. 包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
  15. “GATEWAY_INTERFACE”
  16. 服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。
  17. “SERVER_NAME”
  18. 当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。
  19. “SERVER_SOFTWARE”
  20. 服务器标识的字串,在响应请求时的头信息中给出。
  21. “SERVER_PROTOCOL”
  22. 请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
  23. “REQUEST_METHOD”
  24. 访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
  25. 注: 如果请求的方式是 HEAD,PHP 脚本将在送出头信息后中止(这意味着在产生任何输出后,不再有输出缓冲)。
  26. “REQUEST_TIME”
  27. 请求开始时的时间戳。从 PHP 5.1.0 起有效。
  28. “QUERY_STRING”
  29. 查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。
  30. “DOCUMENT_ROOT”
  31. 当前运行脚本所在的文档根目录。在服务器配置文件中定义。
  32. “HTTP_ACCEPT”
  33. 当前请求的 Accept: 头信息的内容。
  34. “HTTP_ACCEPT_CHARSET”
  35. 当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。
  36. “HTTP_ACCEPT_ENCODING”
  37. 当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。
  38. “HTTP_ACCEPT_LANGUAGE”
  39. 当前请求的 Accept-Language: 头信息的内容。例如:“en”。
  40. “HTTP_CONNECTION”
  41. 当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。
  42. “HTTP_HOST”
  43. 当前请求的 Host: 头信息的内容。
  44. “HTTP_REFERER”
  45. 链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是真实正确的。
  46. “HTTP_USER_AGENT”
  47. 当前请求的 User-Agent: 头信息的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用 get_browser() 得到此信息。
  48. “HTTPS”
  49. 如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
  50. “REMOTE_ADDR”
  51. 正在浏览当前页面用户的 IP 地址。
  52. “REMOTE_HOST”
  53. 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。
  54. 注: 必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。
  55. “REMOTE_PORT”
  56. 用户连接到服务器时所使用的端口。
  57. “SCRIPT_FILENAME”
  58. 当前执行脚本的绝对路径名。
  59. 注: 如果脚本在 CLI 中被执行,作为相对路径,例如 file.php 或 ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。
  60. “SERVER_ADMIN”
  61. 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
  62. “SERVER_PORT”
  63. 服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
  64. “SERVER_SIGNATURE”
  65. 包含服务器版本和虚拟主机名的字符串。
  66. “PATH_TRANSLATED”
  67. 当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
  68. 注: PHP 4.3.2 之后,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入 SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。
  69. Apache 2 用户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。
  70. “SCRIPT_NAME”
  71. 包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
  72. “REQUEST_URI”
  73. 访问此页面所需的 URI。例如,“/index.html”。
  74. “PHP_AUTH_DIGEST”
  75. 当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。
  76. “PHP_AUTH_USER”
  77. 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
  78. “PHP_AUTH_PW”
  79. 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
  80. “AUTH_TYPE”
  81. 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。


复制代码
  1. define('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : preg_replace("/(.*)\.php(.*)/i", "\\1.php", $_SERVER['PHP_SELF']));

这个是用到了preg_replace函数,大家以前看张老师是不是好多preg_replace,这里咱就用到了,"/(.*)\.php(.*)/i"是正则 具体怎么写正则,大家还可以去看看张老师讲的那一章,正则也是从小的东西做出来的,嘿嘿
先发了啊我接着

作者: zx68555   发布时间: 2010-05-22

大叔我顶顶顶。哈哈哈我好吧

作者: zhang578695398   发布时间: 2010-05-22

刚才俺们的财务老大,deepblue没见刚才那张图上有他的名字,,不行,这得写上去啊,嘿嘿,我接着
钟胜辉定义的好多$_SERVER变量我就不说了,我也懒得讲,我往下走
define('RELATE_REFERER',urlencode(RELATE_URL));urlencode函数是
(本函数将字符串以 URL 编码。例如空格就会变成加号。Homepage 中 form 资料传送就是用 urlencode 编码后再送出)
例如:<? echo urlencode("张永伟");  ?> 结果是:%E5%BC%A0%E6%B0%B8%E4%BC%9F 这是URL编码,是不是超级乱,

作者: zx68555   发布时间: 2010-05-22

支持下。

作者: xiaohufei   发布时间: 2010-05-22

复制代码
  1. if(function_exists('date_default_timezone_set')) date_default_timezone_set(TIMEZONE);
  2. header('Content-type: text/html; charset='.CHARSET);

哈哈,这么快就被deepblue老大设为精华了,我得加油啊
if(function_exists('date_default_timezone_set')) date_default_timezone_set(TIMEZONE);php5开始有时区的概念了。记得就行,没多少东西
header('Content-type: text/html; charset='.CHARSET);设置页面编码,我详细点 php编码有: 页面编码。数据库编码。文件内码。如果三码相同就一般不会出现乱码. 文件内码是什么呢?每个文件都有自己的内部编码。一般都用utf8比较爽。怎么改变文件内码?你用DW也行UE也行。随便。数据库编码那肯定是要指定的了。mysql5开始也有字符集模式这个最好也设置这样可以兼容更多平台。
页面编码:<meta http-equiv="Content-Type" c />  这句就是。一般的HTML头文件都有。那 还需要header('Content-type: text/html; charset='.CHARSET);吗?其实需要的。因为有些自己写的提示层呀。或是文件里没指定页面编码的。就很容易出现乱码那么我们就防范于未然。 header 一个编码过去就解决了,爽吧

作者: zx68555   发布时间: 2010-05-22

刚才去接了个电话,废话不多说了,嘿嘿,俺接着
复制代码
  1. if(CACHE_PAGE && !defined('IN_ADMIN')) cache_page_start();
  2. if(GZIP && extension_loaded('zlib')) ini_set('zlib.output_compression', 'On');
  3. ob_start();

if(CACHE_PAGE && !defined('IN_ADMIN')) cache_page_start();这个是以前版本的phpcms里面没有的,到phpcms2008以后,好多文件开头都有cache_page_start(); 啥意思呢?
在config.inc.php 页面有//页面缓存配置define('CACHE_PAGE', 0); //是否开启PHP页面自动缓存功能  
CACHE_PAGE && !defined('IN_ADMIN') 看看定义了IN_ADMIN he CACHE_PAGE这个缓存鸟东西,用到了就开启下面的方法,看看下面的cache_page_start(); 这个方法这么写的:
复制代码
  1. function cache_page_start()
  2. {
  3.     define('CACHE_PAGE_ID', md5(RELATE_URL));
  4.     define('CACHE_PAGE_DIR', CACHE_PAGE_PATH.substr(CACHE_PAGE_ID, 0, 2).'/');
  5.     define('CACHE_PAGE_FILE', CACHE_PAGE_DIR.CACHE_PAGE_ID.'.html');
  6.     $contents = @file_get_contents(CACHE_PAGE_FILE);
  7.     if($contents && intval(substr($contents, 15, 25)) > TIME)
  8.     {
  9.         echo substr($contents, 29);
  10.         exit;
  11.     }
  12.     return true;
  13. }

复制代码
  1. if(GZIP && extension_loaded('zlib')) ini_set('zlib.output_compression', 'On');

define('GZIP', 1); //是否Gzip压缩后输出(config.inc.php) 跟上面的那个写法是一样的
extension_loaded(string name)[手册:extension_loaded -- Find out whether an extension is loaded    eg:
复制代码
  1. <?php
  2. if (!extension_loaded('gd')) {
  3.     if (!dl('gd.so')) {
  4.         exit;
  5.     }
  6. }
  7. ?>

]
这个鸟函数是是判断zlib 这个模组是否已载入 返回true 和flase .ini_set这个函数手册上也是英文的,晕,他是php自带的用来设置php.ini配置文件的函数
搞个用法啊:
语法:ini_set("选项","值")
该函数用时最好放到php的脚本最头部(从该函数开始设置的参数生效,该脚本结束失效)
比如:
ini_set(''max_execution_time'', ''180'');
设置php的脚本超时时间为 180秒 php程序员站
ini_set("asp_tags","On")
打开asp脚本标记的支持 比如:<% echo "aaa"%>
ini_set("display_errors","On")
打脚本错误信息
当然了, ini_set('zlib.output_compression', 'On') 这个就是打开php是否Gzip压缩后输出
说白了,ini_set就是在程序里设置你的php.ini 的函数,强大吧!嘿嘿,累死我了
ob_start();这个函数大家去手册上看看,是英文的;是一段时讲缓存的,这个函数主要作用就是打开缓存区,我查查啊,现学现卖
复制代码
  1. <?php
  2. ob_start(); //打开缓冲区
  3. echo \"Hellon\"; //输出
  4. header("location:index.php"); //把浏览器重定向到index.php
  5. ob_end_flush();//输出全部内容到浏览器
  6. ?>  

所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!  
我接着走代码上来:
复制代码
  1. $dbclass = 'db_'.DB_DATABASE;
  2. require $dbclass.'.class.php';
  3. $db = new $dbclass;
  4. $db->connect(DB_HOST, DB_USER, DB_PW, DB_NAME, DB_PCONNECT, DB_CHARSET);
  5. require 'session_'.SESSION_STORAGE.'.class.php';
  6. $session = new session();
  7. session_set_cookie_params(0, COOKIE_PATH, COOKIE_DOMAIN);

这段就熟悉了,加载你的数据库类 这个要注意啊,不一定是咱们的MySQL数据库 这这里定义了DB_DATABASE一个常量
在config.inc.php里面:define('DB_DATABASE', 'mysql'); //数据库类型
说的私人的东西吧,我跟着钟胜辉有五六个月吧,那时他一不在搞phpcms了,搞cmstop,当然了,我写这些当然不是说phpcms写的好,cmstop里有我好多东西,感觉cmstop程序里的东西的确强,phpcms只是一般的功能强大的cms而已,我建议大家可以把phpcms拿来做研究,别玩这个鸟东西,不说废话了,他的这个mysql.class.php类里就跟以前一个网友在咱吧里上传的那个数据库类差不多,不过支持扩展的多,功能也强,建议某些同学学习的时候可以找一些开源的程序他的类来研究,很有用的接着:
require 'session_'.SESSION_STORAGE.'.class.php'(//Session配置 define('SESSION_STORAGE', 'mysql'); //Session 存储方式(files, mysql, apc, eaccelerator, memcache, shmop));把session_mysql.class.php加载过来了
session_set_cookie_params(0, COOKIE_PATH, COOKIE_DOMAIN);这个鸟函数又是英文的,晕,我英文太菜了,解释下就是设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用 那两个常量他都在config.inc.php里调用过
嘿嘿


作者: zx68555   发布时间: 2010-05-22

我接着贴代码,明天开始接着讲啊,嘿嘿
复制代码
  1. if($_REQUEST)
  2. {
  3.     if(MAGIC_QUOTES_GPC)
  4.     {
  5.         $_REQUEST = new_stripslashes($_REQUEST);
  6.         if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE);
  7.     }
  8.     else
  9.     {
  10.         $_POST = new_addslashes($_POST);
  11.         $_GET = new_addslashes($_GET);
  12.         $_COOKIE = new_addslashes($_COOKIE);
  13.         @extract($_POST);
  14.         @extract($_GET);
  15.         @extract($_COOKIE);
  16.     }
  17.     if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS);
  18.     extract($db->escape($_REQUEST), EXTR_SKIP);
  19.     if($_COOKIE) $db->escape($_COOKIE);
  20. }
  21. if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar))
  22. {
  23.     parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
  24. }

可以先看看

作者: zx68555   发布时间: 2010-05-22

支持

作者: libailin   发布时间: 2010-05-22

不错,学习

作者: lqjlee   发布时间: 2010-05-23

偶学习织梦。。。。。

作者: 有你真好   发布时间: 2010-05-23

我接着研究,汗,很少人看呐

作者: zx68555   发布时间: 2010-05-29

看看分离出来的几个函数啊,dump
复制代码
  1. function dump($vars, $label = '', $pause=0,$return = false)
  2. {
  3.     if (ini_get('html_errors')) {
  4.         $content = "<pre>\n";
  5.         if ($label != '') {
  6.             $content .= "<strong>{$label} :</strong>\n";
  7.         }
  8.         $content .= htmlspecialchars(print_r($vars, true));
  9.         $content .= "\n</pre>\n";
  10.     } else {
  11.         $content = $label . " :\n" . print_r($vars, true);
  12.     }
  13.     if ($return) { return $content; }
  14.     echo $content;
  15.     if($pause) exit;
  16.     return null;
  17. }

此函数非常的有用,最少我是经常用到的
产生随机码的函数
复制代码
  1. function random($length, $chars = '0123456789')
  2. {
  3.     $hash = '';
  4.     $max = strlen($chars) - 1;
  5.     for($i = 0; $i < $length; $i++)
  6.     {
  7.         $hash .= $chars[mt_rand(0, $max)];
  8.     }
  9.     return $hash;
  10. }

作者: zx68555   发布时间: 2010-05-29

真是好帖啊

作者: axiebin   发布时间: 2010-05-29

谢谢

作者: goodluck709   发布时间: 2010-06-02

    

作者: 浊浊然   发布时间: 2010-06-02

作者: victory23   发布时间: 2010-06-08

顶起来。

作者: phpstyle   发布时间: 2010-06-08

做个记号
方便以后查找

作者: the7th   发布时间: 2010-06-08

谢谢了 。。。。

作者: selboo   发布时间: 2010-06-08

作者: leif   发布时间: 2010-06-18

我只能说太感谢楼主的好帖

作者: sayokay   发布时间: 2010-06-18

顶一个。。。支持。。

作者: www.qyie.cn   发布时间: 2010-06-19