2011-01-24 8 views
12

C'è un modo per verificare se stiamo eseguendo uno script PHP su localhost - server di sviluppo o su server live - server di produzione? C'è qualche costante, variabile, funzione PHP, ecc. Che può darmi queste informazioni.Come possiamo verificare se stiamo eseguendo lo script PHP su localhost?

Ho bisogno di questo per inserire impostazioni diverse per server di produzione e sviluppo. Ora analizzo l'URL per vedere quale è, ma mi chiedevo se ci fosse un modo migliore per farlo. La mia preoccupazione è che possiamo cambiare l'URL dello script e questo potrebbe rovinare il mio assegno.

Sto cercando poche soluzioni con un file di configurazione e una condizione IF in base a cui definirò diverse impostazioni. L'unico problema è che non voglio modificare l'istruzione IF quando ci sono cambiamenti nelle impostazioni del server come hostname, root_doc o qualcos'altro che sto usando per identificare l'host locale/remoto.

E desidera aggiornare SVN da un'unica fonte senza modificare nulla sul mio server di produzione.

E mi piacerebbe idealmente essere in grado di eseguire e lavori CRON con queste impostazioni.

+1

L'ambiente di testing locale (host) utilizza lo stesso hostname dell'ambiente di produzione? –

+0

stai usando un framework in cui hai una posizione di configurazione condensata? – jondavidjohn

+0

@jondavidjohn no –

risposta

17

Io uso il SetEnv nella mia definizione di host per individuare su quale ambiente sto facendo funzionare (Dev, Palcoscenico, Produzione):

<VirtualHost *:80> 
(all the host info) 
SetEnv SERVER_CONTEXT "dev" 
</VirtualHost> 

E ogni file di configurazione come una parola in più in esso: config.dev. ini, config.stage.ini, config.prod.ini, etc, ... Funziona come un incantesimo.

+2

Che dire se si sta eseguendo un LAVORO CRON. Non v'è alcun VirtualHost –

+1

Assumendo un sistema Unix, vorrei impostare una variabile d'ambiente (percorso ubuntu, potrebbe essere diversa su altri sistemi Unix): sudo vim/etc/environment Aggiungere PHP_SERVER_CONTEXT = "dev" in PHP: getenv ("PHP_SERVER_CONTEXT"); Controlla il tuo file php.ini CLI adesso se PHP_ è il prefisso (dovrebbe essere) su safe_mode_allowed_env_vars – Mikushi

+0

buon suggerimento; Ho appena inserito la variabile nella riga di comando, ad es. 'ENVIRONMENT = dev php foo.php', dato che potrei eseguire cose per più ambienti sullo stesso server, ma il tuo approccio è probabilmente più semplice per la maggior parte delle configurazioni. –

4

Utilizzare un file di configurazione di includere con una definizione in essa

define("DEBUG",true); //set to false for live 

e l'uso che nel codice, ad esempio:

if(DEBUG){} 
+0

