Perl CGI - Szybki start

Perl do chwili obecnej często jest nazywany „klejem łączącym sieć web”, dzięki możliwością przetwarzania tekstu (głównie chodzi o bardzo zaawansowane wyrażenia regularne) bardzo dobrze nadaje się do pisania aplikacji konwertujących dane tekstowe.

Rozpoczęcie przygody z Perlem oraz serwisami internetowymi jest dosyć proste (zakładam, że czytelnik ma jakiekolwiek obycie z systemem Linux - w tym wypadku Debian i coś tam słyszał o Apache).

By móc wykonywać skrypty Perla po stronie serwera należy:

  • Skonfigurować serwer http np. Apache 2 (zakładamy, że moduł CGI jest ładowany automatycznie do apache - isnieje plik: /etc/apache2/mods-enabled/cgi.load)

  • Napisać skrypt CGI oraz go umieścić na serwerze

Konfiguracja wirtualnego hosta

Pliki znajdują się w katalogu /etc/apache2/hosts-enabled/ .

<VirtualHost *:80>

 ServerAdmin admin@host.pl
 DocumentRoot /home/services/service

 ServerName service.0x1fff.com
 ServerSignature Off
 LogLevel warn
 TransferLog /var/log/apache2/cgi_service_access.log
 ErrorLog /var/log/apache2/cgi_service_error.log

 AddHandler cgi-script .cgi .pl

 #ScriptAlias /cgi-bin/ /home/services/service/cgi-bin/
 <Directory "/home/services/service/cgi-bin">
  SetHandler cgi-script
  AllowOverride None
  Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all
 </Directory>

</VirtualHost>

W powyższym przykładzie VirtualHosta należy zmodyfikować odpowiednie dane.

Prosty skrypt CGI

Skrypt ten wykorzystuje kodowanie UTF8, oraz pozwala na proste debugowanie poprzez obserwację logów (żadne błędy nie są widoczne w przeglądarce użytkownika). Dodatkowo skrypt ten wykorzystuje moduły (apt-get install libcgi-perl libcgi-pm-perl):

  • Fatal - pozwala na zmniejszenie ilości sprawdzanych warunków np. przy otwieraniu plików

  • CGI - usprawnia pracę programisty w środowisku WEB np. przetwarzanie argumentów

  • CGI::Debug - ułatwia debugowanie aplikacji sieciowych

  • Funkcje ceil i floor są również imporotwane (zobacz: zaokrąglanie wartośći w Perlu)

#!/usr/bin/perl

use utf8;
use warnings;
use strict;

use Fatal qw{ open close mkdir };
use POSIX qw(ceil floor);    # short url
use CGI;                     # CGI Stuff

# Ten moduł musi być zainstalowany z CPAN :(
# ale do debugowania chyba jest jednym z lepszym
#use CGI::Debug(
# report => [
#  'everything', 'errors',  'empty_body', 'time',
#  'params',     'cookies', 'environment',
# ],
# on => [ 'fatals', 'warnings' ],
# to => {
#  browser => 0,
#  log     => 1,
# },
# #header => 'control',
# set => { error_document => 'html/error.html' },
#);
# jesli nie ma mozliwosci jego instalacji pozostaje CGI::Carp;

# Global variables:
my $page = new CGI;
$page->charset('utf-8');
$CGI::POST_MAX = 1024 * 5000;

# Jeśli nie ma moduły CGI sami musimy zadbać o Content-Type.
# Ponizsze dwie linie dokonują przekierowania na mój blog.
#print "Content-type: text/plain\n";
#print "Location: http://blog.0x1fff.com/\n\n";

# wypisz całą sekcję head
print $page->header;

print '<table>';
foreach my $var (sort(keys(%ENV))) {
    my $val = $ENV{$var};
    $val =~ s|\n|\\n|g;
    $val =~ s|"|\\"|g;
    print "<tr><td>".${var}."</td><td>".${val}."</td></tr>\n";
}
print '</table>';

my $test = $query->param("test");
print $page->escapeHTML($test);

Skrypt ten należy umieścić w pliku: /home/services/service/cgi-bin/test.pl.

Strona wygenerowana przez skrypt może być znaleziona pod adresem:

http://service.0x1fff.com/cgi-bin/test.pl (oczywiście po odpowiednich modyfikacjach).

Często podczas tworzenia aplikacji przydaje się zmodyfikować plik /etc/hosts żeby od razu móc działać „pod właściwym adresem”. Ale to każdy powinien już sobie sam zrobić.

Frameworki ułatwiające pisanie skryptów CGI w Perlu

  • Catalyst - obecnie najpopularniejszy framework do tworzenia aplikacji sieciowych (model MVC)

  • CGI - jeden ze starszych modułów pomagający pisać aplikacje sieciowych

Jak można inaczej generować dynamiczne strony w Perlu?

Co ciekawe CGI to nie tylko Perl - ale także C, C++, Bash i wiele innych języków.

Comments

comments powered by Disqus