利用php的register_shutdown_function来记录php的输出日志

最近在做的一个项目..由于全是通过远程http请求来调用php的接口程序..

接收到的参数和返回的内容对开发人员来说都是未知不可见的..

虽然可以通过直接在脚本中模拟请求..但由于实际环境复杂的多..调试极其不方便.

于是想是否可以写一个函数用来记录对php接口调用的情况.

想到以前看到过的一个php函数register_shutdown_function..

该函数的作用是注册一个函数,当php脚本执行完成,或者代码中调用了exit ,die这样的代码之后,执行预先注册好的函数.

这样我们就可以在该函数中记录php调用执行的情况了.

简单写了下,看起来应该可以用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function bdebug(){
$file="bdebug_log.txt";
if($_REQUEST){
foreach($_REQUEST as $k=>$v){
$request.=$k." = ".$v." ";
}
}
foreach($_SERVER as $k=>$v){
$server.=$k." = ".$v." ";
}
$content=date('Y-m-d H:i:s')." REQUEST信息: ".$request." SERVER信息: ".$server." ";
ob_start();
function shutdown_func($file){
$content=date('Y-m-d H:i:s')." 输出的信息: ".ob_get_contents()." ";
file_put_contents($file,$content,FILE_APPEND);
}
register_shutdown_function('shutdown_func',dirname(__FILE__).DIRECTORY_SEPARATOR.$file);
file_put_contents($file,$content,FILE_APPEND);
}
?>

需要调用时 包含此文件执行bdebug() 即可.当php被调用时,会在该文件同目录下生成日志文件

用以记录调用的相关信息.

我这里只记录了 request ,server 以及php输出返回的信息.

具体可根据实际需要增减要记录的信息.

php开发测试及线上的时候可以根据不同情况设定错误和异常处理需要用到有

设定错误和异常处理三函数

  1. register_shutdown_function(array(‘Debug’,'fatalError’)); //定义PHP程序执行完成后执行的函数
  2. set_error_handler(array(‘Debug’,'appError’)); // 设置一个用户定义的错误处理函数
  3. set_exception_handler(array(‘Debug’,'appException’)); //自定义异常处理。

下面讲一下register_shutdown_function() 函数.

功能:register_shutdown_function() 函数可实现当程序执行完成后执行的函数,其功能为可实现程序执行完成的后续操作。程序在运行的时候可能存在执行超时,或强制关闭等情况,但这种情况下默认的提示是非常不友好的,如果使用register_shutdown_function()函数捕获异常,就能提供更加友好的错误展示方式,同时可以实现一些功能的后续操作,如执行完成后的临时数据清理,包括临时文件等。

可以这样理解调用条件:

1、当页面被用户强制停止时

2、当程序代码运行超时时

3、当PHP代码执行完成时,代码执行存在异常和错误、警告

实例说明

1. 一个简介的例子 , 调用一个函数

  1. <?php
  2. function test() {
  3.     echo "test()";
  4. }
  5. register_shutdown_function(array("test"));
  6. echo "show: ";
  7. ?>

这个例子输出  

  1.  show: test()    

这个函数的作用就是在退出脚本前,调用已经注册的函数,并执行该函数。

2. 在类中用一个数组作为一个参数

  1. <?php
  2.     class ClassDemo {
  3.         public function __construct() {
  4.             register_shutdown_function(array($this, "f"));
  5.         }
  6.  
  7.         public function f() {
  8.             echo "f()";
  9.         }
  10.     }
  11.  
  12.     $demo = new ClassDemo();
  13.     echo "before </br>";
  14. ?>

输出:

  1. before
  2. f()

3. 带有参数的例子:

  1. <?php
  2. function f($str) {
  3.         echo $str."<br>";
  4. }
  5.  
  6. register_shutdown_function("f","hello");
  7.  
  8.     class ClassDemo {
  9.         public function __construct() {
  10.             register_shutdown_function(array($this, "f"),"hello");
  11.         }
  12.  
  13.         public function f($str) {
  14.             echo "f():".$str;
  15.         }
  16.     }
  17.  
  18.    $demo = new ClassDemo();
  19.    echo "before </br>";  
  20. ?>

注意事项

1,register_shutdown_function()函数可重复调用,但执行的顺序与注册的顺序相同
2,如果在调用register_shutdown_function()函数之前有exit()函数调用,register_shutdown_function()函数将不能执行
3,PHP4后支持注册函数参数传递
4,在某些服务端,如Apache,当前目录在register_shutdown_function()函数中能够改变
5,register_shutdown_function()函数执行在headers发送之后
快乐生活,努力工作
原文地址:https://www.cnblogs.com/aprils/p/3979921.html