妙用php中的register_shutdown_function和fastcgi_finish_request
前言
在php中又两个方法都是在请求快结束的时候执行。方法名分别是 register_shutdown_function和fastcgi_finish_request。虽然执行的时机差不多,但是功能和应用场景不一样。比较两个方法的区别不是本文的重点。本文的重点的说明两个方法的应用场景。
register_shutdown_function
功能:
注册一个方法,当一个请求request执行完毕时,调用这个注册的方法。注意,哪怕在执行过程中发生error导致本次请求被强制退出,注册的方法也会执行。
应用场景一:
可以利用他的特性,捕获一些错误的一些详细信息。示例代码如下:
1
2
3
4
5
6
7
8
9
10
|
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) }
可见,上面的代码正常的捕捉了内存不足的错误。
应用场景二
检查请求是否正常关闭。示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
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数据到客户端。调用这个方法后,再有任何输出内容,都不会输出到客户端。
应用场景:
如果一个请求的处理内容中,有一部分是不需要发送到客户端时,就可以先生成输出到客户端的内容,然后调用此方法。方法被调用后,内容就会输出到客户端。而不需要输出到客户端的内容,可以放在此方法后。这样可以提高响应速度。示例代码如下:
1
2
3
4
5
6
|
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文件没创建。
原文链接:妙用php中的register_shutdown_function和fastcgi_finish_request
最新文章
- KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)
- 洛谷P3378 【模板】堆
- 综合支撑【恶灵附身 Psycho Break】的世界观的概念艺术
- IBatis.net动态SQL语句(六)
- LeetCode46,47 Permutations, Permutations II
- debian终端菱形乱码修复
- 【HDOJ】1930 And Now, a Remainder from Our Sponsor
- notepad++ 配置笔记
- Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET
- vimer
- 原生的ajax(json)
- (简单) POJ 3268 Silver Cow Party,Dijkstra。
- Android apk应用程序签名
- java-8u151-64安装与配置环境变量
- 从零开始打jar包--补充
- [原创]CobaltStrike &; Metasploit Shellcode一键免杀工具
- 4. 泛型_EJ
- go语言学习--map的并发
- poj 2528(线段树+离散化) 市长的海报
- laravel加载视图
热门文章
- Eclipse maven 项目红叉 编译不报错问题处理
- wp8 各种启动器
- 解决 ios7.0 以后自定义导航栏左边按钮靠右的问题
- 【Python + ATX基于uiaotumator2】之Android—APP自动化简易例子
- Java进阶03 IO基础(转载)
- Spring MVC属性方法名称解析器
- 报错:org.apache.jasper.JasperException: /jsp/head.jsp (line: 1, column: 2) Page directive: illegal to
- laravel Lumen邮箱发送配置
- [转]JavaWeb之 Servlet执行过程 与 生命周期
- 【BZOJ1820】[JSOI2010]Express Service 快递服务 暴力DP