Was brauche ich für einen php-basierten Webdienst?

BAGZZlash

Moderator
Teammitglied
Ich bin Hobbyprogrammierer und habe schon viele Spaßprojekte in VB, C und R umgesetzt. Nun will ich einen elemetaren Webdienst basteln, der auf dem Server Berechnungen durchführt. Für den Anfang soll das ein Dienst sein, der zwei Zahlen addiert. Ich stelle mir vor, dass ich dem Server zwei Zahlen a und b zuspiele, etwa so:


Auf dem Server läuft dann ein Stück Software, das die beiden Zahlen addiert und das Ergebnis zurückgibt: 5. Auf welchem Wege kommt das Ergebnis zu mir zurück, als HTML-Datei? Wäre mir recht. Oder geht das auch cooler? Ich möchte den Webdienst später von einer lokalen, selbstentwickelten Anwendung aus mit Arbeit und Daten versorgen und dort auch die Ergebnisse weiterverwenden.

Grundsätzlich: Was brauche ich dafür? Ich hab' keine Domain, geht das auch lokal, notfalls auch mit einem zweiten Rechner im lokalen Netzwerk? Angenommen, der Rechner im Wohnzimmer mit der IP 192.168.0.10 ist der "Server". Was muss darauf laufen (neben dem eigentlichen Addier-Dienst)? Ein Webserver?

Ich hab' keine Ahnung, wie ich sowas aufsetze. Das Programmieren kriege ich hin, aber das ganze Drumherum fehlt mir. Und: Ist php dafür überhaupt (noch) das Mittel der Wahl, oder gibt's da was Neues, was jetzt "die Zukunft" ist?
 
PHP war eigentlich nie wirklich "das Mittel der Wahl". Es war nur besonders verbreitet.

Mittlerweile gibt es, wenn du nicht an Constraints wie "Die Firma hat nur PHP-Programmierer", "Der Manager sagt ich soll PHP benutzen" zum Glück eine große Auswahl an weniger schlimmen Wahlmöglichkeiten, die ich eigentlich für jedes Projekt vorziehen würde das neu beginnt(Es konnte mir noch nicht ein Mensch einen technischen Grund für die Wahl von PHP für IRGENDEIN Projekt nennen. Und ich mache den Scheiß schon etwas länger).

Nun gibt es da die ganz offensichtlichen und bekannten Sachen(Python mit Django, Ruby on Rails), die sicherlich einen Blick wert sind, ich würde aber vor allem gern auf ein paar eher unbekannte Webframeworks hinweisen, die ich bisher ziemlich gut fand und bei denen ich finde, mehr Leute sollten damit mal was gemacht haben. Nicht nur weil sie toll sind, sondern weil es eine ziemlich transformative Erfahrung ist.

Ansatz 1: Yesod. Yesod ist ein Webframework für Haskell, was allein schon Grund genug ist einfach cool zu sein, ist aber vor allem gefühlt "haskellig": es ist Lazy, es macht Asynchronität und Parallelismus extrem einfach, es ist unfassbar schnell für ein Webframework(Haskell wird idR. nativ kompiliert, kann aber auch interpretiert in einer REPL ausgeführt werden, ist insgesamt eine sehr flotte Sprache, und die typischen Haskellcompiler wie UHC und GHC sind was Compilertechnologie angeht die Endgegner), und es ist, anders als PHP, auch noch statisch typisiert mit dem mächtigsten Typsystem, das ich in irgendeiner produktiv benutzbaren Sprache kenne, das geht so weit, dass du damit sogar Encoding-Probleme zur Compilezeit abfangen kannst. Richtig geil werden Webapplications damit, wenn du den dynamischen Teil auch noch
in PureScript (basiert auch auf der Haskell-Syntax, kompiliert zu Javascript, hat ein starkes Typsystem etc.) abfertigst.

