Erläuterung, wie auf serverseitige Programmiersprachen zugegriffen wird

45

Nach meinem Verständnis kann jede allgemeine Programmiersprache für die serverseitige Entwicklung einer Website verwendet werden.

Bin ich zu Recht der Meinung, dass ein Server nur eine Schnittstelle wie CGI benötigt, damit der Server und die Programmiersprache zusammenarbeiten? Wenn ja, warum sind dann einige Programmiersprachen (wie PHP) beliebter als andere?

Chris Dance
quelle
2
Es ist wirklich derselbe Grund wie für jede andere Programmieraufgabe. Die Leute erfinden neue Programmiersprachen, weil sie etwas an den vorhandenen nicht mögen. Und andere verwenden weiterhin die alten, weil sie nicht die gleichen Dinge mögen - oder zumindest nicht genug, um zu wechseln.
Kilian Foth
Würde ich mit Recht sagen, dass einige Sprachen, wie zum Beispiel PHP, im Hinblick auf die Webentwicklung entwickelt wurden und daher eine einfachere (und daher beliebtere) Option für häufig verwendete Anwendungen darstellen?
Chris Dance
29
PHP ist eine "flache" Sprache. Die Grundstruktur ist leicht zu verstehen und enthält Hunderte kleiner Funktionen, die etwas Nützliches bewirken. Es spricht daher Neuankömmlinge an. Vergleichen Sie mit einer Sprache wie C #, in der Sie Dinge wie Vererbung, Objektorientierung, Typensicherheit und eine relativ komplexe Bibliothek lernen müssen, um produktiv zu sein.
Robert Harvey
4
Wenn es keine solche Schnittstelle gibt, können Sie den Server dennoch in der Sprache schreiben .
user253751

Antworten:

75

In den Anfängen des Webs war CGI in der Tat die einzige (praktische) Möglichkeit, dynamischen Inhalt zu haben (Sie konnten benannte Pipes von Dateien erstellen - und diese wurden Tage vor cgi verwendet, aber das war überhaupt nicht praktisch).

CGI arbeitet, indem es eine Reihe von Informationen in die Umgebung des Prozesses einfügt, die gegabelt und dann ausgeführt werden (und möglicherweise einige in stdin). Anschließend nimmt es das, was aus stdout kommt, und spuckt es zurück an den Anforderer.

Dabei spielt es keine Rolle, wie die Implementierungssprache lautet. Tatsächlich habe ich meine frühen CGIs damals in C oder C ++ geschrieben. Es war irgendwie schmerzhaft. Ich habe später in den frühen 90ern etwas Perl gelernt und das war viel weniger schmerzhaft.

Das funktioniert bis zu einem gewissen Punkt. Das Problem ist der Umfang. Jede CGI-Anforderung ist eine Verzweigung und Ausführung eines Prozesses. Tausende von Anfragen bedeuten Tausende von Prozessen. Das funktioniert wirklich nicht gut.

Die Lösung für dieses Problem besteht darin, das Verzweigen und Ausführen zu entfernen, indem Sie es entweder in einen Thread auf dem Webserver selbst verschieben oder die Anforderung an einen anderen Prozess senden, der die Anforderung verarbeitet, ohne dass eine Verzweigung und Ausführung erforderlich ist. mod_perl ist ein solches Tool (ein Plugin, das Perl in Apache verschiebt). Php (Ende der 90er Jahre) tat dies auch mit der Implementierung der Sprache als Plugin auf dem Webserver selbst und nicht mit etwas, das gegabelt und übertroffen wurde. Dies wurde ziemlich populär, da es perlartig war (was die früh dominierende Web-Programmiersprache war) und Perl-CGIS übertreffen konnte. In dieser Zeitspanne Mitte der 90er Jahre ist noch eine gewisse Dynamik zu verzeichnen, bevor die stärker auf Unternehmen ausgerichteten Anwendungsserver mit formalisierten Sprachen Einzug halten. Wenn Sie herumgraben,

Dies bringt uns zu den Anwendungsservern, auf denen interne Threads erzeugt werden (oder andere Ansätze - dies ist nicht für alle Fälle der Fall), um Anforderungen statt ganz neuer Prozesse zu verarbeiten - was bei der Skalierung hilfreich sein kann. Als externer Prozess war dies bei FastCGI zu beobachten und setzte sich später bei anderen Anwendungsservern durch. Beachten Sie, dass dadurch die Grenze zwischen Anwendungsserver und Webserver etwas unscharf wird - viele Anwendungsserver könnten als Webserver fungieren, wurden jedoch nicht für die Behandlung statischer Datei-E / A optimiert, wie dies bei herkömmlichen Webservern der Fall ist.

