mitmario.dev

Wie ein Lauf hier funktioniert

PHP Sandbox 7 Min Lesezeit 5 BeispieleLektion 5 von 6

Du hast jetzt viermal auf einen Knopf gedrückt und etwas zurückbekommen. Diese Lektion erklärt, was in der Zwischenzeit passiert, denn ein paar Eigenheiten dieser Umgebung wirst du sonst für Fehler in deinem Code halten.

Was beim Klick passiert

Dein Code läuft nicht in deinem Browser. Er läuft auf einer echten Maschine in einem Rechenzentrum, und die gibt es vorher nicht.

Beim ersten Lauf einer Lektion wird sie gestartet, und danach läuft dein Code darauf genau so, wie er auf irgendeinem anderen Rechner laufen würde: php index.php, und heraus kommt, was das Programm schreibt.

Deshalb ist der erste Lauf spürbar langsamer als die folgenden. Das ist kein Hänger, das ist eine Maschine, die hochfährt. Machst du eine Weile nichts oder verlässt du die Lektion, verschwindet sie wieder. Und was du in einer Lektion an Dateien hinterlässt, ist in der nächsten weg: Jede Aufgabe bringt alles mit, was sie braucht.

Deine Ausgabe steht im Terminal

Ein Lauf, der durchgeht
<?php

echo "PHP-Version: " . PHP_VERSION . "\n";

$zahlen = [3, 8, 4];
echo "Summe: " . array_sum($zahlen) . "\n";
echo "Größte: " . max($zahlen) . "\n";

Unter dem Editor liegt das Terminal, und dort passiert die Arbeit. Der Prüfknopf tippt seinen Befehl hinein, so als hättest du ihn selbst geschrieben, und darunter wächst die Ausgabe. Hier sind das drei Zeilen, und sie stehen auch als drei Zeilen da.

Du kannst dort selbst tippen. Tipp einmal php index.php und schau, was passiert: genau dasselbe. Der Prüfknopf kann nichts, was du nicht auch könntest. Abtippen musst du es nicht einmal: Unten im Terminal liegt die Befehlsleiste mit den Befehlen, um die es in der Lektion gerade geht. Ein Klick schreibt den Befehl in die Eingabezeile, ändern darfst du ihn noch, Enter drückst du selbst.

Ein Lauf, der eine Seite ausgibt
<?php

$titel = "Einkaufsliste";
$sachen = ["Milch", "Brot", "Kaffee"];

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

Und hier etwas anderes. Derselbe Weg, dasselbe echo, nur besteht die Ausgabe diesmal aus HTML, und statt im Terminal steht sie rechts im Reiter Browser, als Überschrift mit einer Liste darunter.

Der Grund ist nicht der Code, sondern wer fragt. Bei diesem Beispiel läuft ein kleiner Webserver, und der Browser rechts fragt ihn wirklich an; was er zurückbekommt, versteht er als Seite. Die Seite ist ungestaltet, und das liegt nicht am Browser: Es gibt kein CSS, weil du keins ausgegeben hast.

Bis Abschnitt 9 ist das die Ausnahme, ab Abschnitt 10 die Regel. Auf der Kommandozeile schreibt dein Programm Zeichen, und die stehen im Terminal. Ein Server beantwortet eine Anfrage, und die Antwort steht im Browser. Welcher Fall gilt, sagt dir die Lektion, und ab Abschnitt 10 entscheidest du es selbst, mit einer Zeile in deinem Programm.

Wenn etwas schiefgeht

Ein Lauf, der abbricht
<?php

echo "Bis hierhin läuft alles.\n";

$teiler = 0;
echo 10 / $teiler;

echo "Diese Zeile kommt nicht mehr.\n";

Die erste Zeile steht da, die letzte nicht, und darunter in Rot die Meldung von PHP: was passiert ist, in welcher Datei, in welcher Zeile.

Die Farbe hat einen Grund. Das sind zwei getrennte Kanäle, und das Rote ist der Fehlerkanal, genau wie in 1.4. Deine Ausgabe bleibt dadurch sauber, auch wenn etwas schiefgeht, und du siehst auf einen Blick, was dein Programm geschrieben hat und was PHP dazu zu sagen hatte.

