标签:
框架的好处之一是有完整的日志记录系统,但都只是针对框架本身的,比如记录数据库调用信息,记录表单值和框架方法之间的参数和返回值等。但是如果项目之间涉及到跨平台,这个日志系统就显得微乎其微了。比如我之前参加的一个项目,主要是使用PHP来编写前段,包含几乎全部的业务逻辑,但是不需要操作数据库,因为操作数据库的所有事情都交给Java语言去实现了。而我们PHP组编写代码的其实只有6个人,但是给我们提供数据库操作的Java组就有30 多个人,按道理应该很容易将这个项目做出来。也只有经历过才觉得这之间的痛苦,这其中我们过的并不快乐。要知道,测试有任何问题都是找到我们,丝毫和接口没任何关系。而我们debug的结果是,自己去找Java中提供该接口的那个人。特别浪费时间,效率低并且接口的质量严重不过关。导致项目拖了两年 还久,直到现在都还在死死挣扎之中,我也是现在离开这家公司了。
还是后来有了新组长,他编码比较强,有很多年的工作经验。他来后就给我们写了这个函数,作用很简单,就是用来给Java接口debug的,我们只需要监控该函数产生的日志,就完全知道怎么回事了。
1.第一个函数是调用Java接口,使用PHP的扩展cURL中间件来实现,只需要简单的设置就可以使用了,我们的函数原型是这样的:
1 /** 2 * 3 * @name rop调用数据 4 * @param unknown $method 5 * @param unknown $params 6 * @param string $version 7 * @param string $format 8 * @return Ambigous <multitype:, string, mixed> 9 */ 10 function calljava($module, $method, $params , $version = ‘1.0‘) 11 { 12 $start = microtime(true); 13 $ret = array( 14 ‘code‘ => ‘999999‘ 15 ); 16 17 $callurl = geturl($module, $method, $version); 18 if ($callurl) { 19 $postQs = http_build_query($params); 20 $ch = curl_init(); 21 curl_setopt($ch, CURLOPT_URL, $callurl); 22 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 23 curl_setopt($ch, CURLOPT_POST, 1); 24 curl_setopt($ch, CURLOPT_POSTFIELDS, $postQs); 25 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 26 curl_setopt($ch, CURLOPT_TIMEOUT, 60); 27 $output = curl_exec($ch); 28 29 if ($errno = curl_errno($ch)) { 30 $output = "Error [$errno]: " . curl_error($ch); 31 } else { 32 $ret = json_decode($output, true); 33 } 34 curl_close($ch); 35 $duration = $start - microtime(true); 36 writeLog($callurl, $method, $params, $output, $duration); 37 } 38 return $ret; 39 }
2.第二个函数只是将各种接口的地址进行归类
//获取接口调用地址
1 function geturl($module, $method, $version) 2 { 3 $callurl = ‘‘; 4 $appKey = ‘00001‘; 5 $sign = ‘***A9957CCDB2‘; 6 switch ($module) { 7 case ‘bidding‘: 8 $url = C(‘INTERFACE_BIDDING_URL‘) ."/bidKing-rs/router?"; 9 break; 10 case ‘auction‘: 11 $url = C(‘INTERFACE_AUCTION_URL‘) ."/bidKing-rs/router?"; 12 break; 13 //一堆地址列表 14 } 15 16 if (! $url) { 17 writeLog(‘‘, ‘‘, ‘‘, ‘‘, 0); 18 } elseif (! $method) { 19 writeLog($callurl, ‘‘, ‘‘, ‘‘, 0); 20 } else { 21 $qs = "m=" . $method . "&v=" . $version . "&f=json&ak=" . $appKey . "&s=" . $sign; 22 $callurl = $url . $qs; 23 } 24 return $callurl; 25 }
3.第三个函数就比较重要了,虽然简单,但是就是它给接口调用反馈了一个清晰的提示,并且将日志记录到文件中,每个组都可以在浏览器中通过
接口路径查看自己的接口究竟产生了一些什么信息,还能看到是不是自己的错误或者疏漏。
1 /** 2 * 3 * @name 记录日志 4 * @param unknown $url:调用的url地址 5 * @param unknown $method:调用的方法 6 * @param unknown $request:传参 7 * @param unknown $response:返回信息 8 * @param unknown $duration:消耗时间 9 * @param string $type:日志类型,Info, 10 * Warning, Error 11 */ 12 function writeLog($url, $method, $request, $response, $duration) 13 { 14 $uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : ‘‘; 15 $serverip = isset($_SERVER[‘HTTP_HOST‘]) ? $_SERVER[‘HTTP_HOST‘] : ‘unknown‘; 16 17 $log = "[" . date(‘Y-m-d H:i:s‘) . "]"; 18 if (! $url || ! $method || ! $request) { 19 $log .= "\r\n-------------------------------\r\n"; 20 $log .= "Log Type: User Request Error!!!"; 21 $log .= "\r\n-------------------------------\r\n"; 22 $log .= "Error Message: Some necessary parameters are empty"; 23 $log .= "\r\n-------------------------------\r\n"; 24 $log .= "Solution: \r\ncallurl:" . $url . "\r\nmethod:" . $method . "\r\nrequest:" . var_export($request, true); 25 } else { 26 if (! $response) { 27 $log .= "\r\n-------------------------------\r\n"; 28 $log .= "Log Type: System Response Error!!!"; 29 $log .= "\r\n-------------------------------\r\n"; 30 $log .= "Error Message: Server Response is empty"; 31 } else { 32 $rjson = json_decode($response, true); 33 if ($rjson[‘code‘] == 1) { 34 $log .= "\r\n-------------------------------\r\n"; 35 $log .= "Log Type: System Error!!"; 36 $log .= "\r\n-------------------------------\r\n"; 37 $log .= "Error Message: " . $rjson[‘message‘]; 38 $log .= "\r\n-------------------------------\r\n"; 39 $log .= "Solution: " . $rjson[‘solution‘]; 40 } elseif (in_array($rjson[‘code‘], array( 41 8, 42 23, 43 25, 44 27, 45 30, 46 32, 47 33 48 ))) { 49 $log .= "\r\n-------------------------------\r\n"; 50 $log .= "Log Type: User Request Error!!!"; 51 $log .= "\r\n-------------------------------\r\n"; 52 $log .= "Error Message: " . $rjson[‘message‘]; 53 $log .= "\r\n-------------------------------\r\n"; 54 $log .= "Solution: " . $rjson[‘solution‘]; 55 } elseif ($rjson[‘code‘] != ‘000000‘) { 56 $log .= "\r\n-------------------------------\r\n"; 57 $log .= "Log Type: Error"; 58 $log .= "\r\n-------------------------------\r\n"; 59 $log .= "Error Message: " . $rjson[‘message‘]; 60 $log .= "\r\n-------------------------------\r\n"; 61 $log .= "Solution: " . $rjson[‘solution‘]; 62 } 63 } 64 } 65 $log .= "\r\n-------------------------------\r\n"; 66 $log .= "REQUEST URI: " . $uri; 67 $log .= "\r\n-------------------------------\r\n"; 68 $log .= "Call Method: " . MODULE_NAME . ‘/‘ . CONTROLLER_NAME . ‘/‘ . ACTION_NAME; 69 $log .= "\r\n-------------------------------\r\n"; 70 $log .= "Interface Url: " . $url. ‘&‘. http_build_query($request);; 71 $log .= "\r\n-------------------------------\r\n"; 72 $log .= "Interface Method: " . $method; 73 $log .= "\r\n-------------------------------\r\n"; 74 $log .= "Request Data: \r\n" . var_export($request, true); 75 $log .= "\r\n-------------------------------\r\n"; 76 $log .= "Response Data: \r\n" . var_export(json_decode($response, true), true); 77 $log .= "\r\n-------------------------------\r\n"; 78 $log .= "Duration time: " . abs($duration); 79 $log .= "\r\n-------------------------------\r\n"; 80 $log .= "User Client IP: " . get_client_ip(); 81 $log .= "\r\n-------------------------------\r\n"; 82 $log .= "Server IP: " . $serverip; 83 $log .= "\r\n-------------------------------\r\n\r\n"; 84 85 $logpath = LOG_PATH; 86 87 if (! is_dir($logpath)) { 88 mkdir($logpath); 89 } 90 if(! is_dir($logpath .‘/byMember‘)){ 91 mkdir($logpath.‘/byMember‘); 92 } 93 if(! is_dir($logpath .‘/byHour‘)){ 94 mkdir($logpath.‘/byHour‘); 95 } 96 if(! is_dir($logpath .‘/byInterface‘)){ 97 mkdir($logpath.‘/byInterface‘); 98 } 99 if(! is_dir($logpath .‘/byModule‘)){ 100 mkdir($logpath.‘/byModule‘); 101 } 102 $logfile = $logpath . ‘/byHour/‘ . date(‘YmdH‘) . ‘.log.txt‘; 103 $f = fopen($logfile, ‘a+‘); 104 fwrite($f, $log); 105 fclose($f); 106 $logfile = $logpath . ‘/byInterface/‘ . $method . ‘.log.txt‘; 107 $f = fopen($logfile, ‘a+‘); 108 fwrite($f, $log); 109 fclose($f); 110 $logfile = $logpath . ‘/byModule/‘ . MODULE_NAME . ‘-‘ . CONTROLLER_NAME . ‘-‘ . ACTION_NAME . ‘.log.txt‘; 111 $f = fopen($logfile, ‘a+‘); 112 fwrite($f, $log); 113 fclose($f); 114 if(isset($_SESSION[‘user‘][‘MEMBERID‘])) 115 { 116 $logfile = $logpath . ‘/byMember/‘ . $_SESSION[‘user‘][‘MEMBERID‘].‘.log.txt‘; 117 $f = fopen($logfile, ‘a+‘); 118 fwrite($f, $log); 119 fclose($f); 120 } 121 }
标签:
原文地址:http://www.cnblogs.com/zhgxun/p/4473390.html