No artigo Como funcionam as páginas de internet, nós examinamos a página HTML mais simples possível. Ela se parecia com isso:
<html>
<body>
<h1>Olá!</h1>
</body>
</html>
O script CGI mais simples, depois de executado, criaria esta página simples e estática. Veja como este programa CGI seria exibido se você o escrevesse em C:
#include <stdio.h>
int main()
{
printf("Content-type: text/htmlnn");
printf("<html>n");
printf("<body>n");
printf("<h1>Olá!</h1>n");
printf("</body>n");
printf("</html>n");
return 0;
}
No meu servidor web, eu escrevi este programa no arquivo simplest.c e o compilei com a seguinte linha de código
Consulte Como funciona a programação em C para obter mais informações sobre a compilação de programas em C.gcc simples.c -o simplest.cgi
Ao colocar o arquivo simplest.cgi no diretório cgi-bin, ele pode ser executado. Você verá que tudo o que este script faz é gerar uma página que diz "Olá!". O único segmento inesperado é uma linha que diz:
printf("Content-type: text/html\n\n");
A linha "Content-type: text/html\n\n" é um texto especial que deve ser a primeira coisa que um script CGI envia para um navegador. Lembre-se disso e tudo funcionará bem. Se você esquecer deste detalhe, o navegador rejeitará o script.
Você pode fazer a mesma coisa em PERL. Digite este código PERL no arquivo chamado simplest.pl:
#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><h1>Olá mundo!";
print "</h1></body></html>\n";
Copie o arquivo no diretório cgi-bin. Numa máquina rodando UNIX, também é importante digitar:
chmod 755 simplest.pl
Esta linha de código diz para o UNIX que o script é executável. Você pode fazer isso agora, digitando ou clicando no seguinte endereço: http://www.hsw.com.br/cgi-bin/simplest.pl.
Você acabou de aprender os conceitos básicos do script CGI. Um programa é executado e envia informações para o navegador que solicitou o script. As informações normais enviadas para stdout é o que o gets enviou para o navegador.
O objetivo do script CGI é criar conteúdo dinâmico. Toda vez que o script é executado, as informações resultantes são diferentes. Afinal, se as informações geradas fossem iguais toda vez que você executasse o script, seria melhor usar uma página estática. O programa em C a seguir demonstra um conteúdo dinâmico bastante simples:
#include <stdio.h>
int incrementcount()
{
FILE *f;
int i;
f=fopen("count.txt", "r+");
if (!f)
{
sleep(1);
f=fopen("count.txt", "r+");
if (!f)
return -1;
}
fscanf(f, "%d", andi);
i++;
fseek(f,0,SEEK_SET);
fprintf(f, "%d", i);
fclose(f);
return i;
}
int main()
{
printf("Content-type: text/htmln\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>A contagem atual é: ");
printf("%d</h1>\n", incrementcount());
printf("</body>n");
printf("</html>n");
return 0;
}
Usando um editor de texto, copie e cole este código em um arquivo chamado count.c. Compile o arquivo digitando:
gcc count.c -o count.cgi
Crie outro arquivo de texto chamado count.txt e coloque um número zero dentro dele. Ao copiar os arquivos counter.cgi e count.txt para o diretório cgi-bin, você poderá executar o script. Você pode fazer isso agora, digitando ou clicando no seguinte endereço: http://www.hsw.com.br/cgi-bin/simplest.pl. Como você pode ver, tudo o que este script faz é gerar uma página que diz "A contagem atual é: x," onde x aumenta a cada vez que você executa o script. Execute o script diversas vezes e observe como o conteúdo da página muda.
O arquivo count.txt armazena a contagem atual e a função incrementcount() é a função que aumenta a contagem no arquivo count.txt. Esta função abre o arquivo count.txt, lê o número que está lá, aumenta o número e reescreve o arquivo. Na verdade, esta função tenta abrir o arquivo duas vezes. Ela faz isso por precaução, no caso de duas pessoas tentarem acessar o arquivo simultaneamente. Não é uma técnica infalível, mas para algo tão simples até que funciona. Se o arquivo não puder ser aberto na segunda tentativa, o valor de erro retornado ao usuário é -1. Um programa mais sofisticado reconheceria o valor retornado -1 e geraria uma mensagem de erro apropriada.