Fondamentalement, l'une des plus grandes questions de tous les temps: comment utilisez-vous settings.php dans votre flux de travail de développement/mise en scène?
À l'heure actuelle, mon fichier settings.php est configuré comme suit, et je base mon développement sur la directive $ Host du serveur, ce qui signifie que je peux travailler sur dev.example.com pour le serveur de développement (partagé), local.example. com pour mon ordinateur local (et les vérifications de code local d'autres développeurs), et www.example.com (ou simplement example.com) pour le site en direct.
(Ce code se trouve dans la section "Paramètres de la base de données" de settings.php):
$Host = $_SERVER['HTTP_Host'];
$base_url = 'http://'.$Host;
$cookie_domain = $Host;
switch($Host) {
case 'example.com': # Production server
$db_url = 'mysqli://prod_sql_user:[email protected]/prod_db';
$update_free_access = FALSE;
$conf = array (
// Set production config options here...
'example_setting' => 0,
);
break;
case 'dev.example.com': # Development server
$db_url = 'mysqli://dev_sql_user:[email protected]/dev_db';
$update_free_access = FALSE;
$conf = array (
// Set production config options here...
'example_setting' => 0,
);
break;
case 'local.example.com': # Local server
$db_url = 'mysqli://local_sql_user:[email protected]/local_db';
$update_free_access = FALSE;
$conf = array (
// Set production config options here...
'example_setting' => 0,
// Turn off most core caching.
'cache_inc' => 'includes/cache.inc',
'cache' => CACHE_DISABLED,
);
break;
}
?>
Cela fonctionne assez bien dans la plupart des cas, mais cela signifie que nous avons beaucoup de code superflu dans notre fichier settings.php partagé ... y a-t-il une meilleure façon?
Ce que je fais, c'est séparer ce fichier en settings.php et local.settings.php.
À la fin de settings.php se trouve le code suivant:
if (file_exists(dirname(__FILE__) . '/local.settings.php')) {
include dirname(__FILE__) . '/local.settings.php';
}
Le fichier local est ensuite exclu de tout VCS que vous utilisez. L'avantage est que vous pouvez mettre des paramètres qui sont communs à toutes les instances dans settings.php et les faire versionner/distribuer automatiquement et conserver les éléments locaux dans local.settings.php.
Il semble que vous réinventiez la fonctionnalité multisite intégrée de Drupal.
Personnellement, je conserve tous les thèmes et modules standard du site dans sites/all
, puis avoir sites/dev.example.com
et sites/example.com
.
En prime, vous pouvez alors avoir différents dossiers files
pour chaque site, et vous pouvez ajouter n'importe quel module de développement à sites/dev.example.com/modules
ainsi que.
Je préfère ignorer le fichier localement (en utilisant un .gitignore
fichier dans git), puis conservez des versions distinctes si le fichier est sur chaque hôte.
J'ai tendance à toujours configurer des entrées de fichier DNS ou hôte et à utiliser
dev.example.com
staging.example.com
et
example.com
Ensuite, j'ai des répertoires de fichiers de paramètres complètement séparés avec des répertoires de fichiers différents. Par exemple ./sites/dev.example.com/files
Pourquoi ne pas avoir quelques dossiers basés sur le nom d'hôte de développement?
Exemple
Chacun avec son propre fichier de paramètres et db_url.
Si les seules choses qui changent sont les informations d'identification de la base de données, vous pouvez définir des variables d'environnement dans votre configuration d'hôte virtuel local (et de transfert/production) ou dans un .htaccess un dossier au-dessus de votre racine Web. Voici un exemple simple:
/var/www/example.com/drupal-resides-here
Je peux ensuite créer un fichier .htaccess ici:
/var/www/example.com/.htaccess
qui a le code suivant:
SetEnv DB1_USER my_local_user
SetEnv DB1_PASS my_local_pass
SetEnv DB1_Host my_local_Host
SetEnv DB1_NAME my_local_dbname
Puis dans /var/www/example.com/drupal-resides-here/sites/default/settings.php
(ou autre), vous pouvez récupérer les informations d'identification de la base de données comme:
$db_url = "mysql://{$_SERVER['DB1_USER']}:{$_SERVER['DB1_PASS']}@{$_SERVER['DB1_Host']}:{$_SERVER['DB1_PORT']}/{$_SERVER['DB1_NAME']}";
Cela permet à plusieurs développeurs d'exécuter des choses localement et vous pouvez pousser vers la mise en scène/production tout en continuant à suivre settings.php (il y a plus de choses que juste les informations d'identification de la base de données ...). Vous n'auriez pas non plus à garder une trace de plusieurs fichiers settings.php.
La solution la plus simple et la plus efficace qui n'est qu'une seule ligne est la suivante. Il suffit de l'inclure dans la dernière ligne de votre fichier settings.php:
@include('settings.local.php');
Le symbole @ à l'avant signifie simplement qu'il n'affiche aucune erreur même s'il ne trouve pas ce fichier. Les configurations typiques comme celle-ci impliquent une conditionnelle pour vérifier si le fichier est là. Cela l'accomplit en une seule ligne sans lui.
http://php.net/manual/en/language.operators.errorcontrol.php
Également connu sous le nom STFU PHP .