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.“
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.
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.
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.
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.
<?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.
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
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 ?
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 ;-)
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'.
Diskuse je zrušena z důvodu spamu.