发表日期: 2021-04-27 08:47:21 浏览次数:138
邳州网站制作【邳州网站优化】邳州建网站、邳州微信公众号运营、邳州网页设计、邳州微信小程序商城
邳州,简称“邳”,江苏省徐州市代管县级市, [1-2] 古称良城、邳国、下邳、邳县,位于苏鲁交界,东接新沂市,西连徐州市铜山区、贾汪区,南界睢宁县,北邻山东省兰陵县。 [3] 1992年撤县设市。
邳州历史悠久,境内大墩子文化遗址距今6000年,是江苏文明最早的起源之一。境内有邳州市艾山风景名胜区、沙沟湖水杉公园、国家银杏博览园、小萝卜头纪念馆等旅游景点。邳州的城市精神是“创新、争先、开放、包容”。 [4]
邳州发展的目标是东陇海产业带重要的水陆交通枢纽、新兴工贸城市,京杭运河沿岸具有水乡特色和历史文化底蕴的生态宜居城市。
2019年7月,邳州入选国家知识产权强县工程试点县(区)。2019年,邳州位居全国综合实力百强县市第37位、经济竞争力百强第40位、全国投资潜力百强县市第18位、全国绿色发展百强县市第33位、全国科技创新百强县市第36位、全国新型城镇化质量百强县市第51位。
配置好后,重启php-fpm。
# service php5-fpm restart复制代码
重启后便可以通过代码的$_ENV读取到相应的系统环境变量了,在保护敏感配置信息的同时,还可以实现不同环境下的配置切换和管理。此外,这里还有一个小技巧,对于域名可以再配置HOST,指向特定的IP地址。
相比之下,cli下的配置要比php-fpm下的要简单得多。只需要在/etc/environment文件中配置系统变量后,但可以通过代码的$_ENV进行读取了。例如:
# vim /etc/environmentexport FAMILY_V2_DB_HOST=localhostexport FAMILY_V2_DB_NAME=phalapiexport FAMILY_V2_DB_USER=rootexport FAMILY_V2_DB_PASS=''export FAMILY_V2_DB_PORT=3306export FAMILY_V2_DB_CHARSET=UTF8复制代码
编辑保存后,只需要source一下,便可生效。
在Family 2.0 项目中,除了按照接口模样提供文档外,我们还充分利用了PhalApi框架提供的在线接口文档。客户端在实时生成的在线文档获取最新最可靠的信息,也可以通过手动编写的文档获取更多补充的说明。这两份文档是相互相成的。为了充分使用在线接口列表文档和在线接口详情文档,就需要按PhalApi的规范编写注释和配置参数规则。
最终手动编写的接口文档约有130多份,以下是其中的部分文档列表。
图6-3 部分手动编写的接口文档
在开发业务系统时,经常会看到重复通用的功能模块。结合Family 2.0 的项目情况和业务场景,为了减少重复开发的成本,提升开发效率,我们使用了User、Task和Qiniu等扩展类库,快速地搭建好了基础设施层,为实际具体的业务功能开发提供了更丰富的支持。
对于用户模块,我们基于User用户扩展进行了二次开发,以满足特定业务场景的需要。集成后,最终的使用和User扩展类库的使用基本一致。例如,前面已经讲述判断用户是否已登录的方式。
// 拦截式检测:如果未登录时,直接400返回DI()->userLite->check(true);// 温柔式检测:获取登录的情况,为不同的业务提供不同的选择DI()->userLite->check();复制代码
Family 2.0 项目中有很多耗时的操作,这些操作应该通过后台异步计划任务进行调度。例如为商家生成一系列设备信息,进行消息推送等。为此,我们集成了Task计划任务扩展,这样开发人员只需要开发实现具体的业务功能即可,其他的工作则交由Task扩展来完成。不仅流程质量得到了保障,同时也分离了关注点,降低开发难度。
在小的项目中,图片等文件往往是上传到本地服务器。但对于一定规模的系统来说,这种简单粗暴的方式是行不通的。因为存放在本地服务器的文件,不能在服务器集群内进行共享;其次,这些上传的文件不仅占据了服务器有限的硬盘空间,还会在访问时消耗大量的网络带宽,从而间接影响了接口服务的吐吞量;最后也不方便对上传的文件进行管理,如添加CDN加速访问。在现在这个时代,是技术领域细分的时代。专业的事,应该交由专业的团队去处理。一如,对于上传的图片文件,可以考虑交给第三方CDN服务。Family 2.0 项目也需要上传图片文件,故此我们选择了七牛云存储,并相应地集成了Qiniu七牛扩展。
需要重写的接口服务有很多,这里不能一一列出。但我会把在这个重写过程中,如何有效使用PhalApi所提供的特性、设计模式、扩展类库和方法技巧这些经验与大家分享。
Family 2.0 项目的数据库名为:familyv2,并约定统一的表前缀为“fami”。考虑到Family 2.0 项目数据量大,为方便后期的数据库服务器水平扩容,我们对数据量大且不需要进行关联查询的表进行了分表配置。例如,对于动态的评论内容,其评论表fami_feed_comments数据量大,只需要与动态关联,而评论与评论间不需要进行关联查询,因此适合采用分表策略。此时,首先配置的是数据表路由规则。
// $ vim ./Config/dbs.php
'tables' => array(
... ...
// 评论表 - 100张分表
'feed_comments' => array(
'prefix' => 'fami_',
'key' => 'id',
'map' => array(
array('db' => 'db_A'),
array('start' => 0, 'end' => 99, 'db' => 'db_A'),
),
),
),复制代码虽然目前100张分表都使用了db_A这一数据库实例,但通过这种配置,可以在需要的时候进行相应的调整。
接下来,准备存放评论表的基本字段的sql文件。注意不需要添加主键id和扩展数据ext_data这两个字段。即:
-- $ vim ./Data/feed_comments.sql `feed_id` bigint(20) DEFAULT '0', `user_id` bigint(20) DEFAULT '0' COMMENT '发布评论的用户ID', `message` text COMMENT '评论内容', `to_comment_id` bigint(20) DEFAULT '0' COMMENT '针对评论的回复,为0时表示对动态>评论', `to_user_id` bigint(20) DEFAULT '0' COMMENT '被评论者的用户id', `dateline` int(11) DEFAULT '0' COMMENT '评论的时间戳',复制代码
随后,可以使用phalapi-buildsql脚本命令为此评论表生成创建这100个分表的SQL语句,执行此命令,传递相应的参数,以及生成输出的SQL语句为:
$ Family-2.0$ ./PhalApi/phalapi-buildsqls ./Config/dbs.php feed_comments CREATE TABLE `fami_feed_comments_0` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `feed_id` bigint(20) DEFAULT '0', `user_id` bigint(20) DEFAULT '0' COMMENT '发布评论的用户ID', `message` text COMMENT '评论内容', `to_comment_id` bigint(20) DEFAULT '0' COMMENT '针对评论的回复,为0时表示对动态评论', `to_user_id` bigint(20) DEFAULT '0' COMMENT '被评论者的用户id', `dateline` int(11) DEFAULT '0' COMMENT '评论的时间戳', `ext_data` text COMMENT 'json data here', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `fami_feed_comments_1` ... ...CREATE TABLE `fami_feed_comments_2` ... ...CREATE TABLE `fami_feed_comments_3` ... ... .. ...CREATE TABLE `fami_feed_comments_99` ... ...复制代码
检验没问题后,可重定向保存到临时文件,如/tmp/fami_feed_comments.sql,再导入到数据库。
完成配置和创建好数据库分表后,接下就是评论数据模型Model类的实现。
// Family-2.0$ vim ./Apps/Fami/Model/FeedComments.php <?phpclass Model_FeedComments extends PhalApi_Model_NotORM {
const TABLE_NUM = 100;
protected function getTableName($id = null) {
$tableName = 'feed_comments';
if ($id !== null) {
$tableName .= '_' . ($id % self::TABLE_NUM);
}
return $tableName;
}}复制代码其他需要使用分表的情况也可以类似这样配置和实现。在项目初期,就确定好哪些数据库表需要分表是大有裨益的。程序是数据结构加算法,可想而知,数据在系统项目中所处的重要位置。有什么样的数据结构,就决定了怎样的算法。同样,有什么的存储方式,就影响了如何编写程序的代码。
