Suggerimenti per settings.php - Sviluppo locale, server di sviluppo, server live


80

Fondamentalmente, una delle più grandi domande di tutti i tempi: quali sono alcuni modi in cui usi settings.php nel tuo flusso di lavoro di sviluppo / gestione temporanea?

In questo momento, ho il mio file settings.php impostato come segue e baso il mio sviluppo sulla direttiva $ HOST del server, il che significa che posso lavorare su dev.example.com per il server di sviluppo (condiviso), local.example. com per il mio computer locale (e altri checkout del codice locale di sviluppo) e www.example.com (o solo example.com) per il sito live.

(Questo codice si trova nella sezione "Impostazioni database" di 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:password@127.0.0.1/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:password@127.0.0.1/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:password@127.0.0.1/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;

}
?>

Funziona abbastanza bene per la maggior parte degli scopi, ma significa che abbiamo un sacco di codice estraneo nel nostro file settings.php condiviso ... c'è un modo migliore?


Dovresti usare la soluzione multi-sito Drupal drupal.org/node/290768
sobi3ch,

Risposte:


66

Quello che faccio è separare quel file in settings.php e local.settings.php.

Alla fine di settings.php è il seguente codice:

if (file_exists(dirname(__FILE__) . '/local.settings.php')) {
  include dirname(__FILE__) . '/local.settings.php';
}

Il file locale viene quindi escluso da qualsiasi VCS in uso. Il vantaggio è che puoi inserire impostazioni comuni a tutte le istanze in settings.php e avere quelle versioni / distribuite automaticamente e mantenere le cose locali in local.settings.php.


2
Questa è in realtà la strategia usata su drupal.org stesso e usiamo costantemente su Palantir.net. Per un ciclista, consiglio di usare 'settings.local.php' come nome del file in quanto corrisponde al modello impostato da 'settings.default.php'.
Dave Reid,

1
Ho creato una sintesi per questo: gist.github.com/1235389 da quando lo uso sempre più frequentemente
chrisjlee,

4
Nota: Drupal 8 ha ora aggiunto uno snippet simile al file delle impostazioni per impostazione predefinita, devi solo decommentarlo: drupal.org/node/1118520
Berdir

1
@DaveReid: il modello è impostato da ' default.settings.php ' non da 'settings.default.php'.
iconoclasta

1
Per divertirti puoi usare (__DIR__)invece di dirname(__FILE__). Sono equivalenti .
cdmo,

26

Sembra che tu stia reinventando la funzionalità multisito integrata di Drupal.

Personalmente, conservo tutti i temi e i moduli standard per il sito sites/all, quindi ho sites/dev.example.come sites/example.com.

Come bonus aggiuntivo puoi quindi avere filescartelle diverse per ogni sito e puoi anche aggiungere qualsiasi modulo di sviluppo sites/dev.example.com/modules.


Questo ha un senso, ma ho alcuni siti in cui ci sono già 5-10 cartelle multisito e avere tutti i temi per quei siti in siti / tutti / temi può essere abbastanza fastidioso. Per non parlare del mio uso tipico di custom.module per ogni sito. Immagino di poter usare invece sitename_custom.module: - /
geerlingguy il

2
Puoi sempre provare a utilizzare i collegamenti simbolici da sites/dev.example.com/modulesasites/example.com/modules
Paul Jones

Accettare questa risposta - Proverò questo sul sito su cui sto attualmente lavorando. Sembra adatto al mio flusso di lavoro.
geerlingguy,

9
Penso che questo sia in realtà un modo scadente per gestire ambienti di sviluppo e di gestione temporanea perché in realtà non sono siti diversi / separati, solo versioni diverse dello stesso sito. In questo caso vorresti evitare di avere file separati per ogni sito. Consiglio vivamente di utilizzare il metodo indicato di seguito in cui settings.php è versionato e le impostazioni specifiche per ciascun sito (impostazioni DB) sono inserite in un local.settings.php che non ha versioni.
Mikey P

1
@Mikey P - entrambe le soluzioni sono valide — penso che dipenda principalmente dalle preferenze personali / di squadra qui ... ci sono compromessi con entrambi gli approcci, secondo me.
geerlingguy,

10

Preferisco ignorare il file localmente (usando un .gitignorefile in git) e quindi mantenere versioni separate se il file su ciascun host.


1
Questa è una soluzione interessante, anche se mi piace tenere traccia di settings.php in git (alcuni bug che ho riscontrato sono dovuti a modifiche di setting.php ...). C'è un modo in cui il mio checkout git locale può sostituire quel file con il mio (oltre a farmi copiare nel mio file)?
geerlingguy,

