Я работаю с двумя серверами приложений на ежедневной основе: одна разработка, одна продукция. В этих блоках живут различные приложения от разных разработчиков, а также некоторые скрипты, которые запускаются через cron. В настоящее время я использую флаг -D
для httpd, чтобы я мог идентифицировать свой производственный сервер в коде, т. Е. isset($_SERVER['DEV'])
. К сожалению, это не работает для сценариев, запущенных из командной строки, поскольку они не находятся под зонтиком Apache.
По сути, я бы хотел, чтобы простой, простой способ определить развитие и производство, доступное для каждой строки кода .
То, что я исключил:
auto_prepend_file
– мы уже используем эту директиву в некоторых приложениях, и вы не можете иметь более одного автозапуска. Что я сейчас изучаю:
Итак, получили ли какие-либо трюки для идентификации dev / prod, которые не включают в себя инъекцию кода в каждый скрипт или приложение?
Просто установите переменную среды. Он работает на Windows и Linux, их даже называют сейчас же. Затем просто проверьте $_ENV["DEVVSPROD"]
Обычно я просто делаю что-то вроде этого:
if ($_SERVER['HTTP_HOST'] == 'localhost') // or any other host { // development } else { // production }
Я закончил использование $_ENV['HOSTNAME']
, с php_uname("n")
в качестве резервной копии:
/** * Returns true if we are working on a development server, determined by server's * hostname. Will generate an error if run on an unknown host. */ public static function isdev() { static $isdev = null; // don't run function body more than once if( null !== $isdev ) { return $isdev; } // prefer HOSTNAME in the environment, which will be set in Apache. // use `uname -n' as a backup. if( isset( $_ENV['HOSTNAME'] ) ) { $hostname = $_ENV['HOSTNAME']; } else { $hostname = php_uname("n"); } switch( $hostname ) { case 'production1.example.com': case 'production2.example.com': case 'production3.example.com': $isdev = false; break; case 'dev1.example.com': case 'dev2': case 'dev2.example.com': $isdev = true; break; default: trigger_error( 'HOSTNAME is set to an unknown value', E_USER_ERROR ); } return $isdev; }
Это пришло мне в голову
if(filter_var(ini_get('display_errors'), FILTER_VALIDATE_BOOLEAN)) { // development } else { // production }
или лучший подход
define('IN_DEVELOPEMENT', filter_var(ini_get('display_errors'), FILTER_VALIDATE_BOOLEAN));
Компания, с которой я работал ранее, использовала соглашение о суффиксных серверах следующим образом:
Это позволяет определить среду, над которой вы работаете, как внутри, так и снаружи Apache, довольно тривиальна.