Diferenças entre hospedar PHP em Windows e Linux

Linux x Windows

Diferenças entre hospedar PHP em Windows e Linux

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

  • Jefferson Romano

    Estou passando por essa fase e todos os passos que você comentou era meu roteiro. Fiquei feliz em perceber que estava indo pelo caminho correto. O problema está na configuração de uma VM com as mesmas configurações do serviço de hospedagem, pois nem sempre é algo fácil e rápido de fazer e configurar. Estou tendo que migrar de um servidor Windows para Linux mas desenvolvendo em um ambiente Windows e um servidor IIS. Bronca hein??!. As dicas sobre separadores de diretórios realmente é algo que nos deparamos nesse processo. Parabéns pelo artigo e pelas recomendações. Já tenho familiaridade com Linux e nesse aspecto só reforço a escolha pela plataforma.

    • Vou ser bem sincero. Quando comecei a programar em PHP, há cerca de 13 anos, eu usava o ambiente Windows/IIS. Algumas configurações eram tão chatas de fazer que eu simplesmente não fazia.
      Com o tempo conheci o Apache e, um pouco mais tarde, resolvi me aventurar no Linux. De lá pra cá, nunca mais toquei no Windows.
      Acredito que se o sistema for projetado desde sua concepção pra rodar em plataformas híbridas, colocá-lo no ar em uma plataforma diferente deva ter muito menos dores de cabeça.
      Quanto à VM, uma boa dica é dar uma passada de olho no phpinfo() do servidor ou ini_get_all() a fim de entender como ele está configurado e passar isso pra VM.

  • Luiz Pereira de Souza Filho

    Uma coisa bem legal, quando falamos em desenvolvimento web e o eterno VS entre Window e Linux, ou IIS e Apache, é usar a benditas (ou malditas) VMs. Deixo a ideia de um projeto muito legal para qualquer tipo de desenvolvedor, que é o Vagrant (https://www.vagrantup.com/). Desde que comecei a usar ele, nem me preocupo mais com ambiente de desenvolvimento. Crio o arquivo de especificação e levanto o ambiente que preciso para testar / simular.

    @rafaeljaques:disqus, não é de hoje que leio e curto muito suas publicações! Muito legal mais esse comparativo! Abraço!

    • E aí Luiz!
      Bom saber que você está gostando das postagens!
      Realmente o Vagrant é uma boa dica pra quem precisa configurar uma VM de maneira rápida e fácil.
      Fica a recomendação!
      Abraços.