94hwan-PHP框架基本原理

Source:94hwan 与众不同  Author:网络部
2011-09-20 15:18

在引导文件中,调试和session等接口处理的主要是下面代码:

  1. //debug设置 
  2. $_debug_safe_ip = false; 
  3. require PATH_LIBRARY.'/debug/lib_debug.php'
  4. if( in_array( util::get_client_ip(), $GLOBALS['config']['safe_client_ip']) || OPEN_DEBUG === true ) 
  5.     $_debug_safe_ip = true; 
  6.     ini_set('display_errors''On'); 
  7. else 
  8.     ini_set('display_errors''Off'); 
  9. set_exception_handler('handler_debug_exception'); 
  10. set_error_handler('handler_debug_error', E_ALL); 
  11. register_shutdown_function('handler_php_shutdown'); 
  12.  
  13. //session接口(使用session前需自行调用session_start) 
  14. require CORE.'/session.php'

Debug程序是通过

  • set_exception_handler('handler_debug_exception'); 
  • set_error_handler('handler_debug_error', E_ALL);

这里对系统的debug信息进行了接管(接口函数定义在 core/library/debug/lib_debug.php )
除了支持基本的调试外,也支持使用xhprof进行性能调试

关于错误处理时具体方法请参考:错误处理与程序Debug方法>>

core/session.php 分两种情况,一种是使用memcache的情况,仅是修改php参数,不会对session接口重写,另一种情况是使用文件hash缓存(如果单服务器运行的程序,这种模式会更稳定),接口进行了重写,考虑性能原因,默认并没有初始化缓存,如果需要使用session,还是需要用户自行在使用前用 @session_start() 初始化。。

此外在 init.php 还定义了几个特殊函数:
 

  1. /** 
  2.  * 程序结束后执行的动作 
  3.  */ 
  4. function handler_php_shutdown() 
  5.     show_debug_error(); 
  6.     log::save(); 
  7.     if( defined('CLS_CACHE') ) { 
  8.         cache::free(); 
  9.     } 
  10.     if( defined('CLS_CACHE_NATIVE') ) { 
  11.         cls_cache_native::close(); 
  12.     } 
  13.  
  14. /** 
  15.  * 致命错误处理接口 
  16.  * 系统发生致命错误后的提示 
  17.  * (致命错误是指发生错误后要直接中断程序的错误,如数据库连接失败、找不到控制器等) 
  18.  */ 
  19. function handler_fatal_error( $errtype$msg ) 
  20.     global $_debug_safe_ip
  21.     $log_str = $errtype.':'.$msg
  22.     if ( OPEN_DEBUG === true || $_debug_safe_ip ) 
  23.     { 
  24.         throw new Exception( $log_str ); 
  25.     } 
  26.     else 
  27.     {         
  28.         log::add('fatal_error'$msg); 
  29.         header ( "location:/404.html" ); 
  30.         exit(); 
  31.     } 
  32.  
  33. /** 
  34.  * 路由控制 
  35.  * 
  36.  * @param $ctl  控制器 
  37.  * @parem $ac   动作 
  38.  * @return void 
  39.  */ 
  40. function run_controller() 
  41.     try 
  42.     { 
  43.         $ac = preg_replace("/[^0-9a-z_]/i"'', req::item('ac''index') ); 
  44.         $ac = emptyempty ( $ac ) ? $ac = 'index' : $ac
  45.              
  46.         $ctl = 'ctl_'.preg_replace("/[^0-9a-z_]/i"'', req::item('ct''index') ); 
  47.         $path_file = PATH_CONTROL . '/' . $ctl . '.php'
  48.  
  49.         iffile_exists$path_file ) ) 
  50.         { 
  51.             require $path_file
  52.         } 
  53.         else 
  54.         { 
  55.             throw new Exception ( "Contrl {$ctl}--{$path_file} is not exists!" ); 
  56.         } 
  57.         if( method_exists ( $ctl$ac ) === true ) 
  58.         { 
  59.             $instance = new $ctl ( ); 
  60.             $instance->$ac (); 
  61.         } 
  62.         else 
  63.         { 
  64.             throw new Exception ( "Method {$ctl}::{$ac}() is not exists!" ); 
  65.         } 
  66.     } 
  67.     catch ( Exception $e ) 
  68.     { 
  69.         handler_fatal_error( 'init.php run_controller()'$e->getMessage().' url:'.util::get_cururl() ); 
  70.     } 
  71.  
  72. /** 
  73.  * 自动加载类库处理 
  74.  * 加载优先级 /core/library => 应用目录/model => 根目录/model 
  75.  * (如果不在这些位置, 则需自行手工加载,对于小型项目,也可以把model全放到library以减少类文件查找时间) 
  76.  * @return void 
  77.  */ 
  78. function __autoload( $classname ) 
  79.     $classname = preg_replace("/[^0-9a-z_]/i"''$classname); 
  80.     ifclass_exists ( $classname ) ) { 
  81.         return true; 
  82.     } 
  83.     $classfile = $classname.'.php'
  84.     try 
  85.     { 
  86.         if ( file_exists ( PATH_LIBRARY.'/'.$classfile ) ) 
  87.         { 
  88.             require PATH_LIBRARY.'/'.$classfile
  89.         } 
  90.         else iffile_exists ( PATH_MODEL.'/'.$classfile ) )  
  91.         { 
  92.             require PATH_MODEL.'/'.$classfile
  93.         } 
  94.         else iffile_exists ( require PATH_ROOT.'/model/'.$classfile ) )  
  95.         { 
  96.             require PATH_ROOT.'/model/'.$classfile
  97.         } 
  98.         else 
  99.         { 
  100.             return false; 
  101.             throw new Exception ( 'Error: Cannot find the '.$classname ); 
  102.         } 
  103.     } 
  104.     catch ( Exception $e ) 
  105.     { 
  106.         handler_fatal_error( 'init.php __autoload()'$e->getMessage().'|'.$classname.' url:'.util::get_cururl() ); 
  107.     } 
  108.  
  109. /** 
  110.  * req::item 别名函数 
  111.  */ 
  112. function request($key$df=''
  113.     return req::item($key$df); 

 

...