2

かなり大規模なサイトをクラシック ASP から PHP に移行することを検討しています。もちろん、潜在的な問題とスピードバンプを最初にすべて調べています。PHP バージョンは、最初は引き続き IIS で動作します。

開発には、ローカルの mySQL サーバーと、localhost.website.com、localhost.cdn.website.com、localhost.api.website.com などのいくつかのローカル ドメインが含まれますが、ライブ システムはそれらのいずれも使用せず、代わりにライブ ドメインのみを使用します。等

現時点では、従来の ASP では、サーバー上にのみ存在するセマフォ ファイルを使用して、システムが "live" と "dev" を切り替えます。これは global.asa で行われ、ファイルの存在に応じて多数のアプリケーション変数が設定されます。

私は特にPHPに精通していませんが、周りを見回してみると、「何も共有しない」原則を運用しているように見え、「アプリケーションスコープ」のものはありません。

コードを変更せずにローカルにアップロードでき、システムが効率的な方法でシステムを自動的に認識する同様の環境をどのように実現できるか疑問に思っています。

4

2 に答える 2

2

過去に、この手法を使用して多くの成功を収めました。

DevLevel.0プロダクションをDevLevel.1表し、ステージングをDevLevel.2表し、開発を表します。PHP のグローバル インクルードで__FILE__マジック定数を調べて、現在の場所を確認し、それDevLevelに応じて定数を設定しました。次に、さまざまな場所で、次のようになります。

if(DevLevel == 0)
  run credit card in live mode;
else
  run credit card in test mode;

しかし、これに関する問題は、私たちがそれを超えてしまったことです。サイトには 2 つのステージング場所と 10 の開発場所があり、微妙な違いがある場合があります。

それ以来、環境を調べ、バージョン管理下にないプロジェクトで Local.php を発行する自動化されたスクリプトを開発しました。非常に柔軟で、1 つのコマンドで任意の環境で apache、nginx、mysql、postgresql、redis、ssl、およびプロジェクト構成を自動生成できます。


しかし、あなたのプロジェクトに戻りましょう。これが私が提案するものです:

/path/to/project/conf/example-local.php
/path/to/project/conf/local.php
/path/to/project/conf/.gitignore (contents: local.php)

(git ignore を、SCM システムが使用する無視メカニズムに置き換えます)

「例」構成を に入れexample-local.phpます。その後、開発者またはリリース エンジニアがそのコピーをチェックアウトするたびに、コピーexample-local.phplocal.phpて微調整するだけで済みます。

アプリケーションには、すべてのスクリプト PERIOD で最初にインクルードされるグローバル インクルード ファイル (global.php など) が必要です。次に local.php をインクルードし、適切な定数が定義され有効であることを確認します。

