Criando um site usando C ++

Isso é possível?


Sim

Eu sei que isso soa estranho e parece mais um exercício de inutilidade, mas não é.
Neste artigo, mostrarei como você pode usar o C ++ no desenvolvimento de sites e apresentarei algumas boas razões para isso.

Não será apenas interessante, mas também útil e muito prático.

Hospedagem


Você provavelmente pensa: uma configuração tão incomum só pode ser implementada em um ambiente especializado. No entanto, esse geralmente não é o caso. Apesar de um servidor especial regular ou virtual ser uma solução ideal para muitos sites (não apenas sites C ++), na maioria dos casos, você pode usar C ++ em serviços de hospedagem compartilhada.
Qualquer hospedagem na web que suporte CGI (isto é, em princípio, tudo) poderá oferecer suporte a um site em C ++. Dependendo do provedor, você pode compilar seu site localmente ou não e precisa do compilador incluído na sua conta. Confira se você planeja editar e compilar via SSH diretamente no servidor da web.

Exemplo simples


Nos exemplos acima, eu uso a conta de hospedagem cPanel. Eles são acessíveis, baratos e consistentes. Mas você pode adaptar esses métodos facilmente a um servidor virtual ou dedicado ou a uma instância do Amazon EC2 com algumas modificações simples na configuração do Apache.

O cPanel nos fornece a pasta cgi-bin, mas não precisamos dela. Na maioria dos casos, qualquer arquivo com a extensão .cgi será processado automaticamente se tiver as permissões corretas (geralmente 0755). Aqui estão os arquivos necessários (certifique-se de usar a TAB no Makefile)

Makefile:

all: g++ -O3 -s hello.cpp -o hello.cgi clean: rm -f hello.cgi 

hello.cpp:

 #include <iostream> #include <string> #include <stdlib.h> using namespace std; void set_content_type(string content_type) { cout << "Content-type: " << content_type << "\r\n\r\n"; } void set_page_title(string title) { cout << "<title>" << title << "</title>\n"; } void h1_text(string text) { cout << text << "\n"; } int main() { set_content_type("text/html"); // Output HTML boilerplate cout << "<!doctype html>\n"; cout << "<html lang=\"en\">\n"; cout << "<head>\n"; set_page_title("Hello, World!"); cout << "</head>\n"; cout << "<body>\n"; h1_text("Hello, World!"); cout << "</body>\n"; cout << "</html>"; return 0; } 

Se você tiver compiladores incluídos em sua conta (talvez seja necessário solicitar à equipe de suporte sua hospedagem na web), basta usar o SSH em sua conta, colocar esses arquivos na pasta public_html e, em seguida, fazer:

 make 

O arquivo hello.cgi será executado. Se você digitar o endereço do arquivo em um navegador, por exemplo, assim:

 http://your-test-site.com/hello.cgi 

Em seguida, substitua your-test-site.com pelo seu nome de domínio ou URL de hospedagem. "Hello World" deve aparecer na tela.

Antes de mergulhar no próprio código, vamos ver como ele funciona em um servidor da web. Quando o Apache aceita a solicitação, a primeira coisa que ele analisa é o manipulador interno ou a regra de reescrita, depois procura no arquivo o arquivo correspondente à solicitação. No nosso caso, ele encontra hello.cgi e o recupera. Nosso programa não aceita entrada, mas apenas exibe a mensagem "Olá, mundo". O Apache então recebe esses dados e os retorna ao usuário.

Falando sobre o código, deve-se mencionar que poderia ser mais fácil. Não foi necessário incluir funções separadas set_content_type, set_page_title e h1_text. Existem ajudantes simples que mantêm a limpeza na função principal. Tudo isso pode simplesmente ser trazido para a função principal e funcionará exatamente da mesma maneira.

Mas espero que você veja uma vantagem em destacar esses recursos. Se você precisava criar uma função para cada elemento HTML, poderia usar este código para criar uma resposta de resposta limpa no seu programa:

 void p(string text) { cout << "<p>" << text << "</p>\n"; } 

Em seguida, use algo como:

 p("This would be paragraph text."); 

Para exibir um parágrafo.

Você pode até desenvolver essa idéia para que funções auxiliares como p, h1_text etc. retornem texto em vez de saída direta para saída padrão via cout. Ao mesmo tempo, você pode criar um sistema de modelos ou aninhar respostas para criar páginas complexas com código C ++ muito otimizado e eficiente.

Este exemplo é o mais simples possível, indica apenas os pontos principais. Você tem acesso total a cada cabeçalho de resposta, fornecendo controle completo sobre o loop de resposta.

Mais sobre entrada


