Návod k použití PHP na FI
Doporučujeme vám před čtením následujícího textu prostudovat si návod
Uživatelské HTML stránky.
Předpokládáme, že existuje adresář ~/public_html/
se správně nastavenými právy
a funguje vám přístup ke statickým stránkám.
CGI
CGI je jednoduché rozhraní, které lze využít v libovolném programovacím jazyce. V tomto návodu vám ukážeme, jak je využít pro psaní jednoduchých webových aplikací v PHP. Pokud to myslíte s využíváním PHP vážně, tak možná dává větší smysl místo CGI využít FastCGI, které popisujeme níže.
Nejprve vytvoříme adresář pro naši novou aplikaci:
mkdir ~/public_html/php-app
Přepneme se do nového adresáře a do souboru index.php
uložíme testovací aplikaci pro výpis aktuálního času:
cd ~/public_html/php-app
cat > index.php <<'EOF'
#!/packages/run/php/bin/php
<html>
<head><title>Time App</title></head>
<body>
<?php
echo strftime("%H:%M:%S\n");
?>
</body>
</html>
EOF
Jedná se o běžný skript, což v unixových operačních systémech znamená,
že na prvním řádku musí mít za dvojicí znaků #!
cestu k interpretu,
v našem případě /packages/run/php/bin/php
. Aby jej šlo vykonat,
musíme mu ještě nastavit právo spuštění vlastníkem:
chmod u+x index.php
Poznámka: řádek #!/packages/run/php/bin/php
zpravidla není vhodné vkládat do souborů,
které aplikace používá pomocí direktiv include
nebo require
.
Nyní můžete skript vyzkoušet spuštěním z příkazové řádky, na výstup vypíše nějaké HTTP hlavičky a výsledný HTML kód:
./index.php
X-Powered-By: PHP/1.2.3
Content-type: text/html; charset=UTF-8
<html>
<head><title>Time App</title></head>
<body>
16:20:03
</body>
</html>
Nakonec konfiguračním souborem .htaccess
řekneme webovému serveru Apache,
že soubory s koncovkou .php
se mají spouštět jako CGI skripty:
cat > .htaccess <<'EOF'
DirectoryIndex index.php
AddHandler cgi-script .php
AddType application/x-httpd-php .php
EOF
Nyní můžete na adrese https://www.fi.muni.cz/~xlogin/php-app/
ověřit,
že aplikace funguje (xlogin
nahraďte vlastním uživatelským jménem).
FastCGI
Tato alternativa poskytuje větší rychlost, protože na rozdíl od CGI skripty nejsou nově spouštěny při každém požadavku, ale obsluhují jich více. Odpadá tak latence způsobená neustálým spouštěním celého běhového prostředí PHP.
Pokud chcete použít FastCGI, upravte v .htaccess
direktivu AddHandler
:
DirectoryIndex index.php
AddHandler fastcgi-script .php
AddType application/x-httpd-php .php
Upgrady PHP
Jazyk PHP se neustále vyvíjí a staré verze přestávají být podporovány,
proto musíme jednou za čas povýšit na novější, zpravidla zpětně nekompatibilní, verzi.
Abychom vám zjednodušili přípravu na upgrade, je nová verze PHP přístupná
pod názvem /packages/run/php/bin/php-next
.
Pokud chcete novou verzi otestovat, změňte ve svých skriptech první řádek na:
#!/packages/run/php/bin/php-next
Implicitní /packages/run/php/bin/php
následně přepneme na novou verzi,
takže budete moci změnit php-next
zpět na php
.
Aktuálně je php-next
i implicitní php
verze 8.2.
Dokumentace zpětně nekompatibilních změn:
V těchto návodech věnujte zvýšenou pozornost sekci Backward Incompatible Changes!
Jak postupovat v případě problémů
Základním zdrojem bližších informací o chybách jsou logy Apache.
Při ladění chyb je výhodnější použít CGI místo FastCGI. Chybové logy jsou pak přehlednější a změny kódu skriptu se na webu projeví rychleji.
Následují příklady možných chyb v případe neúspěšného spuštění index.php
.
Doporučujeme nejdříve testovat z příkazového řádku:
-bash: ./index.php: Permission denied
PHP skript zřejmě nemá právo spuštění vlastníkem, proveďte příkazchmod u+x index.php
.-bash: ./index.php: /packages/run/php/bin/php^M: bad interpreter: No such file or directory
PHP skript má DOSová ukončení řádků. Na unixová ukončení řádků je možné jej konvertovat příkazemdos2unix index.php
.
Při následném testování spuštění z webu:
End of script output before headers
(v souboru/var/log/httpd-user/xlogin.log
)
Zkontrolujte, zda splňujete podmínky vyžadované funkcí suexec, zejména přístupová práva skriptu. Konkrétní problém bude pravděpodobně zalogován v souboru/var/log/httpd-user/suexec
.
Kódování
Implicitní kódování je nastaveno na UTF-8
, které by aplikace
měly používat jak pro kód programu, tak pro případné HTML soubory.
Ve zvláštních případech můžete v PHP nastavit kódování (např. na ISO-8859-2
)
přidáním tohoto příkazu na začátek programu:
<?php ini_set('default_charset', 'ISO-8859-2'); ?>
HTML souborům lze nastavit kódování v souboru .htaccess
:
AddDefaultCharset ISO-8859-2