Ist es möglich?
Ja
Ich weiß, dass das seltsam klingt und eher wie eine Übung in Wertlosigkeit aussieht, aber das ist es nicht.
In diesem Artikel werde ich Ihnen erklären, wie Sie C ++ in der Website-Entwicklung verwenden können, und ich werde einige gute Gründe dafür nennen.
Es wird nicht nur interessant, sondern auch nützlich und sehr praktisch sein.
Hosting
Sie denken wahrscheinlich: Eine solche ungewöhnliche Konfiguration kann nur in einer speziellen Umgebung implementiert werden. Dies ist jedoch in der Regel nicht der Fall. Obwohl ein regulärer oder virtueller Spezialserver für viele Sites (nicht nur für C ++ - Sites) eine ideale Lösung darstellt, können Sie C ++ in den meisten Fällen für Shared Hosting verwenden.
Jedes Webhosting, das CGI unterstützt (im Prinzip alles), kann eine Site in C ++ unterstützen. Je nach Anbieter können Sie Ihre Site entweder lokal kompilieren oder nicht, und Sie benötigen den Compiler, der in Ihrem Konto enthalten ist. Testen Sie sie, wenn Sie beabsichtigen, sie über SSH direkt auf dem Webserver zu bearbeiten und zu kompilieren.
Einfaches Beispiel
In den obigen Beispielen verwende ich das cPanel-Hosting-Konto. Sie sind erschwinglich, preiswert und konsequent. Mit ein paar einfachen Änderungen an Ihrer Apache-Konfiguration können Sie diese Methoden jedoch problemlos an einen virtuellen oder dedizierten Server oder eine Amazon EC2-Instanz anpassen.
cPanel stellt uns den Ordner cgi-bin zur Verfügung, den wir jedoch nicht benötigen. In den meisten Fällen wird jede Datei mit der Erweiterung .cgi automatisch verarbeitet, wenn sie über die richtigen Berechtigungen verfügt (normalerweise 0755). Hier sind die erforderlichen Dateien (stellen Sie sicher, dass Sie das TAB im Makefile verwenden)
Makefile:
all: g++ -O3 -s hello.cpp -o hello.cgi clean: rm -f hello.cgi
hallo.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; }
Wenn Sie Compiler in Ihrem Konto haben (Sie müssen möglicherweise das Support-Team um Ihr Webhosting bitten), verwenden Sie einfach SSH in Ihrem Konto, speichern Sie diese Dateien im Ordner public_html und führen Sie dann Folgendes aus:
make
Die Datei hello.cgi wird ausgeführt. Wenn Sie die Datei-Adresse zum Beispiel in einem Browser wie folgt eingeben:
http:
Ersetzen Sie dann your-test-site.com durch Ihren Domainnamen oder Ihre Hosting-URL. Auf dem Bildschirm sollte "Hello World" angezeigt werden.
Bevor wir uns mit dem Code selbst befassen, schauen wir uns an, wie er auf einem Webserver funktioniert. Wenn Apache die Anforderung annimmt, wird zuerst der interne Handler oder die Umschreiberegel geprüft. Anschließend wird auf der Festplatte nach der Datei gesucht, die der Anforderung entspricht. In unserem Fall findet es hello.cgi und ruft es ab. Unser Programm akzeptiert keine Eingaben, sondern zeigt nur die Meldung „Hallo Welt“ an. Apache empfängt dann diese Daten und gibt sie an den Benutzer zurück.
In Bezug auf den Code sollte erwähnt werden, dass es einfacher sein könnte. Es war nicht erforderlich, separate Funktionen set_content_type, set_page_title und h1_text einzuschließen. Es gibt einfache Helfer, die in der Hauptfunktion auf Sauberkeit achten. All dies kann einfach auf die Hauptfunktion gebracht werden, und es wird genauso funktionieren.
Ich hoffe jedoch, dass Sie einen Vorteil darin sehen, diese Funktionen hervorzuheben. Wenn Sie für jedes HTML-Element eine Funktion erstellen müssen, können Sie mit diesem Code eine saubere Antwortantwort in Ihrem Programm erstellen:
void p(string text) { cout << "<p>" << text << "</p>\n"; }
Dann benutze etwas wie:
p("This would be paragraph text.");
So zeigen Sie einen Absatz an
Sie können diese Idee sogar so entwickeln, dass Hilfsfunktionen wie p, h1_text usw. Text zurückgeben, anstatt ihn direkt über cout an die Standardausgabe weiterzuleiten. Gleichzeitig können Sie ein Vorlagensystem erstellen oder Antworten verschachteln, um komplexe Seiten mit sehr optimiertem und effizientem C ++ - Code zu erstellen.
Dieses Beispiel ist so einfach wie möglich und zeigt nur die Hauptpunkte an. Sie haben uneingeschränkten Zugriff auf jeden Antwortheader, sodass Sie die vollständige Kontrolle über die Antwortschleife haben.
Mehr zum Thema Input
Unser Beispiel akzeptiert keine Eingabe, es gibt nur "Hello World" zurück. Apache antwortet jedoch auf jede Anfrage mit einer großen Menge an Informationen über Umgebungsvariablen. Sie können die Funktion getenv () in der C-Standardbibliothek verwenden, um deren Werte abzurufen (vergessen Sie nicht, am Anfang des Codes #include <stdlib.h> hinzuzufügen.) Wenn Sie beispielsweise den vollständigen Anforderungs-URI herausfinden möchten, würden Sie Folgendes verwenden:
string request_uri = getenv("REQUEST_URI");
um diesen Wert zu erhalten. Andere nützliche Variablen:
- REMOTE_ADDR - Ermittelt die IP-Adresse des Besuchers
- REQUEST_METHOD - Gibt eine Methode zurück (z. B. GET, POST usw.)
- DOCUMENT_ROOT - Route der Site (normalerweise ~ / public_html auf gemeinsam genutzten Systemen oder / var / www / html auf virtuellen / dedizierten Servern).
- QUERY_STRING - Eine Abfragezeichenfolge zum Abrufen von GET-Variablen.
Klareres Beispiel
Natürlich ist es möglich, GET-Variablen manuell zu analysieren, und die Verarbeitung von POST-Variablen kann durch Überprüfen der Standardeingabe erfolgen. Sie können sogar Cookies empfangen und festlegen, indem Sie die Anforderungs- und Antwortheader ändern. Beide Ansätze sind jedoch zu langwierig.
Sie können Ihre eigenen Shells schreiben oder die fertige GNU cgicc-Bibliothek verwenden. Es enthält Hilfsfunktionen zum Ändern von HTML und zum Verarbeiten von Formularen. Bei der Arbeit mit großen Projekten würde die Verwendung einer solchen Bibliothek Zeit sparen.
Unter Debian und Ubuntu können Sie die Bibliothek und die Header folgendermaßen installieren:
apt install libcgicc5 libcgicc5-dev
CentOS / RHEL hat jedoch keine eigenen Pakete. Führen Sie zum Installieren auf ihnen Folgendes aus:
cd /usr/local/src wget ftp:
HINWEIS: 3.2.19 war zum Zeitpunkt des Schreibens die neueste Version. Sie können jedoch unter
ftp.gnu.org/gnu/cgicc nach einer neueren
Version suchen . Ich habe / usr auch als Präfix verwendet, um Probleme beim Verknüpfen von Bibliotheken zu vermeiden. Wenn überhaupt, ändern Sie sie ruhig.
Nach der Installation von cgicc können Sie es kompilieren. Probieren Sie dieses Beispiel aus, bei dem Eingaben aus einem Formular übernommen und in einem Browser angezeigt werden:
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; }
Möglicherweise haben Sie bemerkt, dass ich die cgicc-Bibliothek im Makefile statisch verknüpft habe. Obwohl dies nicht erforderlich ist (Sie können es durch -Icgicc ersetzen), ziehe ich es vor, den an den Server gesendeten Binärcode statisch zu verknüpfen, damit alles, was zum Ausführen des Programms erforderlich ist, als Satz gesendet wird.
In diesem Beispiel erledigt die cgicc-Bibliothek die harte Arbeit der POST-Variablen und gibt uns "name" zurück.
Ich habe die POST-Eingabevariable nicht umgangen, sie wird jedoch empfohlen, insbesondere an Produktionsstandorten, insbesondere wenn Sie mit der Datenbank interagieren.
Dies ist nur ein kleiner Teil der Möglichkeiten von cgicc. Sie können
die vollständige Dokumentation
hier lesen .
Leistung / Leistung
C ++ arbeitet unglaublich schnell mit gutem Code. Die CGI-Oberfläche verlangsamt die Dinge ein wenig, aber trotzdem erhalten Sie eine bessere Ausführung als in interpretierten Sprachen wie PHP.
Wie sie sagen, gibt es immer etwas anzustreben. In einer spezialisierten oder virtuellen Umgebung können Sie die FastCGI-Unterstützung von Nginx oder Apache verwenden, um die kleine (und unauffällige, wenn der Server nicht stark ausgelastet ist) Verzögerung beim Laden des Programms zu verringern. Bei meinen Tests gab es keine Verzögerungen, aber für die Arbeit mit einer Website mit viel Verkehr ist es hilfreich, diese Lösungen zu studieren, um eine noch schnellere Ausführung / schnellere Arbeit zu ermöglichen
Optional
Es wäre einfach, ein C ++ - Programm in einen dünnen Docker-Container zu packen. Dies bietet Ihnen eine große Flexibilität beim Platzieren einer Site. Sie können auch auf die MySQL-Datenbank zugreifen, indem Sie die C / C ++ - MySQL-Entwicklungsheader in Ihr Programm aufnehmen. Wenn Sie mit der Verwendung von MySQL mit PHP vertraut sind, werden Sie feststellen, dass die Variablennamen sehr ähnlich sind.
Anstatt zusätzliche Befehlszeilenprozesse für die Bildverarbeitung zu erstellen, können Sie ImageMagick C ++ - Header einbinden, um diese Bilder direkt in Ihrem Programm zu verarbeiten
Was für eine lange und seltsame Reise
Das Erstellen einer Site in C ++ ist praktisch, insbesondere wenn die Leistung wichtig ist. Ich würde dies nicht für einen Blog oder eine persönliche Website empfehlen - sie können leicht auf WordPress durchgeführt werden. Wenn Sie jedoch dringend Geschwindigkeit benötigen und auf ausgetretenen Pfaden gut schreiben möchten, sollten Sie C ++ für Ihr nächstes Nischenprojekt im Web in Betracht ziehen.