Heim  >  Artikel  >  Backend-Entwicklung  >  php 脚本停止回调函数

php 脚本停止回调函数

WBOY
WBOYOriginal
2016-06-13 10:54:401380Durchsuche

php 脚本终止回调函数

脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫做? register_shutdown_function 的函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致 命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示(译注:可以设置display_errors和 error_reporting),让例子看起来好看些.

<span style="color: #000000;"><span style="color: #0000bb;"><?php ?<br>$clean?</span><span style="color: #007700;">=?</span><span style="color: #0000bb;">false</span><span style="color: #007700;">;?<br>function?</span><span style="color: #0000bb;">shutdown_func</span><span style="color: #007700;">(){?<br>global?</span><span style="color: #0000bb;">$clean</span><span style="color: #007700;">;?<br>if?(!</span><span style="color: #0000bb;">$clean</span><span style="color: #007700;">){?<br>die(</span><span style="color: #dd0000;">"not?a?clean?shutdown"</span><span style="color: #007700;">);?<br>}?<br>return?</span><span style="color: #0000bb;">false</span><span style="color: #007700;">;?<br>}?<br><br></span><span style="color: #0000bb;">register_shutdown_function</span><span style="color: #007700;">(</span><span style="color: #dd0000;">"shutdown_func"</span><span style="color: #007700;">);?<br><br></span><span style="color: #0000bb;">$a?</span><span style="color: #007700;">=?</span><span style="color: #0000bb;">1</span><span style="color: #007700;">;?<br></span><span style="color: #0000bb;">$a?</span><span style="color: #007700;">=?new?</span><span style="color: #0000bb;">FooClass</span><span style="color: #007700;">();?</span><span style="color: #ff8000;">// 将因为致命错误而失败<br></span><span style="color: #0000bb;">$clean?</span><span style="color: #007700;">=?</span><span style="color: #0000bb;">true</span><span style="color: #007700;">;?<br><br></span><span style="color: #0000bb;">?></span></span>

正如你所看到,如果关闭回调函数运行时,clean变量没有被设为true,shutdown_func函数将会打印出一些东西.这个东西可以包装成一个类(不使用全局变量).

?

?

?

PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数。

php程序员站

例子:
<span style="color: #000000;">html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">?<br>?<br>?<br><meta>?<br><title>register_shutdown_function示例</title>?<br>?<br>?<br><span style="color: #0000bb;"><?php ?<br>$starttime</span><span style="color: #007700;">=</span><span style="color: #0000bb;">microtime</span><span style="color: #007700;">(</span><span style="color: #0000bb;">true</span><span style="color: #007700;">);?<br></span><span style="color: #0000bb;">www</span><span style="color: #007700;">.</span><span style="color: #0000bb;">phperz</span><span style="color: #007700;">.</span><span style="color: #0000bb;">com?<br></span><span style="color: #007700;">function?</span><span style="color: #0000bb;">Test</span><span style="color: #007700;">(){?<br></span><span style="color: #0000bb;">$starttime</span><span style="color: #007700;">=</span><span style="color: #0000bb;">microtime</span><span style="color: #007700;">(</span><span style="color: #0000bb;">true</span><span style="color: #007700;">);????<br>if(!</span><span style="color: #0000bb;">file_exists</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'Test.txt'</span><span style="color: #007700;">)){?????</span><span style="color: #ff8000;">//判断如果文件不存在!!?<br></span><span style="color: #0000bb;">$Str?</span><span style="color: #007700;">=?</span><span style="color: #0000bb;">fopen</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'Test.txt'</span><span style="color: #007700;">,</span><span style="color: #dd0000;">"w+"</span><span style="color: #007700;">);????????<br></span><span style="color: #0000bb;">fwrite</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$Str</span><span style="color: #007700;">,</span><span style="color: #dd0000;">'我是在最后写进来的.时间:$starttime'</span><span style="color: #007700;">);?<br></span><span style="color: #0000bb;">fclose</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$Str</span><span style="color: #007700;">);?<br>echo?</span><span style="color: #dd0000;">"创建完成!创建时间:</span><span style="color: #0000bb;">$starttime</span><span style="color: #dd0000;">"</span><span style="color: #007700;">;?<br>}?<br>else?{?</span><span style="color: #ff8000;">//如果存在;?<br></span><span style="color: #007700;">echo?</span><span style="color: #dd0000;">'文件已经存在'</span><span style="color: #007700;">;?<br>}?<br>}?<br></span><span style="color: #0000bb;">register_shutdown_function</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'Test'</span><span style="color: #007700;">);?<br>echo?</span><span style="color: #dd0000;">"程序开始:"</span><span style="color: #007700;">.</span><span style="color: #0000bb;">$starttime</span><span style="color: #007700;">.</span><span style="color: #dd0000;">"<br>"</span><span style="color: #007700;">;?</span><span style="color: #0000bb;">phperz</span><span style="color: #007700;">~</span><span style="color: #0000bb;">com?<br><br></span><span style="color: #007700;">for(</span><span style="color: #0000bb;">$i</span><span style="color: #007700;">=</span><span style="color: #0000bb;">0</span><span style="color: #007700;">;</span><span style="color: #0000bb;">$i</span><span style="color: #007700;"><span style="color: #0000bb;">1000</span><span style="color: #007700;">;</span><span style="color: #0000bb;">$i</span><span style="color: #007700;">++){?<br>echo?</span><span style="color: #dd0000;">"Echo<br>"</span><span style="color: #007700;">;?<br>}?<br>exit;?<br></span><span style="color: #0000bb;">?>?<br></span>?<br></span></span>

?

?

register_shutdown_function的作用是指定当本页面所有脚本执行完成之后执行的函数。
<span style="color: #000000;"><span style="color: #0000bb;"><?php ?<br></span><span style="color: #007700;">function?</span><span style="color: #0000bb;">aaa</span><span style="color: #007700;">()?{?<br>echo?</span><span style="color: #dd0000;">'创建文件'</span><span style="color: #007700;">;?<br>if(</span><span style="color: #0000bb;">$ttt?</span><span style="color: #007700;">=?</span><span style="color: #0000bb;">fopen</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'D:/web_root/tx.txt'</span><span style="color: #007700;">,</span><span style="color: #dd0000;">"w+"</span><span style="color: #007700;">))</span><span style="color: #0000bb;">  </span><span style="color: #ff8000;">//此处要用绝对路径,用相对路径即无效。原因请看后面的解释?<br></span><span style="color: #007700;">{?<br></span><span style="color: #0000bb;">fwrite</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$ttt</span><span style="color: #007700;">,</span><span style="color: #dd0000;">'you?are?write?after?exit'</span><span style="color: #007700;">);?<br></span><span style="color: #0000bb;">fclose</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$ttt</span><span style="color: #007700;">);?<br>}?<br>}?<br><br></span><span style="color: #0000bb;">register_shutdown_function</span><span style="color: #007700;">(</span><span style="color: #dd0000;">'aaa'</span><span style="color: #007700;">);</span><span style="color: #0000bb;">  </span><span style="color: #ff8000;">//?函数名称无需带括号,用引号包住即可。 当本页面所有语句都执行完成,或者超时时aa函数。?<br></span><span style="color: #007700;">exit();?<br></span><span style="color: #0000bb;">?></span></span>

register_shutdown_function 执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就没有什么相对路 径可言。

注意:register_shutdown_function 是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。
可以这样理解调用条件:
1、当页面被用户强制停止时

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

3、当PHP代码执行完成时

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn