当前位置: 网站首页>小程序开发>网络推广

常宁网站建设【常宁网络公司】常宁做网站、常宁微信公众号开发、常宁网站设计、常宁小程序制作

发表日期: 2021-03-27 15:43:02 浏览次数:108

常宁网站建设【常宁网络公司】常宁做网站、常宁微信公众号开发、常宁网站设计、常宁小程序制作

常宁,隶属湖南省,是由衡阳市代管的县级市。位于湖南省南部、湘江中游南岸,东隔舂陵水与耒阳市为界,南与郴州市桂阳县相连,西与永州市祁阳县接壤,北濒湘江与祁东县、衡南县二县相望。2020年,常宁下辖14个镇、4个乡、5个街道。境内地势南高北低,大致呈两级阶梯形分布,属亚热带季风性湿润气候。地处北纬26°07'至26°36',东经112°07'至112°41'之间。面积2046.6平方千米 [1]  。

常宁为中国油茶之乡 [2]  、杉木楠竹之乡 [3]  、公交免费城市 [4]  、全国第二批商务综合行政执法试点县级城市 [5]  、全国第三批资源枯竭城市 [6]  。

2018年,常宁市地区生产总值(GDP)331.93亿元,常住人口80.5万人。 [7] 

2018年10月22日,入选2018年全国农村一二三产业融合发展先导区创建名单。 [8]  2019年1月9日,凭借版画入选2018—2020年度“中国民间文化艺术之乡”名单。 [9]  天堂山-西江风景区被评为省级风景名胜区。 [1] 

2019年3月6日,中央宣传部、财政部、文化和旅游部、国家文物局《中央宣传部 财政部,文化和旅游部,国家文物局关于公布《革命文物保护利用片区分县名单(第一批)》的通知》常宁市名列其中。 [10]  2021年1月29日,入选湖南省人民政府公布的2020年度真抓实干成效明显的地区名单。


不足与注意点

这样的设计是有明显的灵活性的,因为在后期如果需要迁移数据库服务器,我们可以在框架支持的情况下轻松应对,但依然需要考虑到一些问题和不足。

  • 数据库变更
    DB变更,这块是必不可少的,但一旦数据库表被拆分后,表数量的骤增导致变更执行困难,所以这里暂时使用了一个折中的方案,即提供了一个ext_data 扩展字段用于存放后期可能需要的字段信息,建议采用json格式,因为通用且长度比序列化的短。但各开发可以根据自己的需要决定格式。即使如此,扩展字段 明显做不到一些SQL的查询及其他操作。

  • 表之间的关联查询
    表之间的关联查询,这个是分拆后的最大问题。虽然这样的代价是我们可以得到更庞大的存储设计, 而且很多表之间不需要必须的关联的查询,即使需要,也可以通过其他手段如缓存和分开查询来实现。这对开发人员有一定的约束,但是对于可预见性的海量数量,这又是必须的。

2.5.7 扩展你的项目

其他数据库的链接

PhalApi的数据库操作基于NotORM开源类库,而NotORM底层则是采用了PDO。根据PDO所支持的数据库可推导出目前PhalApi支持数据库的连接包括但不限于:MySQL,SQLite,PostgreSQL,MS SQL,Oracle。当需要连接非MySQL数据库时,可以通过扩展并定制的方式来扩展。

例如需要连接MS SQL数据库,首先,需要重写根据配置创建PDO实例的PhalApi_DB_NotORM::createPDOBy($dbCfg)方法,并在里面定制对应的数据库连接的PDO。

// $ vim ./Shop/Common/DB/MSServer.php<?phpclass Common_DB_MSServer extends PhalApi_DB_NotORM {

    protected function createPDOBy($dbCfg) {
        $dsn = sprintf('odbc:Driver={SQL Server};Server=%s,%s;Database=%s;',
            $dbCfg['host'],
            $dbCfg['port'],
            $dbCfg['name']
        );

        $pdo = new PDO(
            $dsn,
            $dbCfg['user'],
            $dbCfg['password']
        );

        return $pdo;
    }}复制代码

如果数据库连接配置与默认的格式不同,可自行调整./Config/dbs.php里的配置。

随后,在初始化文件Shop项目的入口文件./Public/shop/index.php中重新注册DI()->notorm

DI()->notorm = function() {
    return new Common_DB_MSServer(DI()->config->get('dbs'), DI()->debug);};复制代码

使用定制了特定数据库PDO连接的类实例重新注册notorm服务后,便可以进行新的数据库连接了,并且原有的数据库操作不需要改动,便可实现数据库切换。

主从数据库的配置

默认只有一从数据库的配置,并支持分表分库配置。当需要数据库从库时,可以参考./Config/dbs.php配置,复件一份作为从库的配置,例如:

$ cp ./Config/dbs.php ./Config/dbs_slave.php复制代码

然后,注册一个数据库从库的notorm时,指定使用从库的配置。