Der generische Anwendungsserver hat auch den Weg zu Lösungen geebnet, bei denen anstelle eines generischen Anwendungsservers die Anwendung selbst entweder einen eingebetteten Webserver ausführt oder auf andere Weise die gesamte Bereitstellung darstellt. In solchen Situationen wird keine Webanwendung auf einem Anwendungsserver bereitgestellt, sondern nur ausgeführt und Anforderungen verarbeitet. Auch hier besteht das Ziel dieses Modells darin, den hohen Preis für das Starten neuer Instanzen der Anwendung zu vermeiden und stattdessen die Anforderungen innerhalb der Anwendung mit viel leichteren Threads oder ähnlichen Ansätzen zu behandeln.

Hier ist jedoch die Sache - alle Lösungen sind in irgendeiner Weise, in irgendeiner Form oder in irgendeiner Form mangelhaft. CGI ist zwar einfach, hat aber ernsthafte Probleme mit der Skalierung. Plugins in den Webservern werden in den Webserver selbst eingebunden (apache vs nginx vs IIS vs ...) und verlieren die allgemeine Funktionalität der Sprache. Microsoft hat eine eigene Parade von Technologien, die es fördern möchte. Und wenn Sie eine Sprache beherrschen, möchten Sie nicht lieber weiter programmieren, anstatt verschiedene Sprachen in verschiedenen Teilen des Stacks zu haben (Javascript im Client und Node.js)?

Und so haben Sie heute. Einige Leute arbeiten in einem Java-Stack (wobei Scala und Clojure keine Seltenheit sind). Andere in einem C # -Stack. Andere in einem JavaScript-Stapel. Es gibt eine Menge PHP-Stacks da draußen. Viel Python. Es gibt immer noch Perl-Stacks (und wenn Sie sich Websites mit geringem Volumen ansehen, finden Sie immer noch CGIs). Mit dem Cloud-Computing hat Google Go auch als tragfähige serverseitige Websprache beworben.

Jedes hat seine Vor- und Nachteile, seine Frameworks und seine Server. Die relative Beliebtheit dieser Ebbe und Flut, wenn sich die Technologien um sie herum ändern. Sie machen verschiedene Dinge gut.


quelle
Genau das habe ich gesucht. Eine umfassende und unbefangene Antwort. Danke!
Chris Dance
1
"Die Lösung besteht darin, den Fork und Exec Cycle in den Webserver selbst zu verschieben." Nicht unbedingt: FastCGI und Reverse Proxy sind bekannte Lösungen für die Verbindung zu Anwendungsservern, ohne sich um die Zielsprache oder die Implementierung des Webservers kümmern zu müssen, die für ihre Arbeit ein genau festgelegtes prozessübergreifendes Kommunikationsprotokoll verwenden.
JHOMINAL
1
@jhominal "Anstatt für jede Anforderung einen neuen Prozess zu erstellen, verarbeitet FastCGI eine Reihe von Anforderungen mithilfe persistenter Prozesse. Diese Prozesse gehören dem FastCGI-Server und nicht dem Webserver." ( Quelle ) - es ist sein Herz, das ist, was ein Anwendungsserver tut. Ein beständiger Prozess, der die Anforderungen ohne Fork und Exec verarbeitet.
@MichaelT: Sie verwenden "Webserver" und "Anwendungsserver" so, als ob die Begriffe austauschbar wären - und in Ihrer Antwort verwenden Sie "Webserver" hauptsächlich, um auf Apache, nginx, zu verweisen - das heißt, generische Webserver-Software, die haben nur (im Kern) eingeschränkte Programmierbarkeit.
JHOMINAL
1
Ich denke nicht, dass dies ausreicht, um die (mittlerweile sehr verbreitete) Praxis zu erwähnen, dass jede Anwendung einfach ein eigener Webserver ist, der höchstwahrscheinlich von einem oder mehreren HTTP-Proxys gesteuert wird.
Hobbs
19

Ja, jede allgemeine Programmiersprache kann dazu dienen, den serverseitigen Teil einer Website zu schreiben.

Allerdings sind die Eigenschaften einer Programmiersprache in diesem Fach wie auch in anderen Dingen in der Regel nur einer von vielen Faktoren, die zu ihrer Popularität beitragen.

