发表日期: 2021-04-26 09:35:07 浏览次数:217
如皋网站优化【如皋开通400电话】如皋网站搭建、如皋微信公众号推文外包、如皋开通京东拼多多设计、如皋淘宝装修
如皋市,简称“如”或“皋”,江苏省辖县级市,由南通市代管,江苏省历史文化名城。地处长江三角洲北翼,位于南通、泰州、苏州三市交界处,南与张家港市隔江相望,北与海安市、东与如东县连接、东南与南通市通州区毗邻,西与泰兴市、西南与靖江市接壤。全市总面积1477平方公里(不含长江水面),长江水面99平方千米。如皋长江岸线全长48千米,可直接利用长江深水岸线18.6千米。
如皋市被国际自然医学会评为世界六大长寿乡之一。 [1] 如皋市户籍人口约142万。截至2021年1月1日,全市80周岁以上高龄老人68031人,90周岁以上高龄老人10150人,百岁老人达525位,其中105岁以上达16位。 [2]
2019年6月17日,如皋被中华人民共和国住房和城乡建设部选取作为开展规范城市户外广告设施管理工作试点城市。 [3] 2019年10月8日,被评为2019年度全国综合实力百强县市、2019年度全国绿色发展百强县市、2019年度全国新型城镇化质量百强县市、2019全国营商环境百强县。 [4-6] 2020年12月,社科院发布《全国县域经济综合竞争力100强》,如皋排名第31 [7] 。
参考:用于性能分析的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毫秒,以及相关的代码位置。
查看异常堆栈信息
当有未能捕捉的接口异常时,开启调试模式后,框架会把对应的异常转换成对应的返回结果,并在debug.exception中体现。而不是像正常情况直接500,页面空白。这些都是由框架自动处理的。
继续上面的示例,让我们故意制造一些麻烦,手动抛出一个异常。
// $ vim ./Shop/Api/Welcome.php
public function say() {
DI()->tracer->mark('欢迎光临');
throw new Exception('这是一个演示异常调试的示例', 501);
return 'Hello World';
}复制代码再次请求后,除了SQL语句和自定义埋点信息外,还会看到这样的异常堆栈信息。
{
"ret": 501,
"data": [],
"msg": "这是一个演示异常调试的示例",
"debug": {
"exception": [
{
"function": "say",
"class": "Api_Welcome",
"type": "->",
"args": []
},
... ...
],
"stack": ... ...,
"sqls": ... ...
}}复制代码然后便可根据返回的异常信息进行排查定位问题。
添加自定义调试信息
当需要添加其他调试信息时,可以使用DI()->response->setDebug()进行添加。
如:
$x = 'this is x';$y = array('this is y');DI()->response->setDebug('x', $x);DI()->response->setDebug('y', $y);复制代码请求后,可以看到:
"debug": {
"x": "this is x",
"y": [
"this is y"
]
}复制代码默认返回的是ret字段、data字段和msg字段。如果需要使用其他字段名称,可以重写PhalApi_Response::getResult(),然后重新注册即可。请在父类返回的基础上再作调整,以保持对调试模式和后续新增基础功能的支持。
例如,类似微信开放平台的接口一样,成功时只返回data字段,失败时则只返回ret字段和msg字段,并分别改名为status字段和errormsg字段。
// $ vim ./Shop/Common/Response/Result.php<?phpclass Common_Response_Result extends PhalAPi_Response_JSON {
public function getResult() {
$newRs = array();
$oldRs = parent::getResult();
if ($oldRs['ret'] >= 200 && $oldRs['ret'] <= 299) {
$newRs = $oldRs['data'];
} else {
$newRs['status'] = $oldRs['ret'];
$newRs['errormsg'] = $oldRs['msg'];
}
if (isset($oldRs['debug']) && is_array($newRs)) {
$newRs['debug'] = $oldRs['debug'];
}
return $newRs;
}}复制代码重写并实现后,需要重新注册DI()->response服务,这里是在Shop项目的入口文件进行重新注册。
// $ vim ./Public/shop/index.php// 调整返回结构DI()->response = 'Common_Response_Result';复制代码
随后,再访问接口服务,便可看到返回的结构已发生变化。例如访问默认接口服务?service=Default.Index,会返回:
{
"title": "Hello World!",
"content": "PHPer您好,欢迎使用PhalApi!",
"version": "1.4.0",
"time": 1495007735}复制代码除了使用JSON格式返回外,还可以使用其他格式返回结果。
例如在部分H5混合应用页面进行异步请求的情况下,客户端需要服务端返回JSONP格式的结果,则可以这样在初始化文件./Public/init.php中去掉以下注释。
if (!empty($_GET['callback'])) {
DI()->response = new PhalApi_Response_JsonP($_GET['callback']);}复制代码当需要返回一种当前PhalApi没提供的格式,需要返回其他格式时,可以:
1、实现抽象方法PhalApi_Response::formatResult($result)并返回格式化后结果
2、重新注册DI()->response服务