Ansatz 2: Phoenix bedient sich in vielerlei Hinsicht wie Rails, was die Hilfstools rundherum angeht, verwendet aber statt Ruby(das, wie du schnell sehen wirst, ganz erheblich eine Inspiration für Elixir war) die Sprache Elixir, die auf dem(ganz herausragenden) Erlang-Ökosystem basiert und auch mit Erlang-Modulen kompatibel ist. Elixir ist zwar nicht so flott wie Haskell(weil es auf der Erlang-VM läuft, die aber immer noch erheblich schneller ist als bspw. die JVM, besonders wenn du massiv rechnen willst), bietet aber andere erhebliche Vorteile: das Acrot-Model und Railway-Orientierte Programmierung sind fest in die Sprache verbacken, Metaprogrammierung bis zur Manipulation des AST selbst ist ohne Probleme möglich. Und da haben wir noch nicht einmal mit den Vorteilen durch Erlang begonnen. Erlang wurde für die Telefonindustrie geschrieben, und ist da unangefochten, und bringt viele Features mit, die du in keiner anderen Sprache/Sprachfamilie finden wirst: Erlang-Programme über Netzwerk etc. auf mehrere Nodes zu verteilen ist eine absolut minimale Fingerübung, ebenso wie Hochskalierbare, massiv konkurrente Programme zu schreiben, die weiche Realtime-Anforderungen erfüllen. Erlang erlaubt es selbst, den aAusführbaren Code in einem Programm zu "hotswappen", ohne das eigentliche Erlang-System zu stoppen.
Auch hier kann ich für den dynamischen Anteil wieder eine funktionale Sprache empfehlen, PureScript wirkt auch hier wunder, aber als zweite Wahl aus den selben Gründen schlage ich einfach mal noch ReasonML vor. Das wurde bei Facebook entwickelt(von dem Typen der das React-Framework erfunden hat) und ist eine auf OCaml basierende Sprache, die zu Javascript kompiliert werden kann.


Nun zum langweiligeren Teil, der Technik: du brauchst grundsätzlich einen passenden Server für deine Webanwendung, ja(Im Fall von PHP sind das beinahe immer nginx oder Apache). Welchen und wie hängt sehr von deiner Wahl ab(und deinen Anforderungen, so ist zum Beispiel nginx etwas Effizienter als Apache, aber Apache bietet weit mehr Community-Plugins) , Phoenix zum Beispiel bringt zum erst einmal rumspielen ebenso einen mit, wie Ruby on Rails. Lokal geht das je nach deiner Konfiguration natürlich, du musst dann halt deine lokale IP oder den Hostname deines Rechners kennen, dann klappt das. Nach draußen wird es schwieriger, da brauchst du entweder eine statische IP(die dir dein ISP garantiert nicht gibt) oder einen DNS-Eintrag. Ich würde für so einen Fall empfehlen, dir einfach bei Hetzner oder so ein Stückchen Bleck zu mieten, das kostet wirklich nicht die Welt, da hast du eine statische IP und bist die Sorgen für kleines Geld los. Alternativ kann man als "DNS-Ersatz" auch TOR benutzen(und die Webanwendung als Hidden Service betreiben), da hat die dann eine eindeutige, wenn auch sehr unhandliche, .onion-Adresse(auf die man nicht wirklich Einfluss nehmen kann, außer öfter neue zu generieren).

MfG
 
Danke. :) Haskell klingt gut, weil einerseits nachher tatsächlich Performance mit Nebenläufigkeit möglicherweise gefragt und mir andererseits statische Typisierung sehr sympathisch ist.

Okay, also ich installiere auf der Kiste im Wohnzimmer nginx oder Apache. Und dann? Geht das so mit meiner Idee http://www.example.com/compute.php?a=2&b=3? Falls ja, wie kriege ich dann auf Serverseite die Parameter aus der URL in mein selbstgeschriebenes Programm, sodass ich mich ans eigentliche Programmieren machen kann? Wie liefere ich das Ergebnis aus? Ich will da jetzt keine DAU-Klickanleitung, aber ich kann mir das alles wirklich noch nicht so richtig vorstellen. Würde mich da über ein Minimalbeispiel freuen.
 
Zuletzt bearbeitet:
Wenn du PHP betreiben willst ist der einfachste Weg für Anfänger sicherlich XAMPP oder vielleicht noch besser LAMP.
Yesod bringt einen eigenen Entwicklungs-Webserver mit, den du einfach ausführen kannst wenn du yesod installiert hast(idealerweise per Haskell-Stack), einen quickstart-guide findest du hier: https://www.yesodweb.com/page/quickstart . Phoenix und RoR bieten ähnliches an(auch PHP selbst, das hab ich allerdings noch niemals versucht, daher rate ich dir an dieser Stelle nicht dazu), das heißt zum Rumspielen brauchst du erst einmal keinen getrennten Webserver(im Produktivbetrieb sieht es dann anders aus, aber für die Konfiguration bin ich da wirklich kein Experte).

Zu Haskell gibt es ein ganz wunderbares Buch, "Learn You a Haskell for Great Good", zu finden hier: http://learnyouahaskell.com/
Ein ähnliches Buch gibt es auch zu Erlang(aber leider nicht zu Elixir, so weit ich weiß): https://learnyousomeerlang.com/