Dovrei cambiarlo quando corro in produzione :(non è la soluzione –

+0

ci dovrebbero essere un paio di differenze comunque, come il tuo db, ecc ecc, quindi questa è la soluzione più elegante – Nanne

+0

Non ci sono differenze –

2

Il server non ha idea di quale ambiente è meno che non si dica a. Quello che faccio è usare DEFINE per impostare l'ambiente. Il mio codice applicazione è lo stesso su ogni istanza, ma i miei file di configurazione cambiano. In questo modo puoi usare il file .htaccess includendo i file di configurazione su ogni script e controllare quali sono le impostazioni.

2

Puoi provare a utilizzare il global $ _SERVER ['SERVER_NAME']: http://www.php.net/manual/en/reserved.variables.server.php Questo dovrebbe dirti il ​​nome host del sistema su cui è in esecuzione lo script. È possibile utilizzare questo per determinare quali impostazioni utilizzare (a seconda del sistema).

Non so che questo genererà "localhost" e potrebbe essere necessario conoscere il nome host effettivo del computer di sviluppo.

+0

Cosa succede se il nome dell'host viene cambiato, dovrò cambiare in tutte le applicazioni? Sto cercando di evitarlo –

+0

Sì - Se il nome host cambia, dovrai aggiornarlo. È sfortunato ma vero. Un'altra cosa che può essere d'aiuto è se tieni due versioni differenti di configurazione n file. Avere una versione sulla macchina di produzione e la tua sulla tua. Supponendo che tu abbia un qualche tipo di controllo di versione, semplicemente non controllare la tua versione. Ciò aiuterebbe a tenerli isolati. –

1

faccio sempre "config.php" wich includo ad altri file php ...

Contiene qualcosa di simile (file casa):

$CONFIG['server']="dev"; 
$CONFIG['db_user']="root"; 

e cosa del genere ... così a casa ho questo uno là e al server in cui sito è in esecuzione ho un altro wich io non aggiornare se non modifiche ad esso ...

così via assistente ho qualcosa di simile:

$CONFIG['server']="prod"; 
$CONFIG['db_user']="lwu9918_admin"; 

e poi in altri file PHP:

include("config.php"); 
if($CONFIG['server']=="dev"){echo "Development";} 

cosa del genere!

5

Ho impostato una variabile di ambiente nella configurazione di Apache e controllo. Questo ha il vantaggio di usare un file di configurazione PHP che tutto il codice dell'applicazione rimane esattamente lo stesso su PROD, TEST, DEV ecc; non c'è bisogno di andare e apportare modifiche dopo un check-out, in quanto il codice richiama semplicemente la configurazione da Apache.

Per dimostrare, quanto segue può essere impostata nella configurazione VirtualHost

SetEnv ENVIRONMENT PROD 

Nel codice PHP, è possibile quindi controllare l'ambiente con

$env = getenv('ENVIRONMENT'); 

Se si sente il bisogno di fare questo disponibile ovunque, è quindi possibile utilizzare define, ma non lo trovo necessario (utilizzo l'ambiente specificato per caricare i file di configurazione appropriati e creare una configurazione Singleton di sola lettura, che viene quindi utilizzata per controllare qualsiasi opzione di configurazione; er del codice di tipo if ($env == 'PROD') {}, poiché tutta la logica è nella configurazione, non nel codice).

+0

Che dire se si sta eseguendo un LAVORO CRON. Non c'è la configurazione di VirtualHost –

+1

Ancora più semplice, il prefisso del tuo script è "ENVIRONMENT = PROD php foo.php". Questo definisce anche una variabile d'ambiente usando bash, e viene prelevata esattamente con lo stesso codice PHP, quindi non sono richieste modifiche nel codice dell'applicazione. –

+0

Funziona con la CLI di Windows? –

2

So che questa parola può sembrare strana per lo sviluppatore PHP, ma hai considerato build del tuo progetto?

In PHP non c'è nulla da compilare, tuttavia la modifica dei file copiati è una delle funzionalità di qualsiasi processo di compilazione. È possibile specificare 2 target: produzione e dev. Non ci sarebbe bisogno di alcun condizionale, che dovrebbe funzionare o funzionare, ma in alcune circostanze non sarà.

+0

Questo suona come quello che faccio. Per ogni progetto che richiede più ambienti, fornisco uno strumento che genera le impostazioni in una posizione prevedibile che verrà letta dalla mia applicazione. L'applicazione stessa non sa a quale ambiente è distribuita. – Chris

0

Sul server di dev

* * * * * php -r cronjob.php this_is_dev 

Sul server di produzione

* * * * * php -r cronjob.php this_is_live 

Nello script

switch ($argv[1]) 
    case 'this_is_dev': 
    // load your dev configuration 
    break; 

    case 'this_is_live': 
    // load your live configuration 
    break; 

    default: 
    die('invalid server'); 
    break; 
} 

poiché si intende per cronjob, il è esiste

buona fortuna con Windows :(

10
if($_SERVER["REMOTE_ADDR"]=="127.0.0.1"){ 
$local = True; 
}else{ 

    $local = False; 
} 

EDIT

Si potrebbe anche verificare la prima parte dell'indirizzo e vedere se il server è nella rete locale, il nuovo supponendo che il server non sarà essere nella rete locale in produzione

+0

Non è necessario che il server di sviluppo si trovi sulla mia macchina. –

+0

No, non è ... tuttavia è uno degli scenari più comuni, ed è quello che facciamo nella mia azienda. – armonge

0

è meglio mettere il programma cli esecuzione all'esterno di directory www, ad esempio

c: \ iIS \ www è la directory html pubblico

il file cli deve essere messo sotto c: \ iis invece