Dev (Back & Front)ARTIGO

Perl e hospedagem compartilhada

Minha linguagem é a CPAN, o resto é sintaxe.
— Audrey Tang

Quem desenvolve em Perl necessariamente utiliza muitos módulos da CPAN, o programador Perl atualmente não usa mais simplesmente o CGI.pm, mas usa frameworks como o Catalyst, o Jifty e o Mojolicious, que não são incluídos na distribuição padrão do Perl, não são módulos core. Isso significa que o desenvolvedor precisa instalá-los utilizando o console da CPAN.

Diferente do PHP, muitos módulos Perl utilizam código nativo, fazendo ligações para bibliotecas nativas em C, como a libxml ou o imagemagick. Sendo assim, deixa de ser viável simplesmente copiar os arquivos para o diretório de FTP do servidor e tudo funcionar. É claro que isso significa que um conjunto muito maior de funcionalidades com uma performance muito mais interessante estarão disponíveis para o programador.

Quando você tem um servidor dedicado de hospedagem, ou um Virtual Private Server, esse problema é bastante simples de resolver, uma vez que você tem acesso de administrador na máquina e pode instalar os módulos no Sistema Operacional. No entanto, quando você tem uma hospedagem compartilhada, esse não é o caso. Normalmente isso implicaria em você precisar solicitar à equipe do provedor a instalação dos módulos em questão, o que por vezes poderia significar semanas de espera, e, ainda assim, o provedor por vezes iria se recusar a instalar.

Felizmente existe uma solução definitiva para esse problema, existe um módulo Perl que possibilita a você criar uma imagem local com todos os módulos. Esse módulo é o local::lib. Com ele, será gerado um diretório com todos os arquivos, incluindo os arquivos compilados para código nativo, de forma que você possa simplesmente copiar para o ambiente de produção, apontar o interpretador para esses diretórios e tudo irá funcionar.

Existe uma observação importante, no entanto. Como um conjunto significativo de módulos depende de compilação para código nativo, configura-se uma relação de dependência binária.

Quando o compilador C transforma o seu código em código-nativo, existe uma convenção para as chamadas de função, e além da Application Programming Interface, gera-se também a Application Binary Interface. O que isso significa é que, por mais que a assinatura de um método não tenha alterado, uma eventual mudança em uma estrutura interna de uma struct significa que o código que usa aquela biblioteca precisa ser recompilado. Em teoria, o desenvolvedor da biblioteca vai cuidar do versionamento utilizando versões “major” e “minor” de forma que isso não represente um problema. No entanto, muitas vezes acontece de uma mudança sutil passar desapercebida por esse versionamento de forma que se não houver a compilação específica para aquela versão, você pode enfrentar o indesejado Segmentation Fault.

O significado prático dessa observação é que é necessário construir a árvore local na mesma versão e na mesma arquitetura do mesmo sistema operacional do servidor. Dessa forma, você estará protegido contra uma série de falhas de segmentação que poderiam ocorrer no caso de não satisfazer as dependências binárias. Para você saber qual o sistema operacional do servidor de hospedagem compartilhada, existem algumas opções (no caso de servidor Linux, com acesso a console):

  • Digite “uname -m” para ver a arquitetura. i686, i386, x86 significam a plataforma intel de 32 bits. x86_64, amd64 significam a plataforma amd de 64 bits (mais comum hoje em dia).
  • Para saber a versão do sistema operacional, digite “lsb_release -a”.

Se você não tem acesso de console, é necessário consultar o suporte do provedor para obter essa informação. Se o provedor não quiser informar, troque de provedor. Uma vez que você tem essa informação, o ideal é você criar uma máquina virtual nova, sem nenhum software instalado utilizando exatamente a mesma versão do mesmo sistema operacional na mesma arquitetura. Dessa forma, você vai garantir que todas as dependências serão instaladas.

Nessa máquina virtual você precisa ter o ambiente de compilação instalado, para que você possa compilar os módulos. Em uma máquina baseada em Debian, recomendo fazer o seguinte (como root):

apt-get install build-essential libmysqlclient-dev libpq-dev libxml2-dev libdb-dev unzip

Isso vai instalar na máquina os cabeçalhos de algumas bibliotecas que serão necessárias. Mas fique atento para outras dependências no caso de você utilizar outros módulos.

Com isso feito, agora você pode partir para produzir a sua imagem do local::lib. Em primeiro lugar, faça o download indicado no link para dentro da máquina virtual e descompacte. No console, dentro do diretório descompactado, execute (como usuário comum).

$ perl Makefile.PL --bootstrap<br />$ make install<br />$ eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)<br />$ echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >> ~/.bashrc

Esses comandos irão criar um diretório “perl5” dentro do seu home com todas as bibliotecas e as dependências de uma maneira que você poderá simplesmente copiar essa pasta (ou fazer um .tar.gz, ou um .zip com ela) para dentro do servidor. Uma vez feita essa configuração, você pode executar:

$ cpan

Ele irá fazer uma série de perguntas de configuração, os valores padrão serão suficientes para quase todas elas – se você estiver em dúvida, simplesmente deixe o valor padrão. Uma vez terminadas as configurações, ele irá abrir o console da CPAN. Vamos fazer duas configurações para que seja mais fácil de instalar.

cpan> o conf prerequisites_policy follow<br />cpan> o conf build_requires_install_policy yes<br />cpan> o conf commit

Essas configurações farão com que ele deixe de fazer muitas perguntas, e assuma que você quer instalar as dependências todas. Neste momento, então, você pode instalar os módulos que você precisa.

cpan> install DBD::Pg DBD::mysql Task::Kensho

Esse comando irá baixar, compilar, testar e instalar uma série de módulos, incluindo as dependências do Catalyst.

Se você tiver algum problema, pode entrar no PerlMonks, no perl.org.br ou até mesmo no irc.perl.org, canal #brasil-pm e o pessoal vai te ajudar a resolver.

Quando você tiver concluído, basta levar a pasta perl5 para o servidor, e apontar esses diretórios como search path para bibliotecas no seu interpretador. Dessa forma, mesmo que você não tenha acesso de console, vai conseguir botar para rodar a aplicação Perl no ambiente compartilhado.

está na internet desde 1998 e possui mais de 10 anos de experiência em Perl, também fluente em C, Java, PHP e Shell. Participou na arquitetura e desenvolvimento de plataforma de email para mais de 300 mil contas, plataforma para ERP baseada em J2EE, sistema de adwords e processos de ETL nas duas maiores telecoms de Portugal e atualmente atua como consultor independente. É o autor de uma das implementações de Perl 6, Desenvolvedor Debian e contribuidor da CPAN.

Ver perfil