1
Questo è quello che faccio anche io. I file con dati di configurazione, in particolare con le credenziali del database, non hanno spazio nel VCS.
mmartinov

@geerlingguy sì, puoi. Si prega di leggere il mio aggiornamento (se sarà pubblicato;)
sobi3ch,

@martin Sono d'accordo, ma non dimentichiamoci che possiamo avere SPECIAL repository separati solo per QUESTO file! Puoi leggerlo nel mio aggiornamento.
sobi3ch,

7

Tendo a impostare sempre DNS e voci di file host e utilizzare

dev.example.com
staging.example.com

e

example.com

Quindi ho directory di file di impostazioni completamente separate con directory di file diversi. Ad esempio ./sites/dev.example.com/files


Il problema che vedo con questo approccio è che spesso ho una directory / themes / e / modules / che uso per ogni sito (spesso in una configurazione multisito), e poiché ho bisogno di usare quei moduli e temi specifici del sito per locale , sviluppo e produzione, non posso semplicemente fare host /
siti multipli in

Buon punto. Immagino di aver lasciato fuori il collegamento simbolico di quella roba.
Stewart Robinson

In questo modo è possibile creare un collegamento simbolico e condividere cartelle di temi e moduli. Quindi in pratica la tua cartella principale sarà una cartella di produzione e da lì potrai creare un link simbolico per stage, dev e local.
Gansbrest,

5

Perché non avere alcune cartelle in base al nome host di sviluppo?

Esempio

  • siti / dev1.domain.com
  • siti / dev2.domain.com
  • siti / dev3.domain.com
  • siti / www.domain.com

Ognuno con il proprio file di impostazioni e db_url.


Potenziale problema: i file salvati / caricati in una cartella del sito non saranno accessibili a un'altra.
Greg

Vedi la mia risposta a @Stewart :)
geerlingguy il

Crea collegamenti simbolici alla cartella dei file centrali
Kevin

2

Se le uniche cose che cambiano sono le credenziali del database, è possibile impostare le variabili di ambiente nella configurazione dell'host virtuale locale (e di gestione temporanea / produzione) o in un .htaccess una cartella sopra la radice Web. Ecco un semplice esempio:

/var/www/example.com/drupal-resides-here

Posso quindi creare un file .htaccess qui:

/var/www/example.com/.htaccess

che ha il seguente codice:

SetEnv DB1_USER my_local_user
SetEnv DB1_PASS my_local_pass
SetEnv DB1_HOST my_local_host
SetEnv DB1_NAME my_local_dbname

Quindi in /var/www/example.com/drupal-resides-here/sites/default/settings.php(o qualsiasi altra cosa) puoi prendere le credenziali del db come:

$db_url = "mysql://{$_SERVER['DB1_USER']}:{$_SERVER['DB1_PASS']}@{$_SERVER['DB1_HOST']}:{$_SERVER['DB1_PORT']}/{$_SERVER['DB1_NAME']}";

Questo consente a più sviluppatori di eseguire le cose localmente e puoi spingere alla messa in scena / produzione pur continuando a tracciare settings.php (ci sono più cose là dentro solo le credenziali del database ...). Inoltre non dovresti tenere traccia di più file settings.php.


Personalmente penso che questo sia il modo migliore per andare. Tuttavia, nel nostro setup aggiungiamo le istruzioni SetEnv alla configurazione di apache. Lo rende un po 'più sicuro.
Scott Joudry,

Questo è un uso interessante per .htaccess e archiviazione variabile. Ma quando corri drush up --y? Ciò sovrascriverà il tuo file .htaccess di base.
Screenack

Questo viene fatto in un .htaccessfile di livello superiore a webroot. Ad esempio, /var/www/.htaccessmemorizza queste direttive e /var/www/drupal/.htaccesssarebbe di Drupal .htaccess. Potresti anche inserirlo nella configurazione dell'host virtuale Apache, che è ancora più bello. Indipendentemente da ciò, abbiamo quasi sempre elementi personalizzati nei webroot .htaccesse quindi se aggiorniamo Drupal dobbiamo confrontare le .htaccessmodifiche con Git.
Charlie Schliesser,

0

La soluzione più semplice ed efficiente che è solo una riga è la seguente. Basta includerlo nell'ultima riga del file settings.php:

@include('settings.local.php');

Il simbolo @ nella parte anteriore significa semplicemente che non viene visualizzato alcun errore anche se non trova quel file. Una configurazione tipica come questa implica una condizione per verificare se il file è presente. Questo lo compie in una riga senza di essa.

http://php.net/manual/en/language.operators.errorcontrol.php

Conosciuto anche come operatore PHP STFU .


Semplice, ma non credo sia il più efficiente. seanmonstar.com/post/909029460/…
AyeshK
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.