www.cesky-hosting.cz
PHP skripty
- Open_basedir restrikce
- Nahrávání souborů na server pomocí PHP
- Odesílání e-mailu z PHP
- Zobrazení chybových zpráv
- HTTP autentizace
- Locales
Open_basedir restrikce
Aplikace v jednotlivých subdoménách jsou uzavřeny do svého adresáře open_basedir restrikcí. To znamená, že standardně není možné pracovat se soubory z jiné subdomény na stejné doméně (třeba funkcemi pro includování souborů, pro práci se soubory či obrázky apod.), ale pouze se soubory v prostoru subdomény, ze které je spouštěn příslušný skript.
Na požádání je možné restrikci pro konkrétní subdoménu o jednu adresářovou úroveň posunout.
Nahrávání souborů na server pomocí PHP
Po nahrání pomocí metody POST je soubor uložen do systémového dočasného adresáře. Na serverech s PHP 4 není z důvodu restrikce přístupu (viz. open_basedir restrikce) možné k souboru přímo přistupovat (například funkcí copy(), funkcemi pro práci s obrázky apod.). Proto je nejdříve nutné použít PHP funkci move_uploaded_file(), která soubor přesune z dočasného adresáře do nového umístění do prostoru Vaší domény, kde se souborem již budete moci pracovat. Funkce má dva parametry - jméno nahrávaného souboru v dočasném adresáři a cestu, do které bude soubor uložen. Na serverech s PHP 5 je přímý přístup do dočasného adresáře možný, nicméně pro získání nahraného souboru doporučujeme i zde používat stejný postup.
Jednoduchý příklad použití funkce move_uploaded_file:
<? move_uploaded_file($_FILES["muj_soubor"]["tmp_name"],"./nahrane_soubory/novy_soubor"); ?>
Funkce nahraje soubor odeslaný z formulářového pole muj_soubor do adresáře nahrane_soubory a uloží jej jako soubor s názvem novy_soubor. Adresář, do kterého je soubor zapisován, musí mít správně nastaveno právo zápisu a spouštění (viz článek nápovědy Přístupová práva a vlastníci souborů). Pokud budete u nahraného a přesunutého souboru potřebovat následně změnit oprávnění, použijte funkci chmod().
Další informace a příklady naleznete na php.net v nápovědě funkce move_uploaded_file(), související funkce is_uploaded_file() a v kapitole Zpracování uploadu souborů.
Odesílání e-mailu z PHP
Při odesílání e-mailu z PHP funkcí mail() je dobré dodržovat jednoduché zásady:
-
používat všechny doporučené hlavičky (viz. příklad) - toto je důležité zejména pro správné vracení odpovědí a nedoručitelných zpráv (není-li uvedena žádná z hlaviček From či Return-Path, bude doplněna výchozí adresa
php@ceskyhosting.cz, zprávy z této schránky nejsou klientům k dispozici) - hlavičky ukončovat znakem LF (čili \n) a nikoliv znaky CRLF (\r\n)
Následuje příklad na odeslání textového e-mailu z adresy moje@example.net na adresu jeho@example.com:
<?
//definice hlavicek
$headers = "From: moje@example.net\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/plain; charset=iso-8859-2\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$headers .= "Return-Path: moje@example.net\n";
//samotne odeslani
mail('jeho@example.com', 'Predmet zpravy', 'Obsah zpravy', $headers);
?>
Používáte-li v odesílaných zprávách znaky s diakritikou, měl by být text příslusně zakódován (pomocí quoted-printable nebo base64). Při posílání více zpráv najednou dbejte na to, aby odesíláním nebyli omezeni ostatní uživatelé sdíleného hostingu. Řešením je posílat zpravy po menšich množstvích ve více cyklech (rozumné množství je maximálně cca 200 odeslaných zpráv za hodinu).
Zobrazení chybových zpráv
Na produkčních serverech není povoleno vypisování chybových hlášení. Na server umisťujte vždy již odladěné aplikace. Pokud potřebujete zobrazovat chyby PHP, použijte například funkci set_error_handler(). Následující příklad zobrazí v prohlížeči chybu - použití neinicializované proměnné:
<?
error_reporting(E_ALL); // nastavi uroven reportovani
function obsluha_chyb($errno, $errmsg, $filename, $linenum, $vars) {
if (error_reporting()) {
// pokud je nastavena nenulova uroven reportovani - pred funkci neni znak @
echo $filename.' :: '.$linenum.' :: '.$errmsg.'<br />';
}
}
set_error_handler("obsluha_chyb");
if ($tohle) {print "neco";}
// v tomto miste pouzivame neinicializovanou promennou -
// - vyvola vzhledem k nastavene urovni reportovani chybu
?>
Toto řešení samozřejmě nepomůže k odhalení kritických chyb, nicméně ty by aplikace umisťovaná na produkční systém neměla obsahovat. Pokud se problému přesto nebudete moci dopátrat, můžeme na požádání na dané (sub)doméně dočasně vypisování chyb povolit.
HTTP autentizace
Nastavení HTTP autentizace můžete provést v klientské sekci (Domény a hosting- Správa domény - Webserver). Autentizaci je také možné zajistit pomocí PHP skriptu. Zde je jednoduchý příklad:
<?
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']) &&
$_SERVER['PHP_AUTH_USER'] == 'uzivatel' && $_SERVER['PHP_AUTH_PW'] == 'heslo') { // vse v poradku
echo 'Prihlaseni probehlo uspesne.';
}
else { // chyba prihlaseni
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Login"');
echo 'Chyba prihlaseni - zadejte platne uzivatelske jmeno a heslo!';
exit;
}
?>
Na serverech s PHP 5 nejsou z důvodu jiného zavedení PHP do webserveru přístupné proměnné $_SERVER['PHP_AUTH_USER'] a $_SERVER['PHP_AUTH_PW']. Přihlašovací údaje jsou uloženy v proměnné $_SERVER['REMOTE_USER'] ve formátu popisovaném v RFC 2617. Tedy jako řetězec "Basic base64-user-pass", kde base64-user-pass je v base64 zakódovaný text uživatel:heslo. Aby fungoval výše uvedený skript i zde, stačí před něj umístit například tento převodní kód a požádat zákaznickou podporu o změnu konfigurace dané (sub)domény:
<?
$remote_user = base64_decode(str_replace('Basic ', '', $_SERVER['REMOTE_USER'])); // vrati retezec jmeno:heslo
$password = strstr($remote_user, ':'); // vrati retezec :heslo, nebo false (nebylo-li nic zadano)
if($password !== false) {
$_SERVER['PHP_AUTH_PW'] = substr($password, 1); // ziska heslo
$_SERVER['PHP_AUTH_USER'] = ereg_replace($password.'$', '', $remote_user); // ziska jmeno
}
?>
Locales
- Seznam locales, které je možné použít.
- Seznam locales s detaily (kódování atd.).
- Testovací stránka locales.
Příklad použití locales:
<? setlocale( LC_TIME, 'cs_CZ' ); echo strftime( "Dnes je: %A " ); ?>
+420 777 811 029
podpora@cesky-hosting.cz


