Přeskočit na hlavní obsah

Nejdůležitější konfigurační direktivy PHP

Dneska se mě ve škole na semináři tázal jeden student, jakou bych doporučoval optimální konfiguraci PHP. Na to samozřejmě neexistuje žádná jednoznačná správná odpověď. Hodně parametrů je závislých na konkrétní aplikaci. Co je někde klíčovou výhodou, může jinde škodit. U některých direktiv se ale myslím dá říci, které jejich nastavení je nejvhodnější.

Vhodnost či nevhodnost různých nastavení posuzuji zejména s ohledem na bezpečnost, přenositelnost aplikace mezi servery a budoucí vývoj PHP. Osobně vždy preferuji striktnější nastavení. Člověka to pak nutí psát čistě a s respektem k většině potenciálních problémů s přenositelností aplikace.

Můj původní záměr sepsat zde krátký stručně okomentovaný souhrn základních direktiv se ukázal být nereálným. Nakonec to vypadá tak na šest dílů. Pro dnešek tedy první várka, pojďme na to.

short_open_tag, asp_tags

Jakékoliv jiné otevření skriptu mimo preferované <?php omezuje přenositelnost aplikace. Při vývoji proto mějte obě direktivy zakázané. Nedovolí vám to pak používat žádné věci typu <? nebo <?= nebo dokonce <%. I na ostrém serveru považuji za lepší mít z obdobného důvodu obě direktivy vypnuté.

Nicméně v zájmu přenositelnosti je vhodné aplikaci jednou za čas otestovat i se zapnutým short_open_tag pro případ jejího provozu na obdobně konfigurovaném serveru, vychytáte tak například různé potenciální kolize s XML deklaracemi. Typický případ, který dělá problém, je skript začínající nějak takto:

<?xml version="1.0" encoding="utf-8"?>

PHP parser pak hází chybu, protože se při zapnutém short_open_tag snaží interpretovat vnitřek XML deklarace. Jedním z nejelegantnějších řešení je použít následující malý trik s prázdným PHP blokem:

<<?php ?>?xml version="1.0" encoding="utf-8"?>

date.timezone

Dlouho chybějící direktiva zavedená až v PHP 5.1.0, leč i poté stále často opomíjená. Nastavuje časové pásmo pro všechny date/time funkce. Její nastavení je důležité proto, aby vám všechny tyto funkce vracely správné hodnoty. Pokud ji nenastavíte, tak zmiňované funkce budou zarputile vyhazovat E_NOTICE či E_STRICT. Typické nastavení pro naši českou kotlinu je 'Europe/Prague'.

Místo definice v php.ini můžete přímo ve svém kódu na začátku aplikace použít funkci date_default_timezone_set(). Rozhodnutí, kde časové pásmo nastavovat, závisí na charakteru konkrétní aplikace. V různých případech se může hodit to či ono či dokonce kombinace obého.

Komentáře

  1. optimální konfigurace je podle mě výchozí konfigurace PHP 5.2 a date.tiemzone je potřeba samozřejmě nastavit. Ale kvůli čemu bych brutálně vraždil php vývojáře je safe_mode = on

  2. [1] Pokud jsem to, Techi, správně pochopil, tak Tebe by za vypnutý safe_mode brutálně vraždili administrátoři, kteří mají na starosti zabezpečení serveru :) V Safe Mode je sice třeba pár věcí obejít složitější cestou, ale myslím, že se to rozhodně vyplatí.

  3. [2] zapnutý Safe_mode nadělá podstatně více problémů, než když je vypnutý a je správně nastaven open_base_dir. To je direktiva, která imho brzo nahradí safe_mode. Safe_mode je bastl o kterém ani samotní vývojáři php přesně nevědí jak se v různých situacích zachová. Menší zlo je safe_mode_gid, ale i tak to stojí za prd

  4. BTW máte tu asi nejaké rozbité Texy! : )

  5. Dobře zabezpečit server lze i se safe_mode = off. Jak zmínil LesTR, stačí, když admin není úplný blb. To že se ta direktiva dostala do PHP byl obrovský omyl. Taky by měl být tento omyl v PHP 6 odstraněn

  6. Takle by to šlo taky:
    print „< ?xml version=\"1.0\" encoding=\"utf-8\"?>„;

  7. Pouzivam to tak isto len s apostrofmi :D
    echo print ';