1

私は小さなPHP認証ライブラリを書いています(「自分で書かないでください」と言ってください。私は以前にこれをやったことがあります)。私のライブラリの一部として、場合によっては実行を「中止」できるようにしたいと考えています。

たとえば、次の例を見てください。

<html>
<head></head>
<body>
<?php
  $auth=... 
  $auth.RequiresInGroup("admin");
?>
</body>
</html>

私がやりたいRequiresInGroupことは、基本的に、ユーザーがログインしているかどうかを確認することです(Cookieなどを見て)..ログインしていないか、そのグループに属していない場合は、401エラーを返信してサーバーを実行する必要があります-side 許可されていないページへのリダイレクト。

<?php..これを機能させるためにステートメントを少し上に移動できることはわかってい<html>ますが、考えられるすべてのユースケース (貧弱なコード設計を含む) をカバーしようとしています。

基本的に、リクエストが終了するまでクライアントへのコンテンツの送信を保留する方法、または実行中に別の HTTP ヘッダーを送信してスクリプトを終了する同様の方法はありますか?

4

1 に答える 1

2

マニュアルの「制御出力バッファリングセクション」を読む必要がありますhttp://www.php.net/manual/en/ref.outcontrol.php

ヘッダー自体は、出力の最初のビットまで送信されません。その後、応答コードが送信され、その後に設定した顧客ヘッダーが続きます。headers_sent() 関数を使用して送信されたかどうかを確認できます。ただし、一度設定したヘッダーを実際にキャンセルすることはできません。

したがって、送信する必要があるものをバッファリングし、アプリケーションの最後にバッファを吐き出します。


編集:これを行う別の方法(そして、私が好む方法は、グローバルまたはシングルトンクラスに依存していますが、どちらも眉をひそめる可能性があります)は、独自の「出力」クラスを作成することです。それをグローバル(またはシングルトン)として設定し、それに出力を追加します。次に、ヘッダーを意のままに送信し、実行の最後に出力をポンピングできます。ob_functions ほど「単体テストに適した」ものではありませんが、デバッグと制御が容易です。

于 2012-07-01T02:33:58.053 に答える