Diferenças entre hospedar PHP em Windows e Linux

Linux x Windows

Diferenças entre hospedar PHP em Windows e Linux

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Já se perguntou se existe alguma diferença entre Windows e Linux no que diz respeito ao desenvolvimento de aplicações PHP? Uma pergunta que ouço com frequência é “posso desenvolver aplicações no Windows e hospedar no Linux?”. É uma dúvida comum porque muitos desenvolvedores, pelo fato de terem receio de lidar com um sistema operacional desconhecido, acabam optando por hospedagens que rodam o mesmo SO que suas máquinas locais.

Resolvi escrever esse artigo para ajudar a esclarecer um pouco mais a diferença entre os dois tipos de hospedagem. Importante: quando me refiro a Linux, não estou falando somente dele, mas de todos os sistemas Unix-Like, como Mac OSX, FreeBSD, OpenSolaris etc.

Linux ou Windows?

Muitos programadores, principalmente iniciantes, têm um pouco de receio de optar por uma hospedagem Linux, ainda mais quando utilizam Windows, seja por medo de não saber resolver problemas no servidor ou por puro desconhecimento mesmo.

O fato é que, como programador, é pouco provável que você seja responsável direto pela manutenção do servidor, o que torna na maioria das vezes a escolha do sistema operacional praticamente irrelevante (se levar em consideração apenas o “colocar a aplicação online”). Agora você pode estar se perguntando o seguinte: “Se não faz diferença, por que eu não posso escolher qualquer um”? A resposta mais simples e rápida é custos.

A maioria das distribuições Linux não possuem custo de licenças, ou seja, você não precisa pagar para poder utilizá-las. Isso, de certa forma, reduz os custos de quem mantém o servidor, podendo resultar em valores mais acessíveis para quem contrata os serviços (mas nem sempre). Também creio que é importante ressaltar o quesito “segurança”. A probabilidade de um servidor Linux ser infectado com um vírus ou malware é muito menor do que em um servidor Windows.

Na minha modesta opinião, o único motivo que você teria para escolher uma hospedagem Windows é no caso de utilizar tecnologias da Microsoft, como .NET, Access e FrontPage. Caso você vá administrar o servidor, terá também acesso à interface gráfica do Windows.

Posso desenvolver no Windows e hospedar no Linux? Ou vice-versa?

A resposta é sim! Porém, você deve estar muito atento a alguns detalhes que irei listar a seguir. A maioria deles diz respeito ao sistema de arquivos. É preciso que você esteja ciente disso.

Sistema de arquivos

Os sistemas de arquivos, estruturas em que os dados ficam armazenados no sistema, se comportam de maneiras diferentes no Windows e no Linux. Sugiro que você sempre desenvolva tendo em mente um ambiente Linux, pois ele possui um maior número de especificadas.

Uma das primeiras coisas a notar é a questão das permissões de arquivos. No Linux o sistema de permissões é diferente do Windows. As permissões são alteradas com o comando chmod e são formadas, geralmente, por 3 números que indicam a relação com o dono do arquivo, o grupo e os outros usuários. Os arquivos podem ter permissão de escrita, leitura e execução, em qualquer combinação e a maneira como irão se comportar depende diretamente dessas permissões. Quando você executar alguns comandos específicos ou precisar manipular ou realizar leitura de arquivos, poderá esbarrar em problemas de permissão. Para entender um pouco mais, recomendo este artigo de Renato Amadeu no iMasters.

Outra coisa que também é bastante diferente no Linux e que você pode não estar acostumado é o fato do sistema de arquivos ser case-sensitive, ou seja, ele diferencia maiúsculas e minúsculas. Isso é uma das coisas mais importantes de todas, pois muitos arquivos e diretórios possuem nuances em suas letras, principalmente arquivos de classes que costumam iniciar com letras maiúsculas. Isso quer dizer que “Classe” será diferente de “classe” e pode acabar levando a um problema de arquivo não encontrado.

Também existe a diferença dos separadores de diretório. Enquanto nos sistemas Unix-like utiliza-se a barra (/) para separar os diretórios, no Windows o caractere utilizado é a contrabarra (\). É imprescindível estar atento a isso, até porque no Linux a contrabarra cumpre um papel diferente (escapar caracteres). Para resolver esse problema de maneira simples, existe uma constante pré-definida no PHP chamada DIRECTORY_SEPARATOR. Ela irá retornar o caracter de separação de diretórios adequada ao sistema operacional que está rodando a aplicação.

Relacionado a diretórios, existe também a separação de caminhos, quando você precisa especificar mais de um diretório na mesma string (/primeiro/diretorio:/segundo/diretorio). No Linux isso é feito com o caractere : e no Windows com ;. A constante que referencia esse caractere é PATH_SEPARATOR, disponível a partir do PHP 4.3.0.

Linha de comando

Por questões óbvias, a maneira como a linha de comando funciona também muda entre os sistemas operacionais. Isso irá influenciar diretamente no modo como você desenvolve seus scripts de longa duração e como envia comandos ao terminal por meio de funções como exec().

Comandos enviados para o terminal no Linux são executados diretamente no bash, com o usuário que está rodando o servidor web. No Windows o comando é rodando com cmd /c seu_comando. Tenha isso em mente quando montar suas rotinas.

Caracteres textuais

A quebra de linha é outro fator que muda de um sistema operacional para outro. Quando você grava arquivos de texto puro e precisa pular de uma linha a outra, pode encontrar dificuldade. No Linux a quebra de linha ocorre com LF (line feed), representada pelo caractere \n. Alguns sistemas mais antigos utilizam CR (carriage return), com o caractere \r. No Windows, isso é feito com uma combinação dos dois CR+LF, ou seja, \r\n.Também existe uma constante pré-definida para retornar a quebra de linha adequada. Chama-se PHP_EOL (end of line) e está disponível desde o PHP 5.0.2.

Utilizando uma VM para testar a aplicação antes do deploy

Se você possuir muitas diferenças entre a máquina de desenvolvimento e a máquina de destino, sugiro que você utilize uma máquina intermediária antes de colocar a aplicação em produção.

Uma maneira simples de fazer isso é utilizando uma VM (Virtual Machine ou Máquina Virtual) que possua exatamente as mesmas configurações que  servidor de produção. Dessa maneira, você não arrisca a aplicação em um ambiente no “mundo real” apenas para testar o seu impacto.

Você também pode utilizar uma sandbox dentro do seu servidor principal, mas não recomendo que faça isso. Melhor deixar as coisas bem separadas.

E então? Qual escolho?

Eu espero, sinceramente, que a essa altura você já tenha informações suficientes para realizar sua escolha. Caso ainda não, creio que seria uma boa ideia pesquisar um pouco mais sobre o assunto no Google.

Se quiser saber minha recomendação para a escolha de um ambiente para hospedar sua aplicação, sugiro Linux por todos os fatos que citei. Mesmo que você queira utilizar um VPS, aprender os comandos do Linux só vão contribuir ainda mais para a sua carreira e desenvolvimento como profissional.

Faltou alguma coisa? Encontrou algum erro? Quer sugerir uma melhoria? Deixe um comentário.

Um abraço a todos e fiquem com Deus.
Rafael Jaques