妙用php中的register_shutdown_function和fastcgi_finish_request

前言

在php中又两个方法都是在请求快结束的时候执行。方法名分别是 register_shutdown_function和fastcgi_finish_request。虽然执行的时机差不多,但是功能和应用场景不一样。比较两个方法的区别不是本文的重点。本文的重点的说明两个方法的应用场景。

register_shutdown_function

功能:

注册一个方法,当一个请求request执行完毕时,调用这个注册的方法。注意,哪怕在执行过程中发生error导致本次请求被强制退出,注册的方法也会执行。

应用场景一:

可以利用他的特性,捕获一些错误的一些详细信息。示例代码如下:


function catch_error(){
    $error = error_get_last();
    if($error){
        var_dump($error);
    }
}
register_shutdown_function("catch_error");
ini_set('memory_limit','1M');
$content = str_repeat("aaaaaaaaaaaaaaaaaaaaaaa",100000);
echo "aa";
 

输出信息大概如下:

array(4) { ["type"]=> int(1) ["message"]=> string(80) "Allowed memory size of 1048576 bytes exhausted (tried to allocate 2300001 bytes)" ["file"]=> string(39) "/test.php" ["line"]=> int(13) }

可见,上面的代码正常的捕捉了内存不足的错误。

应用场景二
检查请求是否正常关闭。示例代码如下:

function monitor(){
    global $is_end;
    if($is_end == true){
        echo "success";
    }else{
        echo "fail";
    }
}
register_shutdown_function("monitor");
$is_end = false;
die();
$is_end = true;

页面输出结果为:fail
可见,即便是调用了die函数。注册的monitor函数也正常执行了。

fastcgi_finish_request

功能:
flush数据到客户端。调用这个方法后,再有任何输出内容,都不会输出到客户端。

应用场景:

如果一个请求的处理内容中,有一部分是不需要发送到客户端时,就可以先生成输出到客户端的内容,然后调用此方法。方法被调用后,内容就会输出到客户端。而不需要输出到客户端的内容,可以放在此方法后。这样可以提高响应速度。示例代码如下:

echo "a";
fastcgi_finish_request();
echo "b";
file_put_contents("/tmp/test","bo56.com");
die();
file_put_contents("/tmp/b56","博学无忧");

页面输出结果为:a
可见,fastcgi_finish_request方法后的echo “b” 并没有输出到客户端。但是你会发现在/tmp/test目录下正常的创建了文件。但是/tmp/bo56文件没创建。

时间: 2024-10-03 21:30:54

妙用php中的register_shutdown_function和fastcgi_finish_request的相关文章

深入浅出妙用Javascript中apply、call、bind

这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写.炫耀从来不是我的动机,好奇才是." 对于这句话,不能赞同更多,也让我下决心好好写这篇,网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙

【优雅代码】深入浅出 妙用Javascript中apply、call、bind

这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写.炫耀从来不是我的动机,好奇才是." 对于这句话,不能赞同更多,也让我下决心好好写这篇,网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙

妙用Word中的宏隐藏Word文档内容

在 多人共用的电脑中,为了 防止别人看到自己的秘密,每个人对各自存放的文档都采取了一定的保护措施,要么给文件或文件夹设置隐藏属性,要么对文档进行密码保护,但这些都是俗招!笔者最近另辟蹊径,发现了一个保护http://www.aliyun.com/zixun/aggregation/34073.html">Word文档的新招,只要同时按下三个键即可将文档内容隐藏,别人打开后 里面空空如也. 第一步:启动Word,执行"工具→宏→录制新宏--"命令,打开"录制宏&

一次php进程诡异退出的排查过程

背景 最近给XX项目搭建一个反垃圾平台.效果不错,但是出现了一个诡异的事情.离线扫描部分会有一个常驻的php进程,以便处理发现的垃圾信息.常驻的php进程总是诡异的退出.php代码示例如下: <?php while(1){ $content = fgets(STDIN); if(empty($content)){ sleep(1); } //逻辑处理部分代码省略 } ?> 排查过程 最初的想法是php执行过程中出现的致命错误,导致php进程退出.好吧,我们使用register_shutdown

php中__destruct与register_shutdown_function执行的先后顺序问题_php技巧

根据php手册的解析. __destruct是 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行. 而register_shutdown_function是 Registers a callback to be executed after script execution finishes or exit() is called. 注册一个回调函数,此函数在脚本运行完毕或调用exit()时执行. 从字面上理解,__destruct是对象层面的,而register_shutdo

PHP中使用register

  这篇文章主要介绍了PHP中使用register_shutdown_function函数截获fatal error示例,需要的朋友可以参考下 我们在做项目时,偶尔会因为不谨慎而出现fatal error.如果display_errors设置成off,那用户将会看到的是一个空白的页面.若设置成了on,那fatal error的信息将会呈现出来(当然正常的人都不会这样干). 那我们有什么方法可以提前截获到fatal error,并用我们自己自定义的友好形式反馈给用户呢.PHP中有一个叫做 regi

Java中创建URL的常见问题及解决方案

URL无处不在,不过似乎开发人员并没有真正地理解它们,因为我在Stack Overflow上经常看到有人在问如何正确的创建一个URL.想知道URL语法是如何工作的,可以看下Lunatech的 这篇文章 ,非常不错 . 本文不会深入介绍URL的全部语法(如果你想全面了解URL的话,可以读下 RFC 3986 , RFC 1738 , 以及上面提到的那篇文章,还有 W3上面的文档 ), 这里我想讲的是常见的一些库在操作URL方面存在的错误,以及如何通过 URL-builder 来正确的使用它,这是我

短评:网游中人文精神的倒退

网络游戏中凸显的价值观到底是娱乐还是倒退?这是个问题. 在游戏中,我们实际上离人类的人文精神越来越远,这是有识之士的普遍忧虑.在崇尚消费主义.拜金主义和官本位思想膨胀的今天,如何张扬人文精神,提倡为人类谋普适价值共同理想的人文精神,似乎是一个越来越被搁置的虚问题.有人以为,90后对于80后来说,人文精神淡了,现实精神却强了.他们没有看到的是,这代人成长的是一个什么样的文化环境.某后宫群取名 "金枝",并且沿用港剧<金枝欲孽>的角色:另一个群则以网络小说<后宫·甄传&

基于ASP的站内多值搜索

  运行环境:IIS脚本语言:VBScript数据库:Access/SQL Server数据库语言:SQL 1.概要:不论是在论坛,还是新闻系统,或是下载系统等动态网站中,大家经常会看到搜索功能:搜索帖子,搜索用户,搜索软件(总之搜索关键字)等,本文则是介绍如何建立一个高效实用的,基于ASP的站内多值搜索. 本文面对的是"多条件模糊匹配搜索",理解了多条件的,单一条件搜索也不过小菜一碟了.一般来讲,有两种方法进行多条件搜索:枚举法和递进法.搜索条件不太多时(n<=3),可使用枚举