P.S. Ich warne dich einfach mal vor, diese funktionalen Sprachen sind bisweilen etwas akademisch(eine meiner liebsten unnötig komplizierten Definitionen ist für Haskell relevant: "All told, a monad in X is just a monoid in the category of endofunctors of X, with product × replaced by composition of endofunctors and unit set by the identity endofunctor." ), machen viel mehr Spaß wenn man ein bisschen Ahnung von Mathematik hat(oder es lernen will) UND versauern dir, wenn du einmal richtig drin bist, Sprachen wie PHP vermutlich nachhaltig :p
 
Zuletzt bearbeitet:
Dein Anwendungsfall ist so klein, dass du auch mehrere Wege ausprobieren kannst: Schreib halt erst ein kleines PHP-Skript, das die Zahlen addiert und zurückgibt, und dann noch eine Elixir-Anwendung (würde ich gegenüber Haskell bevorzugen), die dasselbe macht. Im Laufe der Umsetzung beider Lösungen merkst du dann wahrscheinlich recht schnell, was dir besser gefällt und womit du in Zukunft vielleicht noch mehr basteln möchtest.

Vielleicht mal ein paar Worte zur Umsetzung in PHP:

Server

Der Rechner kann ein kostengünstiger gemieteter Webhosting-Server, ein Rechner in deinem lokalen Netzwerk oder auch dein eigener Rechner sein. Hauptsache, dein Client findet ihn.

Webserver

Als Webserver für PHP ist wohl nach wie vor Apache der Quasi-Standard. Auf einem Linux-Server kannst du Apache direkt installieren, unter und Windows kannst du beispielsweise XAMPP verwenden.

Apache gibt eingehende Anfragen an das PHP-Modul weiter. Als Handler werden die PHP-Dateien im Web-Root verwendet. Das ist unter Linux das Verzeichnis /var/www/html oder unter XAMPP C:\xampp\htdocs. Der Einstiegspunkt in dein Programm ist dann die Datei, die angefragt wird - z. B. compute.php oder index.php, falls keine Datei angegeben wurde.

Parameter serverseitig auslesen

Apache empfängt eine HTTP-Anfrage, die unter anderem die URL-Parameter enthält. PHP bereitet die Anfrage so auf, dass du auf verschiedenen Wegen auf die in der Anfrage hinterlegten Daten zugreifen kannst.

Beispielsweise legt PHP für dich alle Parameter eines GET-Requests in einem Array namens $_GET ab. Auf deinen Parameter a könntest du dann mit $_GET['a'] zugreifen.

Der Inhalt des Parameters muss aber validiert werden. Das kann man manuell machen, einfacher ist es aber, vorgefertigte Funktionen wie filter_input() zu verwenden:

Numerischen URL-Parameter auslesen:
$a = filter_input(INPUT_GET, 'a', FILTER_SANITIZE_NUMBER_INT);

Antwort zurückliefern

Für einen Webservice würde ich kein HTML zurückliefern, sondern typischerweise JSON. Du kannst einzelne Werte oder ganze Objekte mit json_encode() zu JSON kodieren. Als Client würde ich eine Antwort in so einer oder einer ähnlichen Form erwarten:

JSON:
{
  "result": 5
}

Das bedeutet, du müsstest ein einfaches Objekt zusammenbauen, das über ein Attribut namens result verfügt - z. B. so:

Response-Objekt erstellen:
$response->result = 5;

echo json_encode($response);

Einfache Implementierung

Eine sehr einfache Lösung für deinen Webservice könnte dann insgesamt so aussehen:

Einfache Implementierung: compute.php:
<?php

$a = filter_input(INPUT_GET, 'a', FILTER_SANITIZE_NUMBER_INT);
$b = filter_input(INPUT_GET, 'b', FILTER_SANITIZE_NUMBER_INT);

if ($a === false || $b === false) {
    // $a und/oder $b sind ungültig.
    return;
}

$result = add($a, $b);
$response->result = $result;

echo json_encode($response);

function add(int $a, int $b): int {
    return $a + $b;
}

Eine schönere Lösung wäre es dann, objektorientiert zu arbeiten oder zumindest eigene Funktionen zum Auslesen der Parameter und zum Rendern der Response zu erstellen. Ab einem gewissen Umfang sind dann auch Frameworks wie Symfony sinnvoll, weil sie dir viel manuelle Arbeit abnehmen.
 
Großartig, vielen Dank! :)

Falls nochmal jemand über diesen Thread stolpert: Hier gibt's auch noch ein gutes Tutorial zu dem Thema.

/edit (Update): XAMPP ist installiert und mein Addier-Dienst läuft! :cool:
 
Zuletzt bearbeitet:
Zurück
Oben Unten