Rumah  >  Artikel  >  pembangunan bahagian belakang  >  php 脚本停止回调函数

php 脚本停止回调函数

WBOY
WBOYasal
2016-06-13 13:06:451210semak imbas

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代码执行完成时

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn