[原]ecshop代码分析一(init.php文件)

因为工作原因,需要对ecshop二次开发,顺便记录一下对ecshop源代码的一些分析:

首先是init.php文件,这个文件在ecshop每个页面都会 调用到,习惯就先分析它:

 

<? php

/* *
 * ECSHOP 前台公用文件
*/
// 防止非法调用 defined-判断常量是否已定义,如果没返回false
if  ( ! defined ( ' IN_ECS ' ))
{
    
die ( ' Hacking attempt ' ); // die-直接终止程序并输出
}
// 报告所有错误
error_reporting ( E_ALL );
// 如果获取不到本文件
if  ( __FILE__   ==   '' )
{
    
die ( ' Fatal error code: 0 ' );
}
/* 预定义常量
__LINE__       文件中的当前行号。
__FILE__       文件的完整路径和文件名。
__FUNCTION__   函数名称(这是 PHP 4.3.0 新加的)。
__CLASS__      类的名称(这是 PHP 4.3.0 新加的)。
__METHOD__     类的方法名(这是 PHP 5.0.0 新加的)。
*/
/*  取得当前商城所在的根目录  */
define ( ' ROOT_PATH ' ,   str_replace ( ' includes/init.php ' ,   '' ,   str_replace ( ' \\ ' ,   ' / ' ,   __FILE__ )));
// 检测是否已安装
if  ( ! file_exists (ROOT_PATH  .   ' data/install.lock ' &&   ! file_exists (ROOT_PATH  .   ' includes/install.lock ' )
    
&&   ! defined ( ' NO_CHECK_INSTALL ' ))
{
    
header ( " Location: ./install/index.php\n " );

    
exit ;
}

/*  初始化设置  */
@
ini_set ( ' memory_limit ' ,            ' 64M ' ); // ini_set设置php.ini中的设置,memory_limit设定一个脚本所能够申请到的最大内存字节数
@ ini_set ( ' session.cache_expire ' ,    180 ); // 指定会话页面在客户端cache中的有效期限(分钟),单位为分钟。
@ ini_set ( ' session.use_trans_sid ' ,   0 ); // 关闭自动把session id嵌入到web的URL中
@ ini_set ( ' session.use_cookies ' ,     1 ); // 允许使用cookie在客户端保存会话ID
@ ini_set ( ' session.auto_start ' ,      0 ); // 在客户访问任何页面时都自动初始化会话,0-禁止
@ ini_set ( ' display_errors ' ,          1 ); // 是否显示错误

if  (DIRECTORY_SEPARATOR  ==   ' \\ ' ) // 如果装在windows上(DIRECTORY_SEPARATOR路径分隔符,linux上就是’/’   windows上是’\’)
{
    @
ini_set ( ' include_path ' ,   ' .; '   .  ROOT_PATH); // include目录为当前目录和网站根目录,windows下用';'分隔
}
else
{
    @
ini_set ( ' include_path ' ,   ' .: '   .  ROOT_PATH); // include目录为当前目录和网站根目录,linux下用':'分隔
}

require (ROOT_PATH  .   ' data/config.php ' ); // 包含配置文件(数据库相关)

if  ( defined ( ' DEBUG_MODE ' ==   false ) // 如果常量DEBUG_MODE没有定义则定义为0,DEBUG_MODE用于设置ecshp的使用模式
{
    
define ( ' DEBUG_MODE ' ,   0 );
}
// 设定用于所有日期时间函数的默认时区
if  ( PHP_VERSION   >=   ' 5.1 '   &&   ! empty ( $timezone ))
{
    date_default_timezone_set(
$timezone ); // date_default_timezone_set 设置时区
}
// $_SERVER['PHP_SELF']返回当前页面,获取$_SERVER['PHP_SELF']最好用htmlspecialchars过滤一下,存在XSS漏洞
$php_self   =   isset ( $_SERVER [ ' PHP_SELF ' ])  ?   $_SERVER [ ' PHP_SELF ' :   $_SERVER [ ' SCRIPT_NAME ' ];
if  ( ' / '   ==   substr ( $php_self ,   - 1 )) // 如果是"/"结尾,则加上index.php
{
    
$php_self   .=   ' index.php ' ;
}
define ( ' PHP_SELF ' ,   $php_self ); // 放入常量

require (ROOT_PATH  .   ' includes/inc_constant.php ' ); // 包含预定义常量文件
require (ROOT_PATH  .   ' includes/cls_ecshop.php ' ); // 基础类 文件
require (ROOT_PATH  .   ' includes/cls_error.php ' ); // 错误类 文件
require (ROOT_PATH  .   ' includes/lib_time.php ' ); // 时间函数
require (ROOT_PATH  .   ' includes/lib_base.php ' ); // 基础函数库
require (ROOT_PATH  .   ' includes/lib_common.php ' ); // 基础函数库
require (ROOT_PATH  .   ' includes/lib_main.php ' ); // 公用函数库
require (ROOT_PATH  .   ' includes/lib_insert.php ' ); // 动态内容函数库
require (ROOT_PATH  .   ' includes/lib_goods.php ' ); // 商品相关函数库
require (ROOT_PATH  .   ' includes/lib_article.php ' ); // 文章及文章分类相关函数库

/*  对用户传入的变量进行转义操作。 */
if  ( ! get_magic_quotes_gpc ())
{
    
if  ( ! empty ( $_GET ))
    {
        
$_GET    =  addslashes_deep( $_GET );
    }
    
if  ( ! empty ( $_POST ))
    {
        
$_POST   =  addslashes_deep( $_POST );
    }

    
$_COOKIE     =  addslashes_deep( $_COOKIE );
    
$_REQUEST    =  addslashes_deep( $_REQUEST );
}

/*  创建 ECSHOP 对象  */
$ecs   =   new  ECS( $db_name ,   $prefix ); // 参数说明:数据库名 表前缀
define ( ' DATA_DIR ' ,   $ecs -> data_dir()); // 数据目录
define ( ' IMAGE_DIR ' ,   $ecs -> image_dir()); // 图片目录

/*  初始化数据库类  */
require (ROOT_PATH  .   ' includes/cls_mysql.php ' ); 
$db   =   new  cls_mysql( $db_host ,   $db_user ,   $db_pass ,   $db_name );
/*  设置不允许进行缓存的表  */
$db -> set_disable_cache_tables( array ( $ecs -> table( ' sessions ' ) ,   $ecs -> table( ' sessions_data ' ) ,   $ecs -> table( ' cart ' )));
$db_host   =   $db_user   =   $db_pass   =   $db_name   =   NULL ;

/*  创建错误处理对象  */
$err   =   new  ecs_error( ' message.dwt ' );

/*  载入系统参数  */
$_CFG   =  load_config();  // 载入配置信息函数在lib_common.php

/*  载入语言文件  */
require (ROOT_PATH  .   ' languages/ '   .   $_CFG [ ' lang ' .   ' /common.php ' );

if  ( $_CFG [ ' shop_closed ' ==   1 )
{
    
/*  商店关闭了,输出关闭的消息  */
    
header ( ' Content-type: text/html; charset= ' . EC_CHARSET);

    
die ( ' <div style="margin: 150px; text-align: center; font-size: 14px"><p> '   .   $_LANG [ ' shop_closed ' .   ' </p><p> '   .   $_CFG [ ' close_comment ' .   ' </p></div> ' );
}

// 判断是否为搜索引擎蜘蛛  函数在lib_main.php
if  (is_spider())
{
    
/*  如果是蜘蛛的访问,那么默认为访客方式,并且不记录到日志中  */
    
if  ( ! defined ( ' INIT_NO_USERS ' ))
    {
        
define ( ' INIT_NO_USERS ' ,   true );
        
/*  整合UC后,如果是蜘蛛访问,初始化UC需要的常量  */
        
if ( $_CFG [ ' integrate_code ' ==   ' ucenter ' )
        {
             
$user   =   &  init_users();
        }
    }
    
$_SESSION   =   array ();
    
$_SESSION [ ' user_id ' ]      =   0 ;
    
$_SESSION [ ' user_name ' ]    =   '' ;
    
$_SESSION [ ' email ' ]        =   '' ;
    
$_SESSION [ ' user_rank ' ]    =   0 ;
    
$_SESSION [ ' discount ' ]     =   1.00 ;
}
// 非搜索引擎蜘蛛,记录session
if  ( ! defined ( ' INIT_NO_USERS ' ))
{
    
/*  初始化session  */
    
include (ROOT_PATH  .   ' includes/cls_session.php ' );

    
$sess   =   new  cls_session( $db ,   $ecs -> table( ' sessions ' ) ,   $ecs -> table( ' sessions_data ' ));

    
define ( ' SESS_ID ' ,   $sess -> get_session_id());
}
// 如果使用Smarty
if  ( ! defined ( ' INIT_NO_SMARTY ' ))
{
    
header ( ' Cache-control: private ' );
    
header ( ' Content-type: text/html; charset= ' . EC_CHARSET);

    
/*  创建 Smarty 对象。 */
    
require (ROOT_PATH  .   ' includes/cls_template.php ' );
    
$smarty   =   new  cls_template;

    
$smarty -> cache_lifetime  =   $_CFG [ ' cache_time ' ]; // 缓存时间
     $smarty -> template_dir    =  ROOT_PATH  .   ' themes/ '   .   $_CFG [ ' template ' ]; // 模板所在
     $smarty -> cache_dir       =  ROOT_PATH  .   ' temp/caches ' ; // 缓存所在
     $smarty -> compile_dir     =  ROOT_PATH  .   ' temp/compiled ' ; // 模板编译后的文件所在

    
if  ((DEBUG_MODE  &   2 ==   2 ) // 如果常量DEBUG_MODE值为 2、3、6、7.时
    {
        
$smarty -> direct_output  =   true // 不使用缓存直接输出
         $smarty -> force_compile  =   true // 强行编译
    }
    
else
    {
        
$smarty -> direct_output  =   false ;
        
$smarty -> force_compile  =   false ;
    }

    
$smarty -> assign( ' lang ' ,   $_LANG );
    
$smarty -> assign( ' ecs_charset ' ,  EC_CHARSET);
    
if  ( ! empty ( $_CFG [ ' stylename ' ])) // 如果自己定义样式文件就用自己的
    {
        
$smarty -> assign( ' ecs_css_path ' ,   ' themes/ '   .   $_CFG [ ' template ' .   ' /style_ '   .   $_CFG [ ' stylename ' .   ' .css ' );
    }
    
else
    {
        
$smarty -> assign( ' ecs_css_path ' ,   ' themes/ '   .   $_CFG [ ' template ' .   ' /style.css ' );
    }

}
// 非搜索引擎爬虫,记录用户信息
if  ( ! defined ( ' INIT_NO_USERS ' ))
{
    
/*  会员信息  初始化会员数据 lib_common.php  */  
    
$user   =&  init_users();

    
if  ( ! isset ( $_SESSION [ ' user_id ' ]))
    {
        
/*  获取投放站点的名称  */
        
$site_name   =   isset ( $_GET [ ' from ' ])    ?   $_GET [ ' from ' :   addslashes ( $_LANG [ ' self_site ' ]);
        
$from_ad     =   ! empty ( $_GET [ ' ad_id ' ])  ?   intval ( $_GET [ ' ad_id ' ])  :   0 ;

        
$_SESSION [ ' from_ad ' =   $from_ad //  用户点击的广告ID
         $_SESSION [ ' referer ' =   stripslashes ( $site_name );  //  用户来源

        
unset ( $site_name );

        
if  ( ! defined ( ' INGORE_VISIT_STATS ' ))
        {
            visit_stats();
        }
    }

    
if  ( empty ( $_SESSION [ ' user_id ' ]))
    {
        
if  ( $user -> get_cookie())
        {
            
/*  如果会员已经登录并且还没有获得会员的帐户余额、积分以及优惠券  */
            
if  ( $_SESSION [ ' user_id ' >   0 )
            {
                update_user_info();
            }
        }
        
else
        {
            
$_SESSION [ ' user_id ' ]      =   0 ;
            
$_SESSION [ ' user_name ' ]    =   '' ;
            
$_SESSION [ ' email ' ]        =   '' ;
            
$_SESSION [ ' user_rank ' ]    =   0 ;
            
$_SESSION [ ' discount ' ]     =   1.00 ;
            
if  ( ! isset ( $_SESSION [ ' login_fail ' ]))
            {
                
$_SESSION [ ' login_fail ' =   0 ;
            }
        }
    }

    
/*  设置推荐会员  */
    
if  ( isset ( $_GET [ ' u ' ]))
    {
        set_affiliate();
    }
    
if  ( isset ( $smarty ))
    {
        
$smarty -> assign( ' ecs_session ' ,   $_SESSION );
    }
}

if  ((DEBUG_MODE  &   1 ==   1 ) // 如果常量DEBUG_MODE值为 1、3、5、7.时
{
    
error_reporting ( E_ALL ); // 报告全部错误
}
else
{
    
error_reporting ( E_ALL   ^   E_NOTICE );  // 报告除E_NOTICE以外的所有错误
}
if  ((DEBUG_MODE  &   4 ==   4 ) // 如果常量DEBUG_MODE值为 4、5、6、7.时,调试程序
{
    
include (ROOT_PATH  .   ' includes/lib.debug.php ' ); //
}

/*  判断是否支持 Gzip 模式  如果使用SMARTY同时设置了网页压缩,则启用压缩  */
if  ( ! defined ( ' INIT_NO_SMARTY ' &&  gzip_enabled())
{
    
ob_start ( ' ob_gzhandler ' ); // 压缩后放入缓冲区
}
else
{
    
ob_start (); // 打开缓冲区,把下面要显示的内容先缓在服务器
}
/*
ob_start相关函数了解:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()
*/
?>

 

转载于:https://www.cnblogs.com/tudoux/archive/2009/11/18/1605196.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值