ホームページ  >  記事  >  バックエンド開発  >  PHPスクリプトの停止コールバック関数

PHPスクリプトの停止コールバック関数

WBOY
WBOYオリジナル
2016-06-13 13:06:451238ブラウズ

PHPスクリプト終了コールバック関数

スクリプトは頻繁に機能しなくなるため、致命的なエラーや空白のページをユーザーに表示したくありません (display_errors がオフに設定されている場合)。 PHP は ? register_shutdown_function という関数を使用して、実行がシャットダウンされたとき、つまりスクリプトの実行が完了したとき、または予期せず終了して PHP の実行がシャットダウンされたときに呼び出すことができる別の関数を設定できます。したがって、スクリプトの先頭で変数を false に設定し、スクリプトの最後で true に設定する方法を使用して、PHP にコールバック関数を閉じさせて、スクリプトが呼び出されるかどうかを確認できます。変数がまだ false の場合は、スクリプトの最後の行が実行されなかったことがわかります。そのため、ユーザーに適切なフィードバックを提供する方法の非常に基本的な例を用意しました。致命的なエラーを表示する必要がある場合は、致命的なエラーの表示をオフにすることで、例の見栄えを良くすることができます (注釈: display_errors と error_reporting を設定できます)。

<span style="color: #000000;"><span style="color: #0000bb;"><?php?<code><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?=?

false;?関数?

shutdown_func

(){?

グローバル?

$clean

;?

if?(!

$clean

){?die("not?a?clean?shutdown"

);?

}?return?false

;?}?register_shutdown_function("shutdown_func");?$a?=?1;?$a?=?new?FooClass();?// は致命的になりますエラーで失敗しました$clean?=?true;??> ご覧のとおり、shutdown コールバック関数の実行時に clean 変数が true に設定されていない場合、shutdown_func 関数は (グローバル変数を使用せずに) クラスにパッケージ化できます。 ? ? ? PHP には register_shutdown_function() 関数が用意されており、スクリプトが終了する前に登録された関数、つまり PHP プログラムの実行後に実行される関数をコールバックできます。 php プログラマーステーション

例:
<span style="color: #000000;"><!DOCTYPE?html?PUBLIC?"-//W3C//DTD? XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">?<code><span style="color: #000000;"><!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">?<br><html?xmlns="http://www.w3.org/1999/xhtml">?<br><head>?<br><meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312"?/>?<br><title>register_shutdown_function示例</title>?<br></head>?<br><body>?<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><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></body>?<br></html></span>??

?

register_shutdown_function の例?

?

?

$starttime<🎜>=<🎜>microtime<🎜>(<🎜>true<🎜>);?<🎜><🎜> www<🎜>.<🎜>phperz<🎜>.<🎜>com?<🎜><🎜>関数?<🎜 >テスト<🎜>(){?<🎜><🎜>$starttime<🎜>=<🎜>マイクロタイム<🎜> (<🎜>true<🎜>);????<🎜>if(!<🎜>file_exists<🎜>(<🎜>'Test.txt'<🎜>< span style="color: #007700;">)){?????<🎜>// 判断如果文件不存在!!?<🎜><🎜> $Str?<🎜>=?<🎜>fopen<🎜 >(<🎜>'Test.txt'<🎜>, <🎜>"w+"<🎜>);?????????<🎜><🎜>< span style="color: #0000bb;">fwrite<🎜>(<🎜>$Str<🎜>,<🎜>'我是在最后写进来的.time间:$starttime'<🎜>);?<🎜><🎜>fclose<🎜>(<🎜>$Str<🎜>);?<🎜>echo?<🎜>"创建完了!作成時間:<🎜>$starttime<🎜>"<🎜>;?<🎜>}?<🎜>else?{?<🎜>//如果存在;?<🎜><🎜>エコー?<🎜>'文件已经存在'<🎜>;?<🎜>}? <🎜>}?<🎜><🎜>register_shutdown_function<🎜>(<🎜>'テスト'<🎜>);?<🎜>echo?<🎜>"程序开始: "<🎜>.<🎜>$starttime<🎜>。 <🎜>"
"<🎜>;?<🎜>phperz<🎜>~<🎜>com?<🎜><🎜><🎜>for(<🎜>$i<🎜>=<🎜>0<🎜>;<🎜>$i<🎜><<🎜>1000<🎜>;<🎜>$i<🎜>++){?<🎜>エコー?<🎜>"エコー< ;br/>";?}?終了;??>?? ? ?

register_shutdown_function の機能は、このページのすべてのスクリプトが実行された後に実行される関数を指定することです。
<span style="color: #000000;"><span style="color: #0000bb;"><?php?<code><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>

関数?

aaa

()?{?

echo?
'ファイルの作成'
;?

if(

$ttt?

=?

fopen

('D:/web_root/tx.txt',

"w+"
)) //ここでは絶対パスを使用する必要があります。相対パスは無効になります。理由については、以下の説明をご覧ください?{?fwrite($ttt, 'you?are?write?after?exit');?fclose($ttt);?}?}?register_shutdown_function('aaa'); //?関数名には括弧は必要なく、引用符を使用するだけです。 aa 関数は、このページのすべてのステートメントが実行されるかタイムアウトするときに使用されます。 ?exit();??> register_shutdown_function 実行メカニズムは次のとおりです: PHP は呼び出される関数をメモリに転送します。この関数は、ページ上のすべての PHP ステートメントが実行されたときに再度呼び出されます。現時点では、PHP ページからではなくメモリから呼び出されるため、PHP は元のページが存在しないとすでに想定しているため、上記の例では相対パスを使用できないことに注意してください。相対パスはまったくありません。 注: register_shutdown_function は、すべての PHP ステートメントが実行された後に関数を呼び出すことを意味します。クライアントがストリーミング ブラウザー ページを閉じるときに関数を呼び出すとは理解しないでください。 呼び出し条件は次のように理解できます: 1. ユーザーによってページが強制停止されたとき 2. プログラムコードがタイムアウトした場合 3. PHP コードの実行が完了したら
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。