0

例外をスローする PHP スクリプトがあります (サーバーに接続できないなど)。開発の場ではできるだけ多くの情報を画面に表示したいと思っていますが、制作の段階ではゲームを手放したくありません。しかし、両方の環境で動作し、さらにコードを開発できるコードが必要です。

これを達成するための規定のテクニックはありますか?

編集

はい、PHP で apache を使用します

しかし、コードベースを変更せずに本番環境と開発環境を区別する方法。

4

3 に答える 3

1

通常、これには環境変数を使用して対処します。起動時にロードする構成ファイル .php (または .ini、.yml、.xml、構成ファイルに使用するもの) にすることができ、環境固有の値を持ちます。たとえば、運用サーバーでは、環境構成ファイルは次のようになります。

$config['environment'] = 'production';

もう 1 つのオプションは、Web サーバーが提供する環境変数を使用することです。どちらのアプローチも問題ありませんが、私は前者を好みます。

次に、 「ユニバーサルエラーキャッチャー」を使用して、キャッチされていないすべての例外をキャッチします(また、エラーを例外に変換します。エラーを無効にすると、開発中に迷惑になる可能性があり、エラーを有効にしてそれらをキャッチしないと、本番環境で大きなセキュリティホールになる可能性があります)。これは試していませんが、良さそうです。以前は自分で書いたものを使用していましたが、非常にトリッキーでした。学習目的以外で独自のキャッチャーを作成することはお勧めしません)。次に、次のようにします。

if($config['environment'] == 'production') {
    echo 'Oops, something went wrong';
} else {
    // print full backtrace and stuff
}

補足として、これは「フレームワーク」が解決するはずの問題のようなものです。Silex または Symfony 2 を使用する場合、この機能はデフォルトで利用可能です。

于 2012-07-15T07:22:04.023 に答える
0

ユーザーフレンドリーな方法で例外を処理するカスタム例外クラスを作成できます。

class MyCoolException extends Exception
{
  //Throw exceptions in a friendly way.
  //Perhaps redirect them to a custom error page?

  public function __construct( $error )
  {
    //do whatever with your error data
  }

  public function redirect()
  {
  }
}

次に、それを受け入れるように try/catch パターンをセットアップします。

try
{
}
catch( MyCoolException $e )
{
}
catch( Exception $e )
{
}

別の回答が言うように、環境構成に基づいて例外をスローするフローを指示できます。

于 2012-07-15T07:37:45.570 に答える
0

PHP を使用するもっと簡単な方法があります。set_exception_handler() http://php.net/manual/en/function.set-exception-handler.phpを使用します。

この関数が行うことは、例外がスローされるたびに、常に特定の関数を呼び出すことです。この機能を使用して、現在の環境を確認し、それに応じて行動することができます。

ただし、スクリプトがどの環境にあるかをスクリプトに伝える必要があります。そのために、ChocoDeveloper が答えで言ったことに同意します。

例えば:

<?php
function custom_exception_handler_function($exception) {
  global $config;
  if ($config['environment'] == 'production') {
    continue;
  } else {
    throw $exception;
  }
}

set_exception_handler('custom_exception_handler_function');
?>

このようにして、キャッチされていないすべての例外 (つまり、try-catch ブロックに含まれていない例外) が一様に処理されます。

于 2012-07-15T07:51:10.070 に答える