Création d'un site à l'aide de C ++

Est-ce possible?


Oui

Je sais que cela semble étrange et ressemble plus à un exercice sans valeur, mais ce n’est pas le cas.
Dans cet article, je vais vous expliquer comment vous pouvez utiliser C ++ dans le développement de sites Web, et je donnerai quelques bonnes raisons à cela.

Ce sera non seulement intéressant, mais aussi utile et très pratique.

Hébergement


Vous pensez probablement: une configuration aussi inhabituelle ne peut être implémentée que dans un environnement spécialisé. Cependant, ce n'est généralement pas le cas. Malgré le fait qu'un serveur spécial régulier ou virtuel soit une solution idéale pour de nombreux sites (pas seulement des sites C ++), dans la plupart des cas, vous pouvez utiliser C ++ sur des services d'hébergement partagé.
Tout hébergement Web qui prend en charge CGI (c'est-à-dire, en principe, tout) pourra prendre en charge un site en C ++. Selon le fournisseur, vous pouvez soit compiler votre site localement ou non, et vous aurez besoin du compilateur inclus dans votre compte. Vérifiez-les si vous prévoyez de modifier et de compiler via SSH directement sur le serveur Web.

Exemple simple


Dans les exemples ci-dessus, j'utilise le compte d'hébergement cPanel. Ils sont abordables, peu coûteux et cohérents. Mais vous pouvez facilement adapter ces méthodes à un serveur virtuel ou dédié ou à une instance Amazon EC2 avec quelques modifications simples à votre configuration Apache.

cPanel nous fournit le dossier cgi-bin, mais nous n'en avons pas besoin. Dans la plupart des cas, tout fichier portant l'extension .cgi sera automatiquement traité s'il dispose des autorisations appropriées (généralement 0755). Voici les fichiers nécessaires (assurez-vous d'utiliser le TAB dans le 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; } 

Si vous avez des compilateurs inclus dans votre compte (vous devrez peut-être demander à l'équipe d'assistance pour votre hébergement Web), utilisez simplement SSH dans votre compte, placez ces fichiers dans le dossier public_html, puis faites:

 make 

Le fichier hello.cgi sera exécuté. Si vous entrez l'adresse du fichier dans un navigateur, par exemple, comme ceci:

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

Remplacez ensuite your-test-site.com par votre nom de domaine ou URL d'hébergement. «Hello World» devrait apparaître à l'écran.

Avant de plonger dans le code lui-même, regardons comment il fonctionne sur un serveur Web. Lorsque Apache accepte la demande, la première chose qu'il regarde est le gestionnaire interne ou la règle de réécriture, puis il recherche sur le disque le fichier correspondant à la demande. Dans notre cas, il trouve hello.cgi et le récupère. Notre programme n'accepte pas de saisie, mais affiche uniquement le message «Bonjour tout le monde». Apache reçoit ensuite ces données et les renvoie à l'utilisateur.

En parlant du code, il convient de mentionner qu'il pourrait être plus facile. Il n'était pas nécessaire d'inclure des fonctions distinctes set_content_type, set_page_title et h1_text. Il existe des aides simples qui maintiennent la propreté dans la fonction principale. Tout cela peut simplement être amené à la fonction principale, et cela fonctionnera exactement de la même manière.

Mais j'espère que vous voyez un avantage à mettre en évidence ces fonctionnalités. Si vous aviez besoin de créer une fonction pour chaque élément HTML, vous pouvez utiliser ce code pour créer une réponse de réponse propre dans votre programme:

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

Ensuite, utilisez quelque chose comme:

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

Pour afficher un paragraphe.

Vous pouvez même développer cette idée afin que les fonctions d'assistance comme p, h1_text, etc., renvoient du texte au lieu d'une sortie directe vers la sortie standard via cout. Dans le même temps, vous pouvez créer un système de modèles ou imbriquer des réponses pour créer des pages complexes avec du code C ++ très rationalisé et efficace.

Cet exemple est aussi simple que possible, il n'indique que les points principaux. Vous avez un accès complet à chaque en-tête de réponse, vous donnant un contrôle complet sur la boucle de réponse.

En savoir plus sur l'entrée


Notre exemple n'accepte aucune entrée, il ne renvoie que «Hello World». Mais Apache répond à chaque demande avec une énorme quantité d'informations via des variables d'environnement. Vous pouvez utiliser la fonction getenv () dans la bibliothèque standard C pour obtenir leurs valeurs (n'oubliez pas d'ajouter #include <stdlib.h> au début du code). Par exemple, si vous aviez besoin de trouver l'URI complet de la demande, vous utiliseriez:

 string request_uri = getenv("REQUEST_URI"); 

