一、结构介绍
结构的名字grape,中文名叫葡萄,因为最近一个同事经常带葡萄到公司给我们吃,受到启发想到了这个名字。
1)本结构需要在PHP5.5中运行,如果要在5.4中运行,有些地方就要做些修改
2)结构中会用到MongoDB,所以需要在php中额外引用php_mongo.dll文件,查看安装方法。
3)还用到了性能工具xhprof,全文检索工具Coreseek(改造了sphinx),如果使用都需要额外的配置,如果不使用可以关闭
4)整合了微信的部分API接口,点击查看《微信公众平台开发系列》
5)整合了grape-skin(葡萄皮)静态结构,作为管理后台的页面样式与特效
6)后台管理demo帐号是admin,密码是123456
7)虚拟目录结构引用如下:
<VirtualHost *:80> DocumentRoot "D:/htdocs/grape/public/admin" ServerName admin.grape.net </VirtualHost> <VirtualHost *:80> DocumentRoot "D:/htdocs/grape/public/api" ServerName api.grape.net </VirtualHost>
二、目录结构
依托网上的开源框架InitPHP,略微修改了InitPHP的部分源码,使得结构更符合我自己的项目需要,并扩展了几个功能,例如全文检索配置、分页等。
1)app:放置的是控制器、试图、拦截器、缓存文件、视图编译文件与特定的配置文件,app下可以有多个项目文件,上面的admin和api隶属于两个项目中
2)conf:全局配置文件,包括数据库配置、缓存配置、自动载入配置等,查看InitPHP框架配置。
3)initphp:框架initphp库文件,大部分是原先的,有几个地方做了调整。查看InitPHP框架全部文档。
4)library:包括控制器通用文件、数据层逻辑、数据字典、表单控件编写、服务层逻辑、第三方代码以及简单的测试,这里我把library单处拎出来和app、initphp等平级。
5)logs:日志文件,可以打印出数据库查询语句,也可以做一些调试信息
6)public:项目的入口文件,全局变量配置,摆放静态资源(CSS、JS等)。如下图所示,admin文件夹中有静态资源文件,css、js等,并有自己的index.php入口文件,rpc文件是InitPHP框架中的RPC调用配置。
7)tool:放置了MySQL数据库示例代码,简易api调试工具,memcache操作工具
三、配置文件
1)conf文件
1.全局的配置放在了外面的conf文件,而在每个app下面的项目中也有一个conf文件,这里面是配置一些这个项目下需要的配置项。
2.全局配置内容和InitPHP配置中的基本相同,但我在封装的时候多了几个。
is_xhprof:性能分析工具,点击查看工具配置。
sphinx:全文检索工具,点击查看工具配置。
autoload:自动载入文件,载入的是library文件夹中的一些php文件。自动载入的命名是有规则的,例如下面的第一个配置,自动载入library/controller文件夹中的adminController.php文件。
/*********************************自动载入配置*****************************************/ $InitPHP_conf['autoload']['controller'] = array( 'path' => LIB_PATH . '/controller', 'files' => array('admin', 'api') ); $InitPHP_conf['autoload']['helper'] = array( 'path' => LIB_PATH . '/helper', 'files' => array('url', 'dict/const', 'dict/enum') );
自动载入的逻辑代码写在了InitPHP里initphp.php文件中:
private static function _autoload() { $config = self::getConfig(); $autoloads = $config['autoload']; foreach ($autoloads as $key=>$autoload) { if(empty($autoload['files']) || empty($autoload['path'])) continue; $path = $autoload['path']; foreach ($autoload['files'] as $file) { require_once $path . '/' . $file.ucfirst($key).'.php'; } } //是否打开性能测试 if($config['is_xhprof']) { require_once LIB_XHPROF_PATH . "/xhprof_lib/utils/xhprof_lib.php"; require_once LIB_XHPROF_PATH . "/xhprof_lib/utils/xhprof_runs.php"; } }
2)定义全局常量
1.defined.php
文件位于public下面,这个文件中将定义些目录常量,域名常量,API密钥,微信配置等,并引入全局入口文件。
<?php /** * 常量定义 * @author: pwstrick */ define('ROOT_PATH', dirname(dirname(__FILE__))); define('LIB_PATH', ROOT_PATH . '/library'); define('LIB_THIRD_PATH', LIB_PATH . '/third');//第三方类库目录 define('LIB_XHPROF_PATH', LIB_THIRD_PATH . '/xhprof');//性能测试工具 define('SCRIPT_PATH', 'scripts');//开发使用scripts,部署使用optimize define('UPLOAD_PATH', ROOT_PATH.'/upload');//上传路径 define('UPLOAD_HTTP', 'http://upload.grape.net'); /** * API客户端密钥 */ define('API_IOS_KEY', 'DF_A98=D^&7$^%*9CNAhj0UO!!LM11'); define('API_ANDROID_KEY', 'KU98&)dsf8%@kji89dfadJK-800i122'); define('API_UNKNOW_KEY', 'jfdsfd798hj+@(*kb66578-223q670933'); /** * 微信配置 */ define('WEIXIN_APPID', 'xx');//TODO define('WEIXIN_SECRET', 'xx');//TODO define('WEIXIN_TOKEN', 'xx');//TODO define('WEIXIN_NOTIFY_URL', 'http://xx');//TODO define('WEIXIN_MCHID', 'xx');//TODO define('WEIXIN_KEY', 'xx');//TODO header("Content-Type:text/html; charset=utf-8"); require_once(ROOT_PATH . '/initphp/initphp.php'); //导入配置文件-必须载入 require_once(ROOT_PATH . '/conf/comm.conf.php'); //公用配置
2.index.php
index文件夹是各个项目的入口文件,同样位于public下面,里面有特定的配置常量,引用defined.php文件,并运行InitPHP开发框架。
<?php require_once(dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'defined.php'); define('APP_NAME', 'admin'); define('APP_PATH', ROOT_PATH.'/app/'.APP_NAME); require_once(APP_PATH . '/conf/comm.conf.php'); //APP配置 InitPHP::init();
GitHub地址: