MVC フレームワークとコントローラーを操作すると、デストラクターでページがレンダリングされます。私はphpを介してファイルをダウンロードしているので、アクションの最後にスクリプトを終了する必要があります。
デストラクタを呼び出さずにスクリプトを終了するには?
より良い解決策はありますか?
exit と die はデストラクタを呼び出します。
MVC フレームワークとコントローラーを操作すると、デストラクターでページがレンダリングされます。私はphpを介してファイルをダウンロードしているので、アクションの最後にスクリプトを終了する必要があります。
デストラクタを呼び出さずにスクリプトを終了するには?
より良い解決策はありますか?
exit と die はデストラクタを呼び出します。
この回答を参照してください。ファイルが実際にブラウザに送信されたかどうかをチェックするファイルをダウンロードするクラスにデストラクタを作成してみてください。送信された場合は、そのデストラクタで exit() を呼び出します。
デビッドが言ったように、それを停止するには、デストラクタ内で exit() を呼び出す必要があります。
ただし、これらのデストラクタによって引き起こされる視覚的な出力を停止したいだけで、他の副作用 (ファイルのクローズ、データベース接続のクローズ) を停止したくない場合は、それ以降の出力を強制終了し、デストラクタをそのままにしておくのが最善です。私の意見では、デストラクタは 1 つの重要な理由である傾向があるため、これが取るべきルートです。それはクリーンアップです。
バッファリングされた出力を操作することでそれを行うことができます:
<?php
class Tester{
public function devNull($string){
return "";
}
public function runAndBreak(){
print "run" . PHP_EOL;
// if any output buffer is working, flush it and close it
if(ob_get_level()) ob_end_flush();
// redirect new buffer to our devNull
ob_start(array($this,'devNull'));
exit();
print "still running";
}
function __destruct(){
print "destructor" . PHP_EOL;
}
}
$t = new Tester();
$t->runAndBreak();
run
これは、デストラクタにあるものではなく、印刷するだけです。これは、出力を処理して返すob_startに独自のコールバック ルーチンを与えることによって行われます。この場合、空の文字列を返すことで単純に破棄します。
This will certainly stop your script but be careful, if you run such a server where one process serves several PHP requests those will stop as well:
$pid = getmypid();
exec("kill $pid");
exec("TSKILL $pid");