DI()->notormSlave = function() {
    return new PhalApi_DB_NotORM(DI()->config->get('dbs_slave'), DI()->debug); //注意:配置不同};复制代码

最后使用此从库的服务DI()->notormSlave即可完成对从库的读取操作,用法同DI()->notorm,这里不再赘述。

定制化你的Model基类

正如前文在Model基类中提到的两个问题:LOB序列化和分表处理。如果PhalApi现有的解决方案不能满足项目的需求,可进行定制化处理。

  • LOB序列化

先是LOB序列化,考虑到有分表的存在,当发生数据库变更时会有一定的难度和风险,尤其是在线上生产环境。因此引入了扩展字段ext_data。当然,此字段在应对数据库变更的同时,也可以作为简单明了的值对象的大对象。序列化LOB首先要考虑的问题是使用二进制(BLOB)还是文本(CLOB),出于通用性、易读性和测试性,我们目前使用了json格式的文本序列化。例如考虑到空间或性能问题,可以重写格式化方法PhalApi_Model_NotORM::formatExtData()和解析方法PhalApi_Model_NotORM::parseExtData()

比如改成serialize序列化:

<?phpclass Common_Model_NotORM extends PhalApi_Model_NotORM {

    /**
     * 对LOB的ext_data字段进行格式化(序列化)
     */
    protected function formatExtData(&$data) {
        if (isset($data['ext_data'])) {
            $data['ext_data'] = serialize($data['ext_data']);
        }
    }

    /**
     * 对LOB的ext_data字段进行解析(反序列化)
     */
    protected function parseExtData(&$data) {
        if (isset($data['ext_data'])) {
            $data['ext_data'] = unserialize($data['ext_data'], true);
        }
    }

    // ...}复制代码

然后编写继承于Common_Model_NotORM的Model子类。

<?phpclass Model_User extends Common_Model_NotORM {
   //...}复制代码

就可以轻松切换到序列化,如:

$model = new Model_User();// 带有ext_data的更新$extData = array('level' => 3, 'coins' => 256);$data = array('name' => 'test', 'update_time' => time(), 'ext_data' => $extData);// 基于主键的快速更新$model->update(1, $data);复制代码
  • 分表下的主键设定

在存在分表过多的情况下,框架会根据配置自动匹配不同表的不同主键配置。因为Model基类中的CURD基本操作是基于主键进行的,所以这里的问题就演变成了如何快速找到表的主键名。

当然,这里是可以继续使用框架默认的自动匹配算法。若表主键是固定且统一的,为了提升性能,可重写PhalApi_Model_NotORM::getTableKey($table)方法来指定主键名。

例如,全部表的主键都固定为id时:

<?phpabstract class Common_Model_NotORM extends PhalApi_Model_NotORM {

    protected function getTableKey($table) {
        return 'id';
    }}复制代码

当有其他场景需要时,也可以定制自己的Model基类。通过提供自己的层超类,封装一些项目中公共的操作,以简化项目开发。

2.6 缓存策略

在学习了持久化的数据库存储后,接下来让我们继续学习缓存。在很多情况下,都需要用到缓存。如对重复获取但变化不大的数据进行缓存以提供服务器的响应能力,又如为数据库服务器减轻压力等。另一方面,缓存也是有其弊端的。因为延时导致数据不能实时更新,或者在需要更新的场景下得不到实时更新。如在接口调试、单元测试或者预览时,当然这些都可以通过一些技巧来获得。这里,将从简单的缓存、再到高速缓存、最后延伸到多级缓存,逐步进行说明。

2.6.1 简单本地缓存

这里所指的简单缓存,主要是存储在单台服务器上的缓存,例如使用系统文件的文件缓存,PHP语言提供的APCU缓存。因为实现简单,且部署方便。但其缺点也是明显的,如文件I/O读写导致性能低,不能支持分布式。所以在没有集群服务器下是适用的。

文件缓存

例如,当需要使用文件缓存时,先在DI容器中注册对文件缓存到DI()->cache

//$ vim ./Public/init.php DI()->cache = new PhalApi_Cache_File(array('path' => API_ROOT . '/Runtime', 'prefix' => 'demo'));复制代码

初始化文件缓存时,需要传入配置数组,其中path为缓存数据的目录,可选的前缀prefix,用于区别不同的项目。

然后便可在适当的场景使用缓存。

// 设置DI()->cache->set('thisYear', 2015, 600);// 获取,输出:2015echo DI()->cache->get('thisYear');// 删除DI()->cache->delete('thisYear');复制代码

可以看到,在指定的缓存目录下会有类似以下这样的缓存文件。

$ tree ./Runtime/cache/./Runtime/cache/└── 483
    └── 11303fe8f96da746aa296d1b0c11d243.dat复制代码

APCU缓存

安装好APCU扩展和设置相关配置并重启PHP后,便可开始使用APCU缓存。APCU缓存的初始化比较简单,只需要简单创建实例即可,不需要任何配置。

DI()->cache = new PhalApi_Cache_APCU();复制代码

其他使用参考缓存接口,这里不再赘述。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

常宁网站建设常宁网络公司常宁做网站、常宁微信公众号开发、常宁网站设计、常宁小程序制作

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878