これは global.php のスニペットです

 <?
 ///////////////////////////////////////////////////////////////////////////////

 define('App_Path', dirname(dirname(__FILE__)));
 define('CORE_PATH', App_Path.'/Web/');

 ini_set("max_execution_time", "0");

 // For the purposes of including pear embedded in the application
 set_include_path(App_Path . '/PHP/pear' . PATH_SEPARATOR . get_include_path() );

 require_once(App_Path . "/AutoConf/Local.php");

 ///////////////////////////////////////////////////////////////////////////////


 // Utility function to assert that a constant has been defined.
 function DefinedOrDie($constant, $message)
 {
   if(! defined($constant))
     die("Constant '$constant' not defined in site configuration. $message");
 }

 // Utility function to check if a constant is defined, and if not, define it.
 function DefinedOrDefault($constant, $default)
 {
   if(! defined($constant))
     define($constant, $default);
 }


 /////////////////////////////////////////////////////////////////////////////////
 // These are the constants which MUST be defined in the AutoConf file

 DefinedOrDie('DevLevel', "DevelopmentLevel.  0=Production, 1=Preview, 2=Devel.");

 if(DevLevel !== 0 && DevLevel !== 1 && DevLevel !== 2)
   die("DevLevel constant must be defined as one of [0, 1, 2].");

 DefinedOrDie('DEFAULT_HOSTNAME', "Canonical hostname of the site.  No trailing slash or leading protocol!");


 DefinedOrDie('DB_HOST', "Database server hostname.");
 DefinedOrDie('DB_NAME', "Database name.");
 DefinedOrDie('DB_USER', "Database login username.");
 DefinedOrDie('DB_PASS', "Database password.");

 if(DevLevel > 0){
   DefinedOrDie('Email_OnlySendIfMatch', "Preg regex email must match to be sent.");
   DefinedOrDie('Email_OverrideAddress', "Email address to send all emails to.");
   DefinedOrDie('Fax_OnlySendIfMatch', "Preg regex fax number must match to be sent.");
   DefinedOrDie('Fax_OverrideNumber', "Fax number to send all faxes to.");
   DefinedOrDie('Text_OnlySendIfMatch', "Preg regex text message must match to be sent.");
   DefinedOrDie('Text_OverrideNumber', "Text number to send all texts to.");
   DefinedOrDie('Phone_OnlySendIfMatch', "Preg regex phone number must match to be sent.");
   DefinedOrDie('Phone_OverrideNumber', "Phone number to place all phone calls to.");

   DefinedOrDefault('PROCESS_BILLING', false);
   DefinedOrDefault('MEMCACHE_ENABLED', false);
 }else{
   DefinedOrDefault('PROCESS_BILLING', true);
   DefinedOrDefault('MEMCACHE_ENABLED', true);
 }

 ///////////////////////////////////////////////////////////////////////////////
 // These are the constants which MAY be defined in the AutoConf file
 // Default settings for live site
 if(DevLevel == 0)
 {
   define('DEVEL', false);
   define('DEVEL_DEBUG', false);
   error_reporting (E_RECOVERABLE_ERROR | E_ERROR | E_PARSE);
   ini_set("display_errors", false);
 }
 // Default settings for preview site
 elseif(DevLevel == 1)
 {
   define('DEVEL', true);
   define('DEVEL_DEBUG', false);
   error_reporting (E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
   ini_set("display_errors", true);
 }
 // Default settings for development and other sites
 else
 {
   // TODO: remove E_DEPRECATED, and take care of all warnings
   define('DEVEL', true);
   define('DEVEL_DEBUG', false);
   error_reporting (E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
   ini_set("display_errors", true);
 }

 // Memcache settings are required, here are defaults
 DefinedOrDefault('MEMCACHE_HOST', 'localhost');
 DefinedOrDefault('MEMCACHE_PORT', '11211');

これは、より複雑な (しかし一致する) local.php の例です。

 <?php

 define('DevLevel', 1);

 define('DB_HOST', 'localhost');
 define('DB_NAME', '*******');
 define('DB_USER', '*******');
 define('DB_PASS', '*******');

 define('DEFAULT_HOSTNAME', '***********');

 define('MEMCACHE_SESSION_HOST', 'localhost');

 //define users who will be notified when different alerts are sent by the system. Separate users with a |
 define('ALERT_LEVEL_NOTICE_SMS', '122342342319');
 define('ALERT_LEVEL_NOTICE_EMAIL', 'j3@example.com');

 define('PROCESS_BILLING', false);

 define('Email_OnlySendIfMatch', '/(appcove.com|example.com)$/');
 define('Email_OverrideAddress', false);

 define('FAXES_LIVE', true); //false to use phaxio's test keys (no faxes are sent)

 function HN_LiveToDev($host){
   return str_replace('.', '--', $host).'.e1.example.net';
 }

 function HN_DevToLive($host){
   $count = 0;
   $host = str_replace('.e1.example.net', '', $host, $count);
   if($count > 0){
     return str_replace('--', '.', $host);
   }else{
     die('URL does not look like a dev URL. Could not translate DevToLive.');
   }
 }
于 2013-01-11T20:23:20.170 に答える
1

私はIISに精通していませんが、Apacheでは、開発ボックスのWebサーバー構成でのみWebサーバーに環境変数を設定させました。次にphpで:

define('DEV', isset($_ENV['my_env_var']));

これは、IO がないため、ファイルをチェックするよりも高速です。また、環境変数がない場合、デフォルトで「ライブ」モードになるという望ましい特性もあります。

$_ENV事前定義された変数です: http://php.net/manual/en/reserved.variables.php

注意 - PHP では、未定義の定数は引用符で囲まれていない文字列として解釈され、ブール型の true に強制されます。定数が常に定義されていることを確認してください。

于 2013-01-11T20:36:28.923 に答える