Blockierende und nicht-blockierende Operationen

Mit all diesen Implementationen tauch ein Problem auf. Sie arbeiten sehr gut wenn
\begin{liste}
\par
\item man über eine schnelle Internetverbindung verfügt
\par
\item der Server über den man sich einklinkt aktif ist
\par
\end{liste}

Falls nicht wird das Skript blockierend warten bis ein timeout erreicht ist und erst dann mit einer Fehlermeldung abbrechen.

Das kommt daher, da normale Socket-Operationen blockierend arbeiten. Um dieses Problem zu umgehen, können die Sockets auf nicht-blockierenden Einsatz geändert werden, dazu ist die Funktion set_socket_blocking(), die als Parameter den Pointer auf den Socket bekommet und als zweiten Parameter einen boolschen Ausdruck (blockierend für wahr, nicht-blockieren für falsch).

Damit wird die Finger-Funktion:
\begin{code}
\par
\$fp = fsockopen(\$host, 79, \&\$errno, \&\$errstr) or die(''\...
...e()\textless{}\$stop)
\par
echo fgets(\$fp, 128);
\par
fclose(\$fp);
\end{code}


\begin{question}
\par
Wandeln Sie die vorgezeigten Konzepte (ping, finger) in Funktionen um
\par
\end{question}

\begin{question}
\par
Lassen Sie Funktionen nicht-blockierende Sockets verwenden
\par
\end{question}

\begin{question}
\par
Um das ganze angenehmer zu machen, bieten Sie in einem For...
...eventuelle weitere Parameter die verändert werden
könnten.
\par
\end{question}

HREF URL="mailto:bboett@adlp.org" name="Bruno Böttcher", Grundlage für dieses Dokument waren unter anderem die Vorlagen von
\begin{code}
HREF URL=''phpWizard.net/phpTidbits'' NAME=''tidbits''
\end{code}

PHP und Bildererzeugung

Bildererzeugung mit der GD-lib
\begin{diapo}{Bildererzeugung mit der GD-lib}
\end{diapo}

Achtung:

In PHP gibt es den Befehl
\begin{code}ImageGif()\end{code}
. Dieser Befehl erzeugt ein GIF-Bild. Dazu werden Funktionen aus der frei erhältlichen Bibliothek
\begin{code}gd\end{code}
verwendet. Die Firma Unisys hält die Rechte an einem Patent zur LZW-Komprimierung von Daten, die unter anderem auch bei der Erzeugung von GIF-Bilder eingesetzt wird. Da href="hcodep://corp2.unisys.com/LeadStory/lzw-license.html" Unisys die unrechtmäßige Verwendung von LZW-Komprimierung momentan mit rechtlichen Schricodeen unterbindet, ist es in der neuen Version der Bibliothek
\begin{code}gd\end{code}
nicht mehr möglich, GIF-Bilder zu erzeugen. Somit ist auch der PHP-Befehl
\begin{code}ImageGif()\end{code}
wirkungslos.

Mit PHP können wir nicht nur HTML-Text erzeugen, wir können sogar Bilder dynamisch erzeugen. Zum Beispiel können wir eine Datei "bild.php3" erstellen, die ein Bild zurückliefern wird. In diese Datei schreiben wir keine HTML-Befehle, sondern ausschließlich PHP-Befehle. Ausschließlich heißt auch, daß vor dem ersten
\begin{code}\textless{}?\end{code}
-Befehl nichts, auch kein Leerzeichen oder Leerzeile, stehen darf. Ansonsten ist der Browser sofort der Überzeugung, daß ein Textdokument ankommt.

Ein Beispiel:
\begin{code}
\textless{}?
Header( ''Content-type: image/gif'');
\$im = imagec...
...,100,\$blue);
ImageGif(\$im);
ImageDestroy(\$im);
?\textgreater{}
\end{code}

Ruft man diese Datei auf, so erscheint ein blaues Rechteck. Natürlich kann diese Datei auch mit
\begin{code}
\textless{}IMG SRC=''bild.php3''\textgreater{}
\end{code}

