Konfigurace v závislosti na stroji

Školení, která pořádám

V mnoha skriptech jsem už viděl kód podobný tomuto:

<?php
if ($_SERVER["SERVER_NAME"] == "localhost") {
    // používá se při vývoji
    mysql_connect("localhost", "root", "");
    mysql_select_db("projekt");
} else {
    // používá se v ostrém provozu
    mysql_connect("localhost", "franta", "12345");
    mysql_select_db("franta");
}
?>

Dalším řešením, které sice nepatrně zvýší výkon, ale naopak znesnadní přenos souborů, je:

<?php
// odkomentovat při vývoji
mysql_connect("localhost", "root", "");
mysql_select_db("projekt");

// odkomentovat v ostrém provozu
//~ mysql_connect("localhost", "franta", "12345");
//~ mysql_select_db("franta");
?>

Zdaleka nejlepší mi přijde na vývojovém stroji používat stejnou databázi a stejného uživatele s heslem, který se používá v ostrém provozu, a v kódu nechat jedinou variantu.

Problém tak zůstává pouze v případě, kdy se skript připojuje k databázi na jiném stroji. Řešit to např. editací souboru /etc/hosts bych spíše nedoporučoval, protože po čase bych na to určitě zapomněl a říkal bych si: „Jak to, že tabulka neexistuje, vždyť na tom stroji, ke kterému se připojuji, bezpochyby je.“

Jakub Vrána, Dobře míněné rady, 4.1.2006, diskuse: 18 (nové: 0)

Diskuse

DJ.Maca:

Ja to teda mam tak, ze to mam konstanty samostatnem souboru. Z  neho taham udaje o nastaveni pripojeni. Myslim, ze je to nejlepsi zpusob. Staci jen prehrat jeden soubor.

Lucien144:

Taky mi to prijde jako nejlepsi reseni. V souboru config.php mam ulozene konstanty pro ten konkretni stroj... Clovek si jen musi davat pozor, aby tento soubor neprepsal configem, ktery pouziva u sebe na localu.

JKa:

Taky to používám, ale problém je, pokud si ten konfigurák chceš verzovat přes CVS. Synchronizovat to s locahostem je pak docela těžký a zrovna se s tím potýkám :-)

Vaclav:

Prosim vas, a kdyz si nastavuju root pro odkazy, pres konstantu, takhle:
<?php
// Generate path
if ($_SERVER['SERVER_NAME'] == 'localhost') {
    define('ROOT', '/www.example.com/');
}
else {
    define('ROOT', '/');
}
?>
Je to v poradku? Da se to nastavit nejak lepe, napr. tak ze i na lokalu bude pro dany projekt root = '/'. Diky.

ikona Jakub Vrána OpenID:

V první řadě musím říct, že mám raději relativní odkazy, kdy root definovat ani nemusíš.

I na svém domácím serveru si můžeš nastavit Virtual Hosty, kdy můžeš mít pro každý projekt vlastní root. Pokud používáš Apache, podívej se na http://httpd.apache.org/docs/2.0/mod/core.html#virtualhost. Také bude nutný zásah do souboru etc/hosts, pod Windows v adresáři \Windows\System32\drivers\etc.

Vaclav:

Jasne, dik, ale nekde jsem slysel ze relativni odkazy (ne vsude), muzou vadit pri optimalizaci pro vyhledavace. Chtel bych se zbavit te konstanty ROOT, a pouzivat normalne v celem webu lomitko, jenomze v Apache mam root nastav o uroven vys.

ikona Jakub Vrána OpenID:

To, že by relativní odkazy škodily SEO, je nesmysl.

Apache jde nastavit tak, aby jednotlivé projekty začínaly v /. Jak na to se dozvíš v dokumentaci, na kterou jsem uvedl odkaz.

Llaik:

Doma ladis na localhostu? Ja pomoci hosts na stejne domene, jako na ostrem serveru... takze to ma hacek :)
co si nastavit spis v Apachovi nejakou promenou prostredi a dotazovat se na ni?

Dalsi ale hooodne prasacka moznost je mit u sebe nejaky soubor "toto_je_vyvoj" a zkouset file_exists().

Pripadne mit nejaky zakladni soubor basic_settings.inc, ktery to bude obsahovat, a ktery nebudes na servery updatovat (v repository muze byt ulozen jako vyvojovy_stroj=false, takze i pokud delas na ostrem treba jen "cvs update", tak to bude slapat)

Filda:

