
发表日期: 2021-04-26 11:28:59 浏览次数:84
溧阳申请400电话费用【溧阳企业全国热线电话办理】溧阳开通400电话电信价格、溧阳微信公众号代运营外包托管、溧阳网店编辑装修美工、溧阳网站推广优化大概需要多少钱
溧阳,隶属江苏省,由常州市代管的县级市 ,位于江苏省西南部,地处长江三角洲,与苏、浙、皖三省接壤。是南京都市圈成员城市 [1] ,宁杭生态经济带上的重要副中心城市和示范区。位于北纬31°09'-31°41',东经119°08'-119°36',东邻宜兴,西与高淳、溧水毗邻,南与安徽省的广德、郎溪接壤,北接句容、金坛,南北长59.06千米,东西宽45.14千米,土地总面积1535.87平方千米。 [2] 溧阳属亚热带季风气候,干湿冷暖,四季分明,雨量充沛,无霜期长,全年平均温度17.5℃,其中:一月份3.2℃,七月份31.1℃。年均降水量1149.7毫米。其中,一月份42.2毫米,七月154.1毫米。大约日照时间,一月份137.6小时,七月份229小时。 [3]
溧阳有耕地面积112万亩,林地32.8万亩,河流和湖泊42.6万亩。物产丰富,是著名的“鱼米之乡”、“丝绸之乡”、“茶叶之乡”,经济连续多年名列全国百强县(市)。溧阳文化属吴越文化,溧阳人属江浙民系使用吴语。盛产稻、麦、油、茶、蚕茧、螃蟹、板栗、西瓜、毛竹等。 [4] 2020年10月9日,被生态环境部命名为第四批“绿水青山就是金山银山”实践创新基地。2020年11月,入选水利部第一批深化小型水库管理体制改革样板县(市、区)名单。2020年12月,社科院发布《全国县域经济综合竞争力100强》,溧阳排名第25 [5] 。
若换一种工作的方式,即如果新来的项目成员使用已有的组件进行一些特定领域业务的开发,会是怎样?我想,情况应该会大有改观。比如,新来的项目成员,使用DI()->logger就可以写一条日志了。
DI()->logger->debug('app enter');复制代码新手总是喜欢追问一些问题,他们可能会问到,怎样才能将一些参数(当时日志的上下文)也进行纪录呢?你可以很骄傲地说:也是可以的,你只需要这样写就可以了.
DI()->logger->debug('app enter', array('device' => 'iOS', 'version' => '1.1.0'));复制代码特别地,当需要把日志纪录从文件存储切换到其他存储媒介,如数据库时,这对原来的使用是无影响的。而且,新手在感知不到的情况下,就能轻松实现切换了。
开发-配置-使用模式也符合了创建和使用分离的思想。不同的项目,不同的应用,需要的初始化服务不一样;不同的规模,对不同的技术解决方案也不一样;不同的环境,配置也不一样。即便这样,新手还是可以一如既往地使用之前注册的服务,也就是不需要修改任何调用代码。也就是说,底层的调整或者环境的变更,对新手的使用都是透明的。为了更好地理解这些概念,这里补充一些案例场景。
继续以我们熟悉的日志使用为例。假设我们有个项目A,分别部署到内网测试环境和外网生产环境,显然内外网环境的配置是不一样的。我们希望在内网环境为日志开启debug模式以方便开发人员进行调试,在外网则希望将其关闭以减少系统的性能开销。在一开始使用文件作为日志存储方案时,对应的内网环境初始化代码如下:
// 日志纪录DI()->logger = new PhalApi_Logger_File(API_ROOT . '/Runtime', PhalApi_Logger::LOG_LEVEL_DEBUG | PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR);复制代码
在外网环境中,只需要去掉PhalApi_Logger::LOG_LEVEL_DEBUG即可:
// 日志纪录DI()->logger = new PhalApi_Logger_File(API_ROOT . '/Runtime', PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR);复制代码
随着项目的不断发展,我们有了一批又一批的新用户。产品经理为此很开心,也请我们开发吃了好几顿大餐。但谨慎的我们发现了现在文件日记的一些限制。如即时文件读写带来了I/O瓶颈,而且不能将分布式的日记文件自动收集起来。所以,我们决定对logger进行更深层次的探索……
至于最后是使用了Hive还是Hadoop,还是异步后台队列的方式实现,我们这里不具体指定。假设全新的智能logger研发成功后,我们便可以轻松对原有的文件日记组件进行升级,实现完美切换:
// 升级后的日记纪录DI()->logger = new Common_Logger_Smart(PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR);复制代码
这不仅是几行代码上的区别,而是针对不同问题不同技术解决方案的抉择。这也是有经验的开发和新手之间的区别,因为你选择的技术解决方案要和面临的风险相匹配。例如用牛刀来杀鸡,就是一个不匹配的做法,就如同使用高级的Hive来实现单一小项目的日记存储一样。
这是令人值得兴奋的。在很多遗留项目里面,当遇到瓶颈时,会请一些外部的专家来指导或优化。但即使拥有着各种“法宝”以及知道何时该使用哪种方案的专家,对于这种残留的代码也会步履维艰基于束手无策。因为,各种初始化和调用的代码,分遍在项目的“全国各地,四面八方”。即使你优化了,你会发现还要手动一个个地进行切换升级。更重要的是,很多时候不是你想优化就能优化的,即会受限于已有的上下文场景。
我曾经遇到过这样一个遗留系统。它是在UcHome基础上而进行的二次开发,但对于它的数据库使用,开发人员没有过多地优化,如:没有使用缓存,没有进行批量合并查询优化,重复查询相同的数据,没有建立索引,等等。这样的后果就是,请求一次接口,会触发150条到500条SQL语句不等。后来我在底层添加了在线查看调试SQL语句的功能,尝试进行了一些合并查询,但当我想为数据库的表添加索引时,发现它用的却是虚拟表视图!
如果说DI是微观上对“开发-配置-使用”模式的使用,那么PhalApi的扩展类库则是宏观上对此模式的应用。PhalApi扩展类库也是由第三方开发实现的,可能是PhalApi开发团队、项目的其他成员或者你自己,然后再通过简单配置或者无配置,就可以使用扩展类库的功能了。例如邮件发送、Ecxel的操作诸如此类。之所以提供扩展类库的形式,是因为DI资源更适合于单个类以及几个操作接口,而扩展类库则提供更丰富的功能操作和一系列的接口。这样以后,项目就可以简单快速共享已有的扩展类库。难道这不是一件令人兴奋的事情吗?毕竟“哈啊!我又找到了一个可以直接用的代码类库”,要比“唉,又要写一堆重复的代码,还要测试、联调……”更能让人心情愉悦。
程序、系统和框架,其作用太多数都体现在动态的功能上,而不是静态有限的功能。而动态的功能则很大程序上依赖于各种配置,如Tomcat下各层级xml配置。有些框架对配置这块提供了丰富的支持,但为此的代码是,配置难以掌控。以Yii框架为例(Yii是一个很优秀的框架,这里只是以事论事),当你需要在视图渲染一个数据表格时,你可以使用CGridView,并类似这样配置:
$columns = array(
array('name' => 'mId', 'header' => '序号'),
array('name'=>'id', 'header'=>'事件ID'),
array('name'=>'title', 'header'=>'标题'),
array('name'=>'content', 'header'=>'内容', 'type' => 'html'),);$this->widget('bootstrap.widgets.TbGridView', array(
'type'=>'striped bordered condensed',
'dataProvider'=>$dataProvider,
'columns'=> $columns,));复制代码更为复杂的情况可以是:
$columns = array(
// ... ...
array('class' => 'CDataColumn', 'header' => '内容', 'type' => 'html', 'name' => 'content', 'htmlOptions' => array('width' => '200px')),
array(
'class'=>'CButtonColumn',
'template'=>'{showEvent}<br/>{deleteEvent}',
'header'=>'操作',
'buttons'=>array
(
'showEvent' => array(
'label' => '查看',
'url' => '"?r=DailyOperations/eventManagerShow&user_iduser_id=' . $userId . '&eventId=". $data["id"];',
'options' => array('target' => '_blank'),
),
'deleteEvent' => array(
'label'=>'删除',
'url'=>'"javascript:void(0)"',
'imageUrl'=>'/images/delete_24.png',
'deleteConfirmation'=>"js:'Record with ID '+$(this).parent().parent().children(':first-child').text()+' will be deleted! Continue?'",
'click'=>'js:function(){if (confirm("此操作将删除:ID = " + $(this).parent().parent().children(\':first-child\').text() + " \n是否确定?")) {deleteEvent($(
this).parent().parent().children(\':first-child\').text());};}',
),
),
),);// ... ...
溧阳申请400电话费用【溧阳企业全国热线电话办理】溧阳开通400电话电信价格、溧阳微信公众号代运营外包托管、溧阳网店编辑装修美工、溧阳网站推广优化大概需要多少钱
服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878