mitmario.dev

Die erste Seite

PHP Sandbox 5 Min Lesezeit 3 BeispieleLektion 2 von 7

Jetzt kommt der Wechsel, für den es diesen Kurs gibt. Neun Abschnitte lang hast du ein Skript gestartet, es lief durch, und sein Text stand im Terminal. Ab hier startet ein Webserver, dein Code beantwortet Anfragen, und das Ergebnis steht im Reiter Browser.

Was der Kurs dafür startet

PHP bringt seinen eigenen kleinen Webserver mit. Der Kurs startet ihn für dich, sobald eine Lektion einen braucht, und der Prüfknopf tippt den Befehl dafür ins Terminal, so wie bisher php index.php: php -d display_errors=1 -S 127.0.0.1:3000 -t .. Das -S mit der Adresse dahinter macht aus php einen Server. Das -d davor sorgt dafür, dass Fehlermeldungen auf der Seite stehen; dazu mehr in Lektion 10.4.

Der letzte Teil ist der interessante. -t . legt die Dokumentwurzel fest, also das Verzeichnis, in dem der Server nach Dateien sucht. Alles darin ist von außen erreichbar, alles darüber nicht. Auf einem echten Hosting-Paket heißt dieser Ordner meistens htdocs oder public_html, und die Idee ist dieselbe: Es gibt einen Bereich, den der Server ausliefert, und alles andere ist privat. In Abschnitt 16 machst du dir das zunutze.

Wichtig ist nur eines: Dieser eingebaute Server ist zum Entwickeln da, nicht für den Betrieb. Er bearbeitet immer nur eine Anfrage nach der anderen. Für einen Kurs und für deinen eigenen Rechner ist er perfekt, für eine echte Seite nimmt man Apache oder nginx. Ändern musst du an deinem Code dafür nichts.

Die Seite entsteht in dem Moment, in dem jemand fragt

Die Seite entsteht beim Aufruf
<?php

// Diese Datei ist keine HTML-Datei. Sie wird bei jedem Aufruf
// ausgefuehrt, und was sie ausgibt, geht als Antwort an den Browser.

$zeit = date("H:i:s");
$sachen = ["Kaffee", "Brot", "Äpfel"];

echo "<!doctype html>\n";
echo "<html lang=\"de\">\n";
echo "<head><meta charset=\"utf-8\"><title>Hofladen</title></head>\n";
echo "<body>\n";
echo "<h1>Hofladen</h1>\n";
echo "<p>Zusammengebaut um $zeit. Lade neu, dann steht hier eine andere Uhrzeit.</p>\n";
echo "<ul>\n";

foreach ($sachen as $sache) {
    echo "  <li>$sache</li>\n";
}

echo "</ul>\n";
echo "</body>\n";
echo "</html>\n";

Sieh dir die Uhrzeit auf der Seite an und drück dann auf Seite neu laden. Sie ändert sich. Der Browser hat noch einmal gefragt, dein Skript ist noch einmal gelaufen, und date() hat einen neuen Wert geliefert.

date() ist dabei die Funktion, die dir den aktuellen Zeitpunkt in der gewünschten Form gibt. Der Buchstabe im Argument sagt, welche: H:i:s ist Stunde, Minute, Sekunde, Y das Jahr, N der Wochentag als Zahl. Es gibt gut zwanzig solche Buchstaben, und man schlägt sie nach, statt sie zu lernen.

Das ist der ganze Unterschied zu einer HTML-Datei, und man sieht ihn hier zum ersten Mal wirklich. Eine HTML-Datei liegt fertig da, und egal wie oft du sie lädst, sie bleibt gleich. Diese Seite gab es eine Sekunde vor deinem Aufruf noch nicht.

Im Terminal steht dabei fast nichts mehr, und das ist richtig so. Deine Ausgabe geht jetzt nicht auf die Kommandozeile, sondern in die Antwort, und die liest der Browser. Im Terminal steht von nun an der Befehl, der den Server gestartet hat, und das, was der Server selbst zu melden hat.

Zwei Wege, HTML auszugeben

Dieselbe Seite, aus PHP heraus geschaltet
<?php

$zeit = date("H:i:s");
$sachen = ["Kaffee", "Brot", "Äpfel"];

// Die schliessende Marke schaltet PHP aus. Alles danach geht
// unveraendert hinaus, bis eine oeffnende Marke wieder einschaltet.

?>
<!doctype html>
<html lang="de">
<head>
    <meta charset="utf-8">
    <title>Hofladen</title>
</head>
<body>
    <h1>Hofladen</h1>
    <p>Zusammengebaut um <?= $zeit ?>. Dieselbe Seite, andere Schreibweise.</p>
    <ul>
<?php foreach ($sachen as $sache) { ?>
        <li><?= $sache ?></li>
<?php } ?>
    </ul>
</body>
</html>

Dieses Beispiel liefert dieselbe Seite wie das vorige, nur anders geschrieben. Statt jede Zeile Markup in ein echo zu packen, schaltet es PHP mit der schließenden Marke aus und schreibt das Markup einfach hin. Für die einzelnen Werte schaltet es kurz wieder ein, mit der Kurzform aus Lektion 1.3.

