2017-01-18 9 views
1

私はいくつかのanswers on object destruction orderを見てきましたが、すべての順序が保証されていないことを指摘しています。私は順序を制御することができないので、私はすべてのオブジェクトが破壊された後に関数を呼び出すと思います。すべてのオブジェクトが破棄された後にPHP関数を呼び出す

register_shutdown_functionは、オブジェクト破壊の前に呼び出されるため、オプションではありません。私はオブジェクトを使用してset_error_handlerのようなトリックを見てきたので、 "遅く"呼び出されますが、それだけでは十分ではありません。

この問題の背景は、complex CMSです。ルート(ビュー)レイヤーには数十のファイルがあります。共通のブートインクルードがありますが、シャットダウン時には共通のものはありません。私は共通の継承された基本クラスを介してAPCuオブジェクトキャッシュを使用しており、オブジェクトがパージされていることを確認する必要があります。ページの読み込み中に作成された同じオブジェクトの任意の2つのインスタンスに対して、自分自身をパージすることができ、もう1つは自分自身をキャッシュすることができます。明らかにパージは他のすべてよりも優先されるので、グローバルなキャッシュキーセットでapc_deleteを呼び出すと、すべての__destruct()のパージが完了します。

+1

興味深い問題です。 「ページロード中に作成された同じオブジェクトの任意の2つのインスタンスに対して、それ自体をパージしたいと思うかもしれないし、もう1つはキャッシュすることがデザイン上の欠陥のように思えるかもしれません。オブジェクトのすべてのインスタンスを常に最新のものにしたいとは思わないでしょうか?私はあなたのキャッシング/ローディング層がこれを処理すると思います。 (私は具体的にbitweaverについて何も知らない。) –

+1

こんにちはマット、デザインの欠陥コメントは私に考えさせてくれました。あなたは正しいです、そして、今私はちょうどキャッシュにオブジェクトを格納しようとする前に、削除されたリストをチェックします。より適切な解決策ですが、可能ならばPHPで最後の "最後の呼び出し"関数を実行する方法を知りたいです。 – Stickley

答えて

3

私が上記のコメントで述べたように、複数のオブジェクトインスタンスの混在した状態は、設計上の欠陥のように聞こえます。私はあなたが常にオブジェクトのすべてのインスタンスを最新のものにしたいと思っています。そうでなければ少なくともキャッシュに触れないようにしてください。あなたのキャッシングやオブジェクトローディングレイヤーがこれを処理できると思います。


は、あなたの基本的な質問に答えるために、私は a script to test PHP's shutdown sequenceを書いた:

<?php /* Adapted from https://evertpot.com/160/ */ 

    ob_start(
     function($buffer) { 
      return $buffer . "output buffer flushed\n"; 
     } 
    ); 

    $empty = function() { 
     return true; 
    }; 

    $close = function() { 
     echo "session close\n"; 
     return true; 
    }; 

    $write = function() { 
     echo "session write\n"; 
     return true; 
    }; 

    session_set_save_handler($empty, $close, $empty, $write, $empty, $empty); 
    session_start(); 

    register_shutdown_function(
     function() { 
      echo "register_shutdown_function\n"; 
     } 
    ); 

    class MyClass { 
     function __destruct() { 
      echo "object destructor\n"; 
     } 
    } 
    $myObject = new MyClass; 

出力:

register_shutdown_function 
object destructor 
output buffer flushed 
session write 
session close 

それは近い出力バッファリングとセッションの書き込み/のフラッシュが2ヶ所場所がされているようですあなたはあなたのオブジェクトのすべてが破壊されたことを知っています。 (これはまた、あなた自身がシャットダウン機能として登録できる新しい形式のsession_set_save_handlerを使用していないことを前提としています)。

+0

これは素晴らしいことです。 session_closeハンドラは完璧です。 – Stickley

0

__destruct()関数の関数を呼び出そうとしましたか? PHPはすべてのオブジェクトを破棄した後にこの関数を呼び出します。

関連する問題