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.

Nepoužívejte konkrétní verzi PHP (např. /packages/run.64/php-7.3.2/bin/php-cgi), může být kdykoli bez ohlášení zrušena.

Aktuálně je php-next verze 8.0, zatímco implicitní php je verze 7.3. Dokumentace zpětně nekompatibilních změn:

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říkaz chmod 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říkazem dos2unix 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