Ich gehe zum Beispiel davon aus, dass PHP für Websites populär geworden ist, weil:

  • Ein Upgrade von einer statischen Website auf eine dynamische PHP-Website ist denkbar einfach. Ersetzen Sie einfach die Dateierweiterung Ihrer HTML-Datei, setzen Sie das <?phpTag an den Anfang und, sofern PHP installiert ist, haben Sie eine dynamische Website! Der Rest des Workflows entspricht genau dem einer statischen Website.
  • Aufgrund der einfachen Bereitstellung entschieden sich Webhosts, die dynamische Websites vorschlagen wollten, für PHP, was es schnell zur am weitesten verbreiteten serverseitigen Plattform machte.
  • Es kam zur richtigen Zeit auf diesen Markt;

Und als PHP weit verbreitet war, wurde es interessant, seriösere Webanwendungen in PHP zu schreiben, um von der Ausweitung der Bereitstellung zu profitieren.

Um es allgemeiner auszudrücken: Bei der Sprachadoption geht es oft um die Antworten auf folgende Fragen:

  • Wie einfach ist es, das zu tun, was ich tun möchte?
  • Wie weit ist die Sprachunterstützung für das, was ich tun möchte?
jhominal
quelle
7

Bin ich zu Recht der Meinung, dass ein Server nur eine Schnittstelle wie CGI benötigt, damit der Server und die Programmiersprache zusammenarbeiten?

Fast. Sie benötigen einen Webserver, der über eine bestimmte Software verfügt, damit er auch auf HTTP-Anforderungen reagieren kann.

Überlegen Sie, wie eine statische Seite geliefert wird. Der Server ruft die HTTP-Anforderung ab, findet das angeforderte Dokument aus dem Dateisystem basierend auf der Konfiguration des HTTP-Servers und gibt die statische Seite zurück.

CGI erweitert dieses Konzept, indem Sie einen cgi-bin-Ordner im Dateisystem festlegen können, in dem ausführbare Dateien oder Skripts gespeichert werden können. Wenn Sie über CGI auf ein Programm zugreifen, führt der HTTP-Server den Prozess oder das Skript aus und übergibt die Standardausgabe zurück an den Client, anstatt nur das statische Dokument bereitzustellen.

 If so then why are some programming languages (such as php) more popular than others?

Die alte CGI-Struktur lässt sich über ein großes Anforderungsvolumen nicht gut skalieren. Verschiedene Programmiersprachen und Frameworks für das Web existieren aus unterschiedlichen Gründen, und jedes macht verschiedene Dinge gut. PHP ist aus historischen Gründen so beliebt wie es ist, da es eine der ersten einfachen und billigen Lösungen für die Bereitstellung dynamischer Seiten war, ohne auf CGI zurückzugreifen, und weit verbreitete Hosting-Unterstützung hatte. ASP war in Microsoft-Kreisen beliebt, weil es VB-Entwicklern ermöglichte, ihre Fähigkeiten auf das Web zu übertragen. Mit ASP.NET (Web Forms) war es für Windows Forms-Entwickler, von denen viele VB-Programmierer waren, sehr einfach, auf das Web umzusteigen.

Ravibhagw
quelle
3

Wenn ein Browser eine HTTP-Anfrage stellt, sieht das so aus:

GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close

… An die der Server eine Antwort senden soll, die so aussieht:

HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>

Jeder auf dem Server ausgeführte Code, der auf Anforderungen an einem TCP-Socket wartet, die Anforderung liest und mit der entsprechenden Antwort antwortet, ist ausreichend. Eine blöde Methode besteht darin, eine vordefinierte Antwort mit einem Shell-Skript an jeden auszuspucken, der eine Verbindung zu TCP-Port 80 herstellt:

$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>
RESPONSE

Natürlich scheint diese Technik nur wenig mit dem HTTP-Protokoll übereinzustimmen .

Ein weiterer Fortschritt gegenüber dieser vorgefertigten Antwort ist dieses einfache Python-Programm, das die http.serverBibliothek in Python 3 verwendet.

#!/usr/bin/python3

import http.server

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
        self.send_response(200)
        self.send_header('Content-Type', 'text/html; charset=UTF-8')
        self.send_header('Content-Length', len(payload))
        self.end_headers()
        self.wfile.write(payload)

http.server.HTTPServer(('', 80), Handler).serve_forever()

Der HTTP-Server kann in einer beliebigen Sprache geschrieben werden. das ist nur ein beispiel Offensichtlich ist dieses Beispiel sehr rudimentär. Die Nutzdaten sind fest codiert - das Programm ignoriert den Inhalt der Anforderung - die URL, die Abfragezeichenfolge, den Accept-Language-Header usw. - vollständig. Sie können Code hinzufügen, um auf der Grundlage der Anforderung aussagekräftige Antworten zu generieren Komplex. Außerdem möchten sich Programmierer lieber darauf konzentrieren, die Webanwendung zu schreiben, ohne sich um die Details der Behandlung einer HTTP-Anfrage kümmern zu müssen.