já to teda řeším takhle:
<?php
include 'config_'.strtolower($_SERVER['SERVER_NAME']).'.php';
?>
pak mám na každým stroji na kterým to beží vlastní konfigurák a nikdy se mi nestane, že bych si ho přepsal.

ikona llook:

<?php
$environment
= 'development'; // 'production';

define('ROOT', dirname(__FILE__) . '/');
require(
ROOT . 'config/' . $environment . '.php');
require(
ROOT . 'config/global.php');
?>
Na "localhost" bych nespoléhal. Třeba já tady mám "ll", protože se to rychlejc píše.

ikona dgx:

Lze použít (int) @$_SERVER['SERVER_ADDR'] == 127, tedy pokud IP adresa začíná na 127. Pak je jedno, jak se localhost skutečně jmenuje.

Jakube, docela jsi mě pobavil větou "řešením, které  nepatrně zvýší výkon" :-) Co ho ještě navýšit odstraněním bílého místa a komentářů a zkrácením názvů všech identifikátorů na jednopísmenné? :-) Power rulez

ikona Jakub Vrána OpenID:

Víš dobře, že nejsem příznivce pokusů o zvyšování výkonu touto cestou. Snažil jsem se to formulovat tak, že i přes nepatrnou výhodu, kterou v tom někdo může vidět, má to řešení i zjevnou nevýhodu.

Mitr:

Nevím jestli je možné se na IP adresu spolehnout na 100%.
Jáka bude vlastně adresa, když budete tento skript spouštět CRONem ?

ikona spaze:

To záleží, jestli to bude jako CLI, nebo jako normálně přes HTTP. Pokud přes CLI, tak nejspíš nebude žádná, pokud přes HTTP, tak _stejná_.

Patrik:

Přidám "do placu" naše řešení...
<?php
$devconfig
= getenv( 'DEVCONFIG' );
switch (
$devconfig ) {
    default:
        $db_host = "mysql.projekt.com";
        $db_login = "uzivatel";
        $db_pass = "heslo";
        $db_name = "databaze";
        break;
    case 'franta':
        $db_host = "localhost";
        $db_login = "frantik";
        $db_pass = "frantofoheslo";
        $db_name = "databaze";
        break;
    case 'tonda':
        $db_host = "localhost";
        $db_login = "root";
        $db_pass = "";
        $db_name = "databaze";
        break;
}
?>
...stačí nastavit na každém stroji, kde se na projektu pracuje proměnnou prostředí (u nás DEVCONFIG) a ve scriptech zapsat údaje pro každý takový stroj.

Není pak nutné mít více konfiguračních souborů a nezáleží přes jakou adresu projekt testujete.

Mitr:

Pokud si chci ale něco doma otestovat přesně a chci si na chvili nastavit přesně stejnou domenu jako je na internetu (protože toho využívám ve skriptech ...) a přitom se připojit k databázi na localhostu tak by to dopadlo špatně, proto používám např.:
<?php
if ($_ENV["COMPUTERNAME"]=='abcdefgh')
{
   // localhost
}
else
{
   // server
}
?>
Mám tím zaručeno skoro na 100%, že mi to nikdy neselže ;-)

pif:

u me byl problem slozijtesi. Chtel jsem mit vyvojovych prosteredi vice. Localhost, testovaci verzi na nejake domene a ostra varianta na dalsi domene.

Nakonec beru z nazvu HTTP_HOST pozadovany skript (bud xml, nebo php config) pojmenovnay podle toho jaky nazev jsem si k dane domene v configu priradil.

Mise:

Taky prihodim 'nase reseni'.
Pri vyvoji softwaru pro vicero zakazniku nebo koneckoncu i pro jednoho, kdyz je vyvojove prostredi jinde nez primo u nej (to jest vzdy), neni dobre mit pristupy do databazi tak, aby do toho mohli zakaznici/programatori strkat nos. Jako nejlepsi reseni nam vyslo mit v cvs pouze config.php.SAMPLE, kde je nejake neskodne pseudonastaveni a pro konkretni instalace vytvaret config.php, ktery pak uz nic nepripisuje. V cvsku neni, pri kopirovani k zakaznikovi se nezabali do tgz, takze rozbalena adresarova struktura muze vklidu premaznout predchozi verzi a config zustane zachovanej. Po update se pak musi udelat diff mezi config.php a aktualnim config.php.SAMPLE (u slozitejsich configu/projektu vedeme changelog). Kdyz se cvsko nepouziva, je potreba jen vynechat config.php pri 'balickovani'.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.