Die Flächen um den Editor herum

Weil das gleich wichtig wird, hier einmal sauber getrennt.

Die Prüfliste steht in der Aufgabe direkt unter dem Text und beantwortet: Zählt es? Im Terminal unter dem Editor steht, was ausgeführt wurde, und was dabei herauskam. Das sind die beiden Flächen, mit denen du die nächsten neun Abschnitte arbeitest.

Rechts stehen vier weitere Reiter, und drei davon kommen ab Abschnitt 10 wirklich zum Einsatz. Der Browser zeigt eine Seite, die ein Server ausgeliefert hat. Im Reiter Netzwerk stehen die Anfragen, die er dafür gestellt hat: welcher Pfad, welche Methode, welcher Statuscode, welche Kopfzeilen. Der Reiter Console zeigt, was das JavaScript einer Seite meldet; in diesem Kurs schreibst du keins, er bleibt also fast immer leer.

Der vierte ist der Reiter Debug, und der geht schon jetzt. Ein Druck auf Aufzeichnen, und dein Programm läuft noch einmal, diesmal mit einer Meldung vor jeder Zeile: was in diesem Moment in deinen Variablen stand. Danach blätterst du durch die Liste, und der Editor springt mit. Die Namen stehen dort ohne das Dollarzeichen. Es ist ein eigener Lauf und kostet darum so viel wie jeder andere, und aufgezeichnet wird die Datei, die im Editor gerade vorn liegt. Ab Abschnitt 10 beginnt jeder Schub von Schritten mit einer Anfrage, und über den Schritten steht, welche.

Ein Lauf mit zwei Dateien
<?php

echo "<h1>Impressum</h1>\n";
echo "<p>Diese Seite kommt aus einer zweiten Datei.</p>\n";
echo "<p><a href=\"/\">Zurück zur Startseite</a></p>\n";

Dieses Beispiel ist wieder eines mit Server, und daran siehst du drei Dinge auf einmal.

Über der Seite steht eine Adresse. Der Link zum Impressum funktioniert, und die Adresse wandert mit, so wie in jedem Browser. Und wenn du auf Seite neu laden drückst, steht da eine andere Uhrzeit: Die Seite entsteht bei jeder Anfrage neu, und genau darum geht es in diesem Kurs.

Sieh dir dabei den Reiter Netzwerk an. Dort steht / und nach dem Klick /impressum.php, jeweils mit Statuscode und Größe. Das ist kein Protokoll, das wir für dich führen, sondern das, was der Browser daneben wirklich geladen hat.

Zwei Werkzeuge aus den Kursen davor gibt es auch hier. Das Fadenkreuz in der Browser-Leiste ist der Inspector: Zeig damit auf ein Element der ausgelieferten Seite, und im Auskunftsstreifen darunter stehen seine Maße und seine berechneten Werte. Und unter den Console-Zeilen steht die Eingabezeile der Console, in die du einen Ausdruck tippen kannst; er läuft in genau der Seite, die gerade rechts steht. Auf einem schmalen Bildschirm fehlt das Fadenkreuz, wie in den Kursen davor.

Eine Ausnahme gibt es, und sie trifft nur diesen Kurs: Liegt im Ordner eine fertige .html-Datei und rufst du sie direkt auf, liefert der Entwicklungsserver sie aus, ohne PHP überhaupt zu starten. Die Seite steht dann rechts, beide Werkzeuge bleiben aber stumm. Auf allem, was durch PHP läuft, gehen sie. Gebraucht werden sie hier ohnehin seltener als im CSS-Kurs: Was der Browser geladen hat, steht wie eben im Reiter Netzwerk, und ab Abschnitt 10 fragst du den Server im Terminal direkt.

Warum nichts von selbst läuft

In den Kursen davor lief deine Seite bei jedem Tastendruck neu. Hier nicht.

Der Grund ist banal: Jeder Lauf kostet Rechenzeit in einem Rechenzentrum, und die kostet Geld. Immer automatisch zu starten wäre eine Maschine pro Tastendruck. Also gilt: ein Klick, ein Lauf, solange du nichts anderes sagst.