Eine geeignetere Lösung wäre die Verwendung eines Webservers wie Apache HTTPD , IIS oder Nginx . Ein Webserver ist lediglich ein Programm, das die relevanten TCP-Sockets überwacht, mehrere Anforderungen (möglicherweise gleichzeitig) akzeptiert und anhand der Anforderungs-URL, der Header und anderer Regeln entscheidet, wie eine Antwort generiert werden soll. Im Idealfall werden viele Details wie SSL, Zugriffskontrolle und Ressourcenbeschränkungen über die Konfiguration und nicht über Code geregelt. In den meisten Fällen formuliert der Webserver eine Antwort, die nur aus Inhalten aus Dateien im Dateisystem besteht.

Für dynamischen Inhalt kann der Webserver jedoch so konfiguriert werden, dass Code zum Generieren der Antwort ausgeführt wird. Ein Mechanismus dafür ist CGI: Der Server setzt einige Umgebungsvariablen basierend auf der Anforderung, führt ein Programm aus und kopiert seine Ausgabe in den TCP-Socket. Eine etwas komplexere Lösung wäre ein Modul, das den Webserver für den Aufruf von Code in einer anderen Programmiersprache (z. B. mod_php für Apache ) unterstützt. Eine weitere Möglichkeit besteht darin, den Webserver in derselben Sprache wie die Webanwendung zu schreiben. In diesem Fall ist der Anforderungsversand nur ein Funktionsaufruf. Dies ist bei node.js und Java-Servlet-Engines wie Apache Tomcat der Fall .

Die Wahl der Technologie liegt ganz bei Ihnen und hängt von der von Ihnen bevorzugten Programmiersprache, der für Sie verfügbaren Hosting-Umgebung, den Leistungsanforderungen, der allgemeinen Meinung und den aktuellen Trends ab. CGI zum Beispiel wurde in letzter Zeit nicht bevorzugt, da die Notwendigkeit, externe Programme zu starten, die Skalierbarkeit einschränkt.

200_erfolg
quelle
1

Ein Webserver ist ein Programm, das in einer beliebigen Programmiersprache geschrieben ist und den "Web-Verkehr" über Sockets verarbeitet, die den Standards / Protokollen auf Anwendungsebene (HTTP usw.) entsprechen. In den meisten Programmiersprachen können Sie einen Socket erstellen.

Bin ich zu Recht der Meinung, dass ein Server nur eine Schnittstelle wie CGI benötigt, damit der Server und die Programmiersprache zusammenarbeiten?

Es ist nicht erforderlich, ein dediziertes Serverprogramm und Ihr Anwendungsprogramm zu haben - diese können identisch sein (unabhängig von leistungsbezogenen Problemen).

mucaho
quelle
0

Sie können einige HTTP- Server-Bibliotheken verwenden, z. B. libonion , auch in Ihrem Programm, das in C (oder C ++, siehe auch Wt ) codiert ist . Es gibt auch einige HTTP-Client-Bibliothek (zB libcurl )

Sie können andere HTTP-Bibliotheken verwenden, z. B. ocsigen & ocamlnet für OCaml .

Es gibt mehrere Web-spezifische Sprachen (außerhalb von PHP), z. B. Opa , HOP , Kaya usw. (sowohl HOP als auch Opa können problemlos serverseitige und browserseitige Berechnungen mischen, dies muss jedoch mühsam und manuell erfolgen PHP, explizit unter Verwendung von AJAX- Techniken und Handcodierung von Javascript für den Browser (im Gegensatz dazu können HOP, Opa, Ocsigen dieses Javascript generieren).

Sie können auch die FASTCGI- Technologie verwenden, um einem Webserver einen dynamischen Dienst hinzuzufügen ... FASTCGI ist besser als einfaches altes CGI, das für jede eingehende HTTP-Anfrage einen neuen Prozess startet, während eine FASTCGI-Anwendung viele HTTP-Anfragen im selben Prozess bedienen kann. Übrigens kann PHP so konfiguriert werden, dass es als FASTCGI-Anwendung funktioniert.

C. Queinnec stellte fest, dass das Browsen im Internet und die Fortsetzung der Arbeiten in erheblichem Zusammenhang stehen.

PS. Ich mag PHP nicht und ich glaube, dass seine Popularität historische und soziale Gründe hat (nicht hauptsächlich technische). Tatsächlich war PHP weit verbreitet, bevor AJAX weit verbreitet wurde, und es ist älter als HOP oder Opa (oder Ocsigen).

Basile Starynkevitch
quelle