it-swarm.it

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

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 di codice locale di sviluppo) e www.example.com (o solo esempio.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:[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;

}
?>

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?

80
geerlingguy

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.

66
Berdir

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

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

Come bonus aggiuntivo puoi quindi avere diverse cartelle files per ciascun sito e puoi aggiungere qualsiasi modulo di sviluppo a sites/dev.example.com/modules anche.

25
Paul Jones

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

10
ack

Tendo a impostare sempre voci e file DNS o Host

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

6

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.

5
Kevin

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']}";

Ciò consente a più sviluppatori di eseguire le attività localmente e puoi spingere verso la gestione temporanea/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.

2

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 un condizionale 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 STFU PHP operatore .

0