in eine HTML-Seite eingebunden werden.

Was bewirken obige Befehle?

Der Befehl
\begin{code}
Header( ''Content-type: image/gif'');
\end{code}

teilt dem Browser mit, daß nun ein GIF-Bild kommen wird. (Um Fehlermeldungen in unserer PHP-Datei angezeigt zu bekommen, können wir diesen Befehl auch zeitweise auskommentieren, indem wir davor ein #-Zeichen setzen.)

Der Befehl
\begin{code}
\$im = imagecreate(200,100);
\end{code}

erzeugt ein Bild, das 200 Pixel breit und 100 Pixel hoch ist.

Jede Farbe, die wir verwenden wollen, muß zuerst erzeugt werden. Dies geschieht mit dem Befehl
\begin{code}
\$blue = ImageColorAllocate(\$im, 0x2c,0x6D,0xAF);
\end{code}

Dabei bezeichnet $im das Bild, für das wir die Farbe erzeugen wollen, während die restlichen drei Parameter die hexadezimalen RGB-Werte sind. (Man beachte die Schreibweise: 0x2c ergibt den dezimalen Rot-Anteil 36.)

Mit
\begin{code}
ImageFilledRectangle(\$im,0,0,200,100,\$blue);
\end{code}

zeichnen wir ein ausgefülltes Rechteck, das bei 0,0 (links oben) beginnt und 200 Pixel nach rechts und 100 Pixel nach unten endet, und in der eben erzeugten Farbe $blue gefüllt ist.

Der Befehl
\begin{code}
ImageGif(\$im);
\end{code}

erzeugen zuerst ein GIF-Bild aus der internen Darstellung und sendet es an den Betrachter, während
\begin{code}
ImageDestroy(\$im);
\end{code}

den internen Speicherplatz für das Bild freigibt.

Es gibt nun eine Reihe von weiteren Möglichkeiten. Zum Beispiel kann noch ein Text in das Bild geschrieben werden:
\begin{code}
\$white = ImageColorAllocate(\$im, 255,255,255);
imagestring(\$im, 5, 20, 20, ''Hallo'', \$white);
\end{code}

Der erste Befehl erzeugt weiße Farbe: Man sieht, die RGB-Werte können auch als Dezimal-Werte angegeben werden. Der zweite Befehl schreibt den Text "Hallo" in Schriftgröße 5 beginnend bei Position 20,20 (20 Pixel nach rechts, 20 Pixel nach unten). Die beiden Befehle sollten direkt vor ImageGif($im); stehen.

Soweit zur Einführung in PHP. Natürlich spiegelt dies nur einen geringen Teil der Möglichkeiten von PHP wider. Aber das bisher Gelernte sollte es dem Leser ermöglichen, sich selbst im href="hcodep://../php-manual/manual.html" PHP-Handbuch neue Befehle anzueignen.

HREF URL="mailto:bboett@adlp.org" name="Bruno Böttcher", Grundlage für dieses Dokument waren unter anderem die Vorlagen von
\begin{code}
HREF URL=''mailto:Alfred.Wassermann@uni-bayreuth.de'' name=''Alfred.Wassermann@uni-bayreuth.de''
\end{code}

Schreiben Sie eine HTML-Seite, die einen PHP-Befehl enthält, der den Text:

Romanes eunt domus ausgibt.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie eine HTML-Seite, auf der 1000-mal Romanes eunt domus "richtig" geschrieben steht. HREF="http://www.stone-dead.asn.au/movies/life-of-brian/brian-08.htm" Hier ist nähere Information dazu.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie ein HTML-Formular, in das man eine Zahl eingeben kann. Klickt man auf Abschicken, wird so oft der Text aus Aufgabe 2 ausgegeben, wie diese Zahl angibt.


\begin{reponse}
\par
\end{reponse}

Aus dem vorherigen Übungen schreiben Sie das folgende Problem um damit es mit einer einzigen php-Seite gelöst wird: Schreiben Sie ein HTML-Formular, in das man eine Zahl eingeben kann. Klickt man auf Abschicken, wird so oft der folgende Text ausgegeben, wie diese Zahl angibt:

Romanes eunt domus


\begin{reponse}
\par
\end{reponse}

Erweitern Sie das vorherige Problem, bevor die Schleife gestartet wird, um einen Test in dem abgefragt wird welchen Typs die einkommende Variable ist, dieser auf Deutsch ausgegeben wird, und falls es sich nicht um einen Integer handelt, die Abarbeitung mit einer Fehlermeldung abgebrochen wird.


\begin{reponse}
\par
\end{reponse}

Ändern Sie die Lösung von Übung 2 um, damit der Typ-Test anhand eines Vektors, in dem die möglichen Typen gespeichert sind, erfolgt.


\begin{reponse}
\par
\end{reponse}

Packen Sie die Definition des Vektors in eine Datei phpLib.php3, die Sie in die Hauptdatei mit dem Beispiel einbinden. Weiterhin schreiben Sie eine HTML-Datei, die als Rahmen dient und in der Hintergrundfarbe und ein Kopfzeile (mit z.B. Firmenlogo) festgelegt sind und binden Sie diese Datei mit dem Include-Befehl in ihre Seiten ein. Z.B. können Sie damit Ihre Übungsaufgaben-Dateien mit einem einheitlichen Layout versehen.


\begin{reponse}
\par
\end{reponse}

Definieren Sie in der Datei phpLib.php3 eine Funktion die einen Integer und eine Zeichenkette als Parameter nimmt, die Zeichenkette ausgibt und bei 1 eine Fehlermeldung ausgibt und austeigt.

Benutzen sie im Programm diese Funktion für die Ausgaben, sowie die Endbedingungen.


\begin{reponse}
\par
\end{reponse}

Schreiben sie ein PHP-Skript welches über ein Formular eine beliebige Zeichenkette einliest, über GET an das gleiche Skript sendet und diese Zeichenkette ausgibt. Finden sie heraus, warum vorher gesagt wurde Anfänger sollten POST benutzen, und wie im jetzigen Fall das Skript zur Funktion gebracht werden kann (Schauen Sie im Handbuch unter "String functions" nach).


\begin{reponse}
\par
\end{reponse}

Ändern Sie die Lösung von Übung 3 so, daß der auszugebende Text über eine Datei eingelesen wird.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie ein Gästebuch.

D.h. der Benutzer kann in einem Formular einen Text eingeben. Dieser Text wird dann an eine Datei angehängt, die ausgegeben wird. HREF="http://did.mat.uni-bayreuth.de/˜wwg/guestbook.html" Hier ist ein simples Beispiel.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie mit PHP einen Zähler (Counter) für eine Seite:

Beim Aufruf der Seite wird eine Datei geöffnet. Die darin enthaltene Zahl wird nun
\begin{liste}
\par
\item gelesen,
\par
\item ausgegeben,
\par
\item um 1 erhöht und
\par
\item wieder in die Datei zurückgeschrieben.
\par
\end{liste}


\begin{reponse}
\par
\end{reponse}


\begin{reponse}
\par
\end{reponse}


\begin{reponse}
\par
\end{reponse}

Richten Sie sich eine Datenbank ein, setzen Sie die Zugriffsrechte damit der Webserver auf diese Datenbank lesen und schreiben kann. Richten sie in dieser Datenbank eine Tabelle ein die dem Format Kneipen entspricht.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie ein PHP-Programm, das aus der Tabelle
\begin{code}kneipen\end{code}
in der Datenbank
\begin{code}www2\end{code}
alle Datensätze ausgibt.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie ein HTML-Formular, das neue Datensätze in die Tabelle
\begin{code}kneipen\end{code}
in der Datenbank
\begin{code}www2\end{code}
einfügt.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie für das Kneipen-PHP-Programm eine Erweiterung, welche bedingt, daß nur einzigartige Namen für die Kneipen benutzt werden dürfen. Weiterhin soll neben der Tabelle, die Kneipe mit der höchsten Note ausgegeben werden.


\begin{reponse}
\par
\end{reponse}

Erweitern Sie Ihr Formular zur Eingabe in die Datenbank-Tabelle
\begin{code}kneipen\end{code}
: Fragen Sie mit PHP-Befehlen ab, ob alle Felder ausgefüllt sind und ob die Note zwischen 1 und 6 liegt.

Erweitern Sie Ihr Formular zur Eingabe in die Datenbank-Tabelle
\begin{code}kneipen\end{code}
: Fragen Sie mit PHP-Befehlen ab, ob alle Felder ausgefüllt sind und ob die Note zwischen 1 und 6 liegt.

Schreiben sie das Formular um, damit über ein Feld eine Note zu einer Kneipe eingegeben werden kann, über eine CheckBox Kneipe(n) ausgewählt werden und beim Submit die Note mit der schon vorhandenen gemittelt wird und in die Datenbank zurückgeschrieben wird.


\begin{reponse}
\par
\end{reponse}

Erzeugen Sie eine Datenbank admin, mit einer Tabelle news, welche ein Datum, eine einzigartige Identifikation und eine Meldung enthalten.


\begin{reponse}
\par
\end{reponse}

Erzeugen Sie eine password-geschützte Seite die es Erlaubt Neuigkeiten einzugeben. (Sie haben zwei Möglichkeiten, per php einen User und ein Password abfragen, wobei entsprechende Schutzmechanismen eingeführt werden sollten (Encryption etc.) wobei die Schutzmechanismen der Datenbank benutzt werden um den Zugang zu regeln, oder per .htaccess den Webzugriff regeln.


\begin{reponse}
\par
\end{reponse}

Erzeugen Sie eine Seite welche die Neuigkeiten in einem frei gewählten Intervall mit max 20 Einträgen pro Seite anzeigen.


\begin{reponse}
\par
\end{reponse}

Schreiben sie die Seite um, welche die Neuigkeiten aufnimmt indem Sie sie dazu erweitern bestehende Meldungen zu verändern und Meldungen bis zu einem bestimmten Datum zu vernichten.


\begin{reponse}
\par
\end{reponse}

Erzeugen Sie eine Wissensdatenbank (FAQ), wobei jeder Eintrag hierarchisch (mit beliebiger Schachtelungstiefe) in eine Kathegorie eingeordnet werden soll. Jedem Eintrag sollen (eine beliebige Anzahl) Kommentare zugeordnet werden können.


\begin{reponse}
\par
\end{reponse}

Versehen Sie obige Wissendatenbank mit einem personalisierungsmodus, lesen Sie per Cookie die Identifikation des einkommenden Gastes aus (oder sehen Sie auf der default-Seite eine Login-Methode vor, die dieses Cookie setzt), und benutzen Sie die vom Benutzer über ein geeignetes Formular eingelesenen Präferenzen um nur die Rubriken anzuzeigen, welche vom Benutzer gefordert waren.


\begin{reponse}
\par
\end{reponse}

Schreiben Sie ein PHP-Programm fuer eine HTML-Datei, das mitprotokolliert, wie oft ein Benutzer diese HTML-Datei aufgerufen hat. Verwenden Sie dazu den Cookie-Befehl.


\begin{reponse}
\par
\end{reponse}

Wandeln Sie die vorgezeigten Konzepte (ping, finger) in Funktionen um


\begin{reponse}
\par
\end{reponse}

Lassen Sie Funktionen nicht-blockierende Sockets verwenden


\begin{reponse}
\par
\end{reponse}

Um das ganze angenehmer zu machen, bieten Sie in einem Formular an den default-Server in einem Textinput an, damit dieser verändert werden kann. Desweiteren erfragen Sie eventuelle weitere Parameter die verändert werden könnten.


\begin{reponse}
\par
\end{reponse}