pour obtenir cette valeur. Autres variables utiles:

  • REMOTE_ADDR - Obtention de l'adresse IP du visiteur
  • REQUEST_METHOD - Retourne une méthode (c'est-à-dire GET, POST, etc.)
  • DOCUMENT_ROOT - Route du site (généralement ~ / public_html sur les systèmes partagés ou / var / www / html sur les serveurs virtuels / dédiés).
  • QUERY_STRING - Une chaîne de requête pour obtenir des variables GET.

Exemple plus clair


Bien sûr, il est possible d'analyser les variables GET manuellement, et le traitement des variables POST peut être effectué en vérifiant l'entrée standard. Vous pouvez même recevoir et définir des cookies en modifiant les en-têtes de demande et de réponse. Mais les deux approches sont trop fastidieuses.

Vous pouvez écrire vos propres shells ou utiliser la bibliothèque GNU cgicc prête à l'emploi. Il contient des fonctions d'assistance pour modifier le HTML et traiter les formulaires. En travaillant avec de grands projets, l'utilisation d'une telle bibliothèque gagnerait décemment du temps.

Sur Debian et Ubuntu, vous pouvez installer la bibliothèque et les en-têtes en utilisant:

 apt install libcgicc5 libcgicc5-dev 

Mais CentOS / RHEL n'a pas ses propres packages. Pour les installer, exécutez:

 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 

REMARQUE: 3.2.19 était la dernière version au moment de la rédaction, mais vous pouvez vérifier une copie plus récente sur ftp.gnu.org/gnu/cgicc . J'ai également utilisé / usr comme préfixe pour éviter les problèmes de liaison des bibliothèques. Si quoi que ce soit, changez-les calmement.

Après avoir installé cgicc, vous pouvez le compiler. Essayez cet exemple, qui prend la saisie d'un formulaire et l'affiche dans un navigateur:

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; } 

Vous avez peut-être remarqué que j'ai lié statiquement la bibliothèque cgicc dans le Makefile. Bien que cela ne soit pas nécessaire (vous pouvez le remplacer par -Icgicc), je préfère lier statiquement le code binaire que j'envoie au serveur afin que tout ce qui est nécessaire pour que le programme soit envoyé est envoyé sous forme d'ensemble.

Dans cet exemple, la bibliothèque cgicc fait le travail acharné des variables POST et nous renvoie «nom».

Je n'ai pas échappé à la variable d'entrée POST, mais elle est recommandée, surtout dans les lieux de production, surtout si vous interagissez avec la base de données.

Ce n'est qu'une petite partie des possibilités de cgicc. Vous pouvez lire la documentation complète ici .

Performance / performance


C ++ est incroyablement rapide pour travailler avec un bon code. L'interface CGI ralentit un peu les choses, mais vous obtiendrez néanmoins une meilleure exécution que dans les langages interprétés comme PHP.
Comme on dit, il y a toujours quelque chose à rechercher. Dans un environnement spécialisé ou virtuel, vous pouvez utiliser la prise en charge FastCGI de Nginx ou Apache pour réduire le petit délai (et discret, si le serveur n'est pas lourdement chargé) au moment du chargement du programme. Il n'y a eu aucun retard dans mes tests, mais pour travailler avec un site Web avec du trafic chargé, il sera utile d'étudier ces solutions pour une exécution / un travail encore plus rapide.

En option


Il serait facile d'envelopper un programme C ++ dans un conteneur Docker fin. Cela vous offrira une grande flexibilité lors du placement d'un site. Vous pouvez également accéder à la base de données MySQL en incluant les en-têtes de développement MySQL C / C ++ dans votre programme. Si vous êtes familier avec MySQL avec PHP, vous remarquerez que les noms des variables sont très similaires.

Au lieu de créer des processus de ligne de commande supplémentaires pour le traitement d'image, vous pouvez inclure des en-têtes ImageMagick C ++ pour traiter ces images directement dans votre programme

Quel long et étrange voyage


La création d'un site en C ++ est pratique, surtout si les performances sont importantes. Je ne recommanderais pas cela pour un blog ou un site personnel - ils peuvent être facilement effectués sur WordPress. Mais si vous avez un besoin urgent de vitesse et que vous souhaitez bien écrire sur des sentiers battus, pensez au C ++ pour votre prochain projet de niche sur le Web.

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


All Articles