Die Laufzeit zählt dabei auf ein Kontingent, das jeden Monat neu beginnt: 1 Stunde mit dem Basis Konto, 60 Stunden mit dem Premium Konto. Lesen, die Beispiele im Editor ansehen und die Abschnittstests kosten nichts davon. Wie viel übrig ist, siehst du in jeder Lektion mit Sandbox und unter „Nutzung” in deinem Konto; ist es aufgebraucht, geht es mit dem Premium Konto sofort weiter, sonst im nächsten Monat.

Sagen kannst du es mit Sandbox starten. Dann bleibt die Maschine stehen, solange du an ihr arbeitest, und jede Änderung im Editor ist nach kurzer Zeit auch dort. Der Knopf heißt dann Sandbox beenden; nach fünf Minuten, in denen du nichts tust, endet sie von selbst, und der Knopf sagt eine Minute vorher Bescheid.

Was dabei nicht passiert: Dein Programm läuft nicht bei jedem Tastendruck neu. Die Dateien sind aktuell, gelaufen wird auf deinen Wunsch, mit Prüfen oder mit php index.php im Terminal. Ab Abschnitt 10 ist das anders, dort läuft ein Server durchgehend, und die Seite rechts zieht von selbst nach.

Praktisch heißt das, dass sich eine andere Gewohnheit lohnt als im Browser. Lies deinen Code einmal durch, bevor du drückst. Und wenn du wissen willst, was in einer Variablen steht, gib sie aus, statt zu raten und noch einmal zu starten.

Warum es kein Netz gibt

Ein Lauf, der ins Netz will
<?php

echo "Ich hole etwas aus dem Netz.\n";

$inhalt = file_get_contents("https://mitmario.dev/lernen");

echo "Bekommen: " . strlen((string) $inhalt) . " Zeichen\n";

Der Versuch scheitert, und zwar nicht wegen eines Tippfehlers. Die Maschine hat keine Verbindung nach draußen, in keine Richtung.

Das ist Absicht und zwar aus zwei Gründen. Erstens läuft dort fremder Code, nämlich deiner, und ein Programm ohne Netz kann nichts anrichten, was über sich selbst hinausgeht. Zweitens wäre eine Aufgabe, die von einer Seite im Internet abhängt, keine gute Aufgabe: Sie wäre morgen kaputt, weil sich woanders etwas geändert hat.

Ausnahmen gibt es keine, auch nicht in Abschnitt 9, wo es um Composer geht. Die Pakete, die dieser Kurs braucht, liegen fertig in der Maschine und werden ausgepackt, bevor dein Code startet. Kein Schritt dieses Kurses holt etwas aus dem Netz.

Was ein grüner Haken behauptet

Zum Schluss etwas, das man einmal klar sagen sollte.

Ein grüner Haken heißt: Diese eine Behauptung hat für diesen einen Lauf gestimmt. Er heißt nicht, dass dein Code gut ist, und auch nicht, dass er in jedem Fall funktioniert. Er ist eine Messung, und Messungen prüfen das, was gemessen wird.

Geprüft wird dabei immer das Ergebnis und nie der Wortlaut deines Codes. Es gibt in keiner Aufgabe eine erwartete Lösung, die du treffen musst. Wenn dein Weg das verlangte Ergebnis liefert, ist er richtig, auch wenn er ganz anders aussieht als der aus der Lösung.

Und wo es nichts ehrlich zu prüfen gibt, steht auch keine Aufgabe. Diese Lektion ist so eine: Über das Verhalten einer Maschine kann man lesen, aber man kann es nicht abfragen.

Zum Mitnehmen

Diese Lektion hat keine Aufgabe. Die Beispiele sind zum Anschauen da: sie zeigen die Umgebung, nicht die Sprache.

Jetzt du

Basis Konto, kostenlos

Im Editor änderst du die Beispiele dieser Lektion und lässt sie gleich laufen. So merkst du am schnellsten, ob es sitzt.

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 5 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.