发表日期: 2021-03-27 13:02:12 浏览次数:132
资兴申请400电话费用【资兴企业全国热线电话办理】资兴开通400电话电信价格、资兴微信公众号代运营外包托管、资兴网店编辑装修美工、资兴网站推广优化大概需要多少钱
资兴市,湖南省辖县级市,由郴州市代管,位于湖南省东南部。因唐代旧县治位于资兴江畔(今东江湖)而得名,是郴商的发源地之一。资兴市地处湘江流域耒水的上游,在罗霄山脉西麓、茶永盆地南端,为湘、粤、赣三省交汇处。东邻桂东县、株洲市炎陵县,南接汝城县、宜章县,西连苏仙区,北抵永兴、安仁县。总面积2746.79平方公里。 [1]
2017年,资兴市实现地区生产总值362.51亿元,按可比价格计算,增长8.3%。其中,第一产业增加值26.95亿元,增长4.2%;第二产业增加值223.59亿元,增长6.9%;第三产业增加值111.97亿元,增长12.5%。三次产业结构为7.4:61.7:30.9。 [2] 资兴市名优特产主要有杨梅、东江鱼、狗脑贡茶等;风景名胜主要有东江湖、寿佛寺、回龙山等。资兴市下辖2乡9镇2街道;户籍总人口37.85万人,常住人口34.97万人(2017年)。2017年10月,被住建部命名为国家园林城市。2018年11月,被科技部确定为首批创新型县(市), [3] 入选中国县级市全面小康指数前100名。第三批“绿水青山就是金山银山”实践创新基地。 [4]
2019年3月6日,中央宣传部、财政部、文化和旅游部、国家文物局《中央宣传部 财政部 文化和旅游部 国家文物局关于公布《革命文物保护利用片区分县名单(第一批)》的通知》资兴市名列其中。 [5]
2020年6月,经中央依法治国委入选为第一批全国法治政府建设示范地区和项目名单。 [6] 2020年度真抓实干成效明显,被湖南省人民政府公布为推动高质量发展成效明显的县市区,给予100万元标准奖励。
当接口不是正常响应,即ret不在2XX系列内时,msg字段会返回相应的错误提示信息。即当有异常(如上面所说的客户端非法请求和服务端运行错误两大类)触发时,会自动将异常的错误信息作为错误信息msg返回。
但对于服务端的异常,出于对接口隐私的保护,框架在错误信息时没有过于具体地描述;相反,对于客户端的异常,由会进行必要的说明,以提醒客户端该如何进行调用调整。
此外,我们根据需要可以考虑是否需要进行国际化的翻译。如果项目在可预见的范围内需要部署到国外时,提前做好翻译的准备是很有帮助的。例如前面的签名失败时,可以将异常错误信息进行翻译后再返回。
throw new PhalApi_Exception_BadRequest(T('wrong sign'), 1);复制代码当使用的是HTTP/HTTPS协议时,并且需要设置头部header时,可以使用PhalApi_Response::addHeaders()进行设置。对于JSON格式的返回默认设置的头部有:Content-Type:"application/json;charset=utf-8"。
更多设置HTTP头部信息的示例如下:
// 设置允许指定的域名跨域访问DI()->response->addHeaders('Access-Control-Allow-Origin', 'www.phalapi.net');// 设置CDN缓存DI()->response->addHeaders('Cache-Control, 'max-age=600, must-revalidate');复制代码后面相同的头部信息会覆盖前面的。
很明显地,默认情况下,我们选择了JSON作为统一的返回格式。这里简单说明一下选取JSON统一返回的原因:
JSON当前很流行,且普通接口都采用此格式返回
JSON在绝大部分开发语言中都支持,跨语言
JSON在浏览器浏览时,有可视化插件支持
鉴于大家普通对JSON已经熟悉,这里不再赘述。
在《RESTful Web APIs》一书中提及到,标准可以划归到4个分类,分别是:fiat标准、个人标准、公司标准以及开放标准。
显然,我们这里推荐的JSON + ret-data-msg 返回格式既不是个人标准,也不是公司标准(就笔者观察的范筹而言,未发现某个公司定义了此格式)。而且,这也不属于开放标准,因为也还没达到此程度。更多的,它是fiat标准。我们很容易发现,身边的应用、系统以及周围项目都在使用诸如此类的返回结构格式。
当然,我们可希望可以消除语义上的鸿沟,以便在接口服务开发上有一个很好地共识。
同时,JSON + ret-data-msg返回格式也是一种领域特定的格式,它更多是为app多端获取业务数据而制作的规范。虽然它不是很完美,不具备自描述消息,也没有资源链接的能力,但我们认为它是一种恰到好处的格式。在基于JSON通用格式的基础上,加以ret-data-msg的约束,它很好地具备了统一性,从而降低门槛,容易理解。
开启调试模式很简单,主要有两种方式:
单次请求开启调试:默认添加请求参数&__debug__=1
全部请求开启调试:把配置文件./Config/sys.php文件中的配置改成'debug' => true,
请特别注意,在实际项目中,调试参数不应使用默认的调试参数,而应各自定义,使用更复杂的参数,从而减少暴露敏感或者调试信息的风险。例如:
不推荐的做法:&__debug__=1
一般的做法:&__phalapi_debug__=1
更好的做法:&__phalapi_debug__=202cb962ac59075b964b07152d234b70
正常响应的情况下,当开启调试模式后,会返回多一个debug字段,里面有相关的调试信息。如下所示:
{
"ret": 200,
"data": {
},
"msg": "",
"debug": {
"stack": [ // 自定义埋点信息
],
"sqls": [ // 全部执行的SQL语句
]
}}复制代码温馨提示:调试信息仅当在开启调试模式后,才会返回并显示。
在发生未能捕捉的异常时,并且开启调试模式后,会将发生的异常转换为对应的结果按结果格式返回,即其结构会变成以下这样:
{
"ret": 0, // 异常时的错误码
"data": [],
"msg": "", // 异常时的错误信息
"debug": {
"exception": [ // 异常时的详细堆栈信息
],
"stack": [ // 自定义埋点信息
],
"sqls": [ // 全部执行的SQL语句
]
}}复制代码查看全部执行的SQL语句
debug.sqls中会显示所执行的全部SQL语句,由框架自动搜集并统计。最后显示的信息格式是:
[序号 - 当前SQL的执行时间ms]所执行的SQL语句及参数列表复制代码
示例:
[1 - 0.32ms]SELECT * FROM tbl_user WHERE (id = ?); -- 1复制代码
表示是第一条执行的SQL语句,消耗了0.32毫秒,SQL语句是SELECT * FROM tbl_user WHERE (id = ?);,其中参数是1。
查看自定义埋点信息
debug.stack中埋点信息的格式如下:
[#序号 - 距离最初节点的执行时间ms - 节点标识]代码文件路径(文件行号)复制代码
示例:
[#0 - 0ms]/path/to/PhalApi/Public/index.php(6)复制代码
表示,这是第一个埋点(由框架自行添加),执行时间为0毫秒,所在位置是文件/path/to/PhalApi/Public/index.php的第6行。即第一条的埋点发生在框架初始化时:
// $ vim ./Public/init.phpif (DI()->debug) {
// 启动追踪器
DI()->tracer->mark();
... ...}复制代码与SQL语句的调试信息不同的是,自定义埋点则需要开发人员根据需要自行纪录,可以使用全球追踪器DI()->tracer进行纪录,其使用如下:
// 添加纪录埋点DI()->tracer->mark();// 添加纪录埋点,并指定节点标识DI()->tracer->mark('DO_SOMETHING');复制代码通过上面方法,可以对执行经过的路径作标记。你可以指定节点标识,也可以不指定。对一些复杂的接口,可以在业务代码中添加这样的埋点,追踪接口的响应时间,以便进一步优化性能。当然,更专业的性能分析工具推荐使用XHprof。
参考:用于性能分析的XHprof扩展类库。
例如在Hello World接口服务中,添加一个操作埋点。
// $ vim ./Shop/Api/Welcome.php
public function say() {
DI()->tracer->mark('欢迎光临');
return 'Hello World';
}复制代码再次请求,并使用&__debug__=1开启调试模式后会看到类似这样的返回结果。
{
"ret": 200,
"data": "Hello World",
"msg": "",
"debug": {
"stack": [
"[#0 - 0ms]/path/to/PhalApi/Public/shop/index.php(6)",
"[#1 - 5.4ms - 欢迎光临]/path/to/PhalApi/Shop/Api/Welcome.php(13)"
],
"sqls": []
}}复制代码可以看出,在“开始读取数据库”前消耗了5.4毫秒,以及相关的代码位置。

资兴申请400电话费用【资兴企业全国热线电话办理】资兴开通400电话电信价格、资兴微信公众号代运营外包托管、资兴网店编辑装修美工、资兴网站推广优化大概需要多少钱