Nosso exemplo não aceita nenhuma entrada, ele retorna apenas "Hello World". Mas o Apache responde a cada solicitação com uma enorme quantidade de informações através de variáveis ​​de ambiente. Você pode usar a função getenv () na biblioteca padrão C para obter seus valores (não se esqueça de adicionar #include <stdlib.h> no início do código) Por exemplo, se você precisasse descobrir o URI de solicitação completo, usaria:

 string request_uri = getenv("REQUEST_URI"); 

para obter esse valor. Outras variáveis ​​úteis:

  • REMOTE_ADDR - Obtendo o endereço IP do visitante
  • REQUEST_METHOD - Retorna um método (por exemplo, GET, POST etc.)
  • DOCUMENT_ROOT - Rota do site (geralmente ~ / public_html em sistemas compartilhados ou / var / www / html em servidores virtuais / dedicados).
  • QUERY_STRING - Uma string de consulta para obter variáveis ​​GET.

Exemplo mais claro


Obviamente, é possível analisar variáveis ​​GET manualmente, e o processamento de variáveis ​​POST pode ser feito verificando a entrada padrão. Você pode até receber e definir cookies alterando os cabeçalhos de solicitação e resposta. Mas ambas as abordagens são muito entediantes.

Você pode escrever seus próprios shells ou usar a biblioteca GNU cgicc já pronta. Ele contém funções auxiliares para modificar HTML e processar formulários. Ao trabalhar com projetos grandes, o uso dessa biblioteca economizaria decentemente tempo.

No Debian e Ubuntu, você pode instalar a biblioteca e os cabeçalhos usando:

 apt install libcgicc5 libcgicc5-dev 

Mas o CentOS / RHEL não possui seus próprios pacotes. Para instalar neles, execute:

 cd /usr/local/src wget ftp://ftp.gnu.org/gnu/cgicc/cgicc-3.2.19.tar.gz tar xfz cgicc*.tar.gz cd cgicc* ./configure — prefix=/usr make make install 

NOTA: 3.2.19 era a versão mais recente no momento da redação deste documento, mas você pode procurar uma cópia mais recente em ftp.gnu.org/gnu/cgicc . Eu também usei / usr como prefixo para evitar problemas ao vincular bibliotecas. Se alguma coisa, mude-os com calma.

Depois de instalar o cgicc, você pode compilá-lo. Experimente este exemplo, que recebe a entrada de um formulário e a exibe em um navegador:

Makefile:

 all: g++ -O3 -s hello.cpp -o hello.cgi g++ -O3 -s cgicc.cpp -o cgicc.cgi /usr/lib/libcgicc.a clean: rm -f hello.cgi cgicc.cgi 

cgicc.html:

 <!doctype html> <html lang="en"> <head> <title>cgicc Test</title> </head> <body> <form method="POST" action="cgicc.cgi"> <label for="name">Name</label> <input name="name" type="text" value=""> <input name="submit" type="submit" value="Submit"> </form> </body> </html> 

cgicc.cpp:

 #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; void set_content_type(string content_type) { cout << "Content-type: " << content_type << "\r\n\r\n"; } void set_page_title(string title) { cout << "<title>" << title << "</title>\n"; } void h1_text(string text) { cout << text << "\n"; } int main() { Cgicc cgi; string name; set_content_type("text/html"); cout << "<!doctype html>\n"; cout << "<html lang=\"en\">\n"; cout << "<head>\n"; set_page_title("cgicc Test"); cout << "</head>\n"; cout << "<body>\n"; cout << "<p>"; // Grab the "name" variable from the form name = cgi("name"); // Check to make sure it isn't empty. if (!name.empty()) { cout << "Name is " << name << "\n"; } else { cout << "Name was not provided."; } cout << "</p>\n"; cout << "</body>\n"; cout << "</html>"; return 0; } 

Você deve ter notado que vinculei estaticamente a biblioteca cgicc no Makefile. Embora isso não seja necessário (você pode substituí-lo por -Icgicc), prefiro vincular estaticamente o código binário enviado ao servidor para que tudo o que for necessário para executar o programa seja enviado como um conjunto.

Neste exemplo, a biblioteca cgicc faz o trabalho árduo das variáveis ​​POST e retorna-nos "nome".

Não escapei da variável de entrada POST, mas ela é recomendada, especialmente em locais de produção, principalmente se você interagir com o banco de dados.

Essa é apenas uma pequena parte das possibilidades do cgicc. Você pode ler a documentação completa aqui .

Desempenho / desempenho


O C ++ é incrivelmente rápido ao trabalhar com um bom código. A interface CGI torna as coisas um pouco mais lentas, mas mesmo assim você terá uma execução melhor do que em linguagens interpretadas como PHP.
Como se costuma dizer, há sempre algo pelo que lutar. Em um ambiente virtual ou especializado, você pode usar o suporte FastCGI do Nginx ou Apache para reduzir o pequeno atraso (e imperceptível, se o servidor não estiver muito carregado) no momento em que o programa é carregado. Não houve atrasos nos meus testes, mas, para trabalhar com um site com tráfego carregado, será útil estudar essas soluções para uma execução ainda mais rápida / trabalho rápido

Opcional


Seria fácil agrupar um programa C ++ em um contêiner Docker fino. Isso fornecerá uma grande flexibilidade ao colocar um site. Você também pode acessar o banco de dados MySQL incluindo os cabeçalhos de desenvolvimento C / C ++ MySQL em seu programa. Se você estiver familiarizado com o MySQL com PHP, notará que os nomes das variáveis ​​são muito semelhantes.

Em vez de criar processos adicionais de linha de comando para o processamento de imagens, você pode incluir cabeçalhos do ImageMagick C ++ para processar essas imagens diretamente no seu programa

Que jornada longa e estranha


Criar um site em C ++ é prático, principalmente se o desempenho for importante. Eu não recomendaria isso para um blog ou site pessoal - eles podem ser feitos facilmente no WordPress. Mas se você tem uma necessidade urgente de velocidade e deseja escrever bem em um caminho batido, considere C ++ para o seu próximo projeto de nicho na web.

Source: https://habr.com/ru/post/pt480208/


All Articles