利用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."\r\n";

}

}

foreach($_SERVER as $k=>$v){

$server.=$k." = ".$v."\r\n";

}

$content=date(‘Y-m-d H:i:s‘)." REQUEST信息: \r\n".$request."\r\nSERVER信息: \r\n".$server."\r\n";

ob_start();

function shutdown_func($file){

$content=date(‘Y-m-d H:i:s‘)." 输出的信息: \r\n".ob_get_contents()."\r\n";

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. public function f() {
  7. echo "f()";
  8. }
  9. }
  10. $demo = new ClassDemo();
  11. echo "before </br>";
  12. ?>

输出:

  1. before
  2. f()

3. 带有参数的例子:

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

注意事项

1,register_shutdown_function()函数可重复调用,但执行的顺序与注册的顺序相同
2,如果在调用register_shutdown_function()函数之前有exit()函数调用,register_shutdown_function()函数将不能执行
3,PHP4后支持注册函数参数传递
4,在某些服务端,如Apache,当前目录在register_shutdown_function()函数中能够改变
5,register_shutdown_function()函数执行在headers发送之后

时间: 2024-10-12 21:47:54

利用php的register_shutdown_function来记录php的输出日志的相关文章

利用PHP的register_shutdown_function来记录PHP的输出日志,模拟析构函数

最近在做的一个项目,由于全是通过远程HTTP请求来调用PHP的接口程序. 接收到的参数和返回的内容对开发人员来说都是未知不可见的. 虽然可以通过直接在脚本中模拟请求,但由于实际环境复杂的多,调试极其不方便. 于是想是否可以写一个函数用来记录对PHP接口调用的情况. 想到以前看到过的一个PHP函数 register_shutdown_function(). 该函数的作用是注册一个函数,当PHP脚本执行完成,或者代码中调用了 exit , die 这样的代码之后,执行预先注册好的函数. 这样我们就可

Java中使用Log4j记录错误、输出日志

简介: Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 官方站点:http://logging.apache.org/log4j/ Log4j配置: 第一步:

Linux认证用Syslog记录UNIX和Windows日志的方法

Linux认证用Syslog记录UNIX和Windows日志的方法,在网络中安排一台专用的日志服务器来记录系统日志是一个比较理想的方案.本文以FreeBSD下的syslog为例,介绍如何利用freebsd的syslogd来记录来自UNIX和windows的log信息. 在比较大规模的网络应用或者对安全有一定要求的应用中,通常需要对系统的日志进行记录分类并审核,默认情况下,每个系统会在本地硬盘上记录自己的日 志,这样虽然也能有日志记录,但是有很多缺点:首先是管理不便,当服务器数量比较多的时候,登陆

apache日志切割与不记录指定文件类型日志

1.# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 修改日志文件为: ErrorLog "logs/test.com-error_log"       错误日志 CustomLog "logs/test.com-access_log" combined  访问日志  相对路径 Apache的common日志格式定义: # vim /usr/local/apache2/conf/httpd.conf <

在程序中使用命令打开一个进程和记录该进程执行日志

//在需要的程序中调用ExcutedCmd函数来打开执行dos命令 //cmd 命令  args 命令参数 private static void ExcutedCmd(string cmd, string args) { using (Process p = new Process()) { ProcessStartInfo psi = new ProcessStartInfo(cmd, args); psi.CreateNoWindow = true; psi.UseShellExecute

异常记录(写txt日志文件)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace WebBuild_CRM.Common { public class ExceptionRecord { public static void RecordException(Exception ex) { FileStream fileStream = null; Str

如何利用log4Net自定义属性配置功能记录完整的日志信息

log4Net作为专业的log记录控件,对于它的强大功能大家一定不陌生.下面我将详细介绍如何利用其自定义属性,让日志信息更完整. 一,创建测试工程,log4Net组件可以自己从网上下载,也可通过Nuget进行安装. 二,创建日志模型及数据库表,因为我们的日志信息可以输出为文本,也可以输出到数据库. 三,添加MyLayout,MyPatternConverter类扩展PatternLayout. 四,添加Log4Net.config文件,进行输入方式定义. <?xml version="1.

利用pycharm进行重构学习记录

pycharm是非常强大的pythonIDE,集成了很多实用的功能,其中就包括重构Refactor 记录下使用pycharm的重构 pycharm的Refactor默认在主菜单上就有了 Refactor this该菜单项会在光标出显示所有支持的重构选项 Rename重命名,重命名该函数,并应用到所有使用该函数的函数 Change Signature修改签名即修改函数名,参数.可以移动参数位置,设置参数默认值等等 Move移动,将函数移动到其他文件 Copy复制 Extract提炼 variabl

Python: 利用Python进行数据分析 学习记录

-----15:18 2016/10/14----- 1. import numpy as np;import pandas as pd values = pd.Series(np.random.normal(0,1,size=2000)) #Series可看作一个定长的有序字典. 高斯分布对应的概率密度函数对应于numpy中: np.random.normal(loc=mu, scale=sigma, size=Non) 标准的正态分布(mu=0,sigma=1) np.random.norm