Für längeres Markup gewinnt diese Form fast immer, und zwar aus drei Gründen. Die Anführungszeichen im Markup musst du nicht mehr maskieren. Dein Editor färbt das HTML als HTML. Und du siehst die Struktur der Seite, statt sie aus lauter echo-Zeilen zusammenzudenken.

Die Schleife sieht dabei ungewohnt aus: Der Rumpf steht nicht im PHP-Block, sondern zwischen zwei Blöcken. Die geschweiften Klammern gehören trotzdem zusammen, PHP zählt sie über die Marken hinweg. Genau deshalb ist die Regel aus Lektion 1.3 hier so wichtig: Marken sind keine Tags, die man schließen muss, sondern ein Schalter.

Wann nimmt man dann noch echo? Wenn es um einzelne Zeilen geht, um etwas, das mitten in einer Rechnung entsteht, oder wenn du sowieso schon in einer Schleife steckst. Beides ist richtig, und beides kommt in diesem Kurs vor.

Welche Datei beantwortet welche Adresse

Welche Datei bei welcher Adresse
<?php

echo "<!doctype html>\n";
echo "<html lang=\"de\">\n";
echo "<head><meta charset=\"utf-8\"><title>Hofladen</title></head>\n";
echo "<body>\n";
echo "<h1>Startseite</h1>\n";
echo "<p>Diese Antwort kommt aus index.php.</p>\n";
echo "<p>Angefragt wurde: " . $_SERVER["REQUEST_URI"] . "</p>\n";
echo "<p><a href=\"/preise.php\">Zu den Preisen</a></p>\n";
echo "<p><a href=\"/gibtsnicht\">Und hier liegt gar keine Datei</a></p>\n";
echo "</body>\n";
echo "</html>\n";

Hier liegen zwei Dateien nebeneinander, und die Regel dahinter ist einfacher, als man denkt.

Der Pfad / nimmt die index.php. Der Pfad /preise.php nimmt genau diese Datei. So arbeitet klassisches Hosting seit dreißig Jahren: Eine Adresse ist ein Dateiname, und wer eine Seite dazu haben will, legt eine Datei an.

Klick dich im Browser durch die beiden Links, dann siehst du es. Und dann klick auf den dritten Link, der auf /gibtsnicht zeigt. Dort liegt keine Datei, und trotzdem kommt eine Seite: Der Server nimmt in diesem Fall wieder die index.php. Was du angefragt hast, steht dabei nicht verloren herum, sondern in $_SERVER["REQUEST_URI"], und die Seite gibt es aus.

Sieh dir dazu nach jedem Klick den Reiter Netzwerk an. Dort steht die Anfrage, die der Klick ausgelöst hat, mit Methode, Pfad und Statuscode, und bei allen dreien ist es eine 200, auch bei /gibtsnicht. Für den Server war das kein Fehler: Er hat eine Datei gefunden, die antwortet. Dass es die Seite eigentlich nicht gibt, weiß nur dein Programm, und wie es das der Welt mitteilt, ist der Stoff von Lektion 10.4.

Merk dir diesen Satz, denn auf ihm steht der halbe Rest des Kurses: Ein Pfad ohne passende Datei landet auf der index.php, und der echte Pfad ist trotzdem lesbar. In Lektion 10.5 baust du daraus mehrere Seiten aus einer einzigen Datei, und in Abschnitt 16 wird ein Front Controller daraus. Der Kurs muss dafür nichts umstellen, das geht von selbst.

Was der Reiter Browser kann und was nicht

Er ist ein Browser, also kann er alles, was ein Browser kann: Links folgen, Adressen in die Adresszeile tippen, neu laden, zurück und vor. Ab Abschnitt 11 kommen Formulare dazu, ab 12 sogar eine Anmeldung. Im Reiter Netzwerk daneben steht jede Anfrage, die er dabei gestellt hat, mit Methode, Statuscode und Kopfzeilen.

Zwei Grenzen solltest du kennen. Nach dem Prüfen bleibt die Sandbox als Sitzung stehen, so wie in Lektion 1.5 beschrieben: Der Server läuft weiter, jede Änderung im Editor kommt nach kurzer Zeit dort an, und die Seite zieht von selbst nach. Nach fünf Minuten, in denen du nichts tust, endet die Sitzung, eine Minute vorher sagt der Knopf Bescheid; danach steht im Browser ein Hinweis, und Sandbox starten holt alles zurück. Und beim Prüfen wird der Server frisch gestartet: Was dein Code beim letzten Mal an Dateien angelegt hat, ist dann weg.

Zum Mitnehmen

Ab hier läuft ein echter Webserver, und im Reiter Browser steht die Seite, die er ausliefert. Das ist kein Bild davon, sondern ein Browser, der wirklich anfragt: Du kannst Links anklicken, die Adresse ändern und neu laden.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 3 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.