PHP-Tipps, die Ihnen Ärger ersparen und Nutzen bringen

PHP-Tipps, die Ihnen Ärger ersparen und Nutzen bringen

PHP ist eine praktische Sprache für Web-Anwendungen, die aber auch einige Fallstricke hat. Hier lesen Sie, welche Tipps und Kniffe Ihnen den Programmierer-Alltag vereinfachen

Links eleganter einbinden

PHP-Programmierer wechseln auf ihren Seiten immer zwischen PHP- und HTML-Code. So lange man in PHP ist, müssen aber in HTML benötigte Anführungszeichen mit einem vorangestellten Backslash markiert werden. Ansonsten interpretiert PHP das Anführungszeichen als Teil des Codes.

Heraus kommen seltsame Konstrukte wie

echo “<a href=”http://www.tippscout.de/”>Tippscout</a>”;

Den Ärger mit den Anführungszeichen ersparen Sie sich, wenn Sie vor und nach dem Link jeweils die Anfangs- und Endmarkierungen für PHP-Code setzen, also:

?><a href=”http://www.tippscout.de”>Tippscout</a><?

Der Code bleibt dennoch übersichtlich und Sie klammern mit den Anführungszeichen auch eine beliebte Fehlerquelle aus.

PHP-Informationen von der Kommandozeile aus ermitteln

Sie arbeiten gerade auf der Linux-Shell und brauchen Infos über die PHP-Version? Dann tippen Sie auf der Shell einfach folgenden Befehl ein:

php -r 'phpinfo();' | less

Danach gibt es PHP-Informationen zur Version, zu den einkompilierten Modulen und so weiter.

Übrigens: Mit dem Parameter -r können Sie auch weitere Befehle interaktiv ausführen lassen. Das erlaubt den Einsatz von PHP auch in Shell-Scripts.

So entpacken Sie einzelne Dateien aus einem ZIP-Archiv

Seit einiger Zeit gibt es in PHP eine eingebaute Bibliothek für die Behandlung von ZIP-Archiven. Mit Ihrer Hilfe können Sie sauber objektorientiert Archivdateien anlegen, auslesen und entpacken.

Geht es Ihnen in einem speziellen Anwendungsfall aber nur darum, eine einzige Datei aus einem ZIP-Archiv zu extrahieren, ist der damit verbundene Aufwand zu groß.

Stattdessen nutzen Sie besser die “Zip-Streamwrapper”. Damit öffnen Sie das ZIP-File mit den normalen Funktionen fürs Dateisystem, nutzen aber einen speziellen Dateinamen im URL-Stil. Dabei wird der Protokollbezeichner zip:// vorangestellt.

Entzippen mit PHP

Beispiel einer ZIP-Datei

Angenommen, Sie wollen aus der oben dargestellten ZIP-Datei archiv.zip die Textdatei datei1.txt auf den Browser ausgeben. Dafür genügen folgende Zeilen:

if (!$fp = fopen(‘zip://archiv.zip#datei1.txt’, ‘r’))
exit (“Probleme beim Öffnen des ZIP”);
echo stream_get_contents($fp);
fclose($fp);

Wenn Sie auf die Fehlerbehandlung verzichten können, reicht sogar folgender EInzeiler

echo file_get_contents(‘zip://archiv.zip#datei1.txt’);

Dabei wird das Doppelkreuz, mit dem man bei HTML-Seiten einen anzuspringenden Textanker angibt, hier als Referenz für die gewünschte Datei verwendet.

Andere Archivtypen für das Entpacken

Der Streamtyp zip:// wird automatisch registriert, wenn Ihr PHP über die Extension Zip verfügt. Sind die Extensionen für RAR, BZip2 oder GZip installiert, funktioniert die Methode vollkommen identisch, nur mit den anderen Pseudoprotokollen rar://, bzip2:// und zlib://.

Besonders an der Nutzung von GZip-Dateien (Endung .gz) ist dabei, dass einerseits das Protokoll zlib:// anders heißt wie die Dateiendung und dass es keine Referenzierung des Dateinamens mit vorangestelltem ‘#’ gibt. Denn anders als bei ZIP oder RAR steckt in einer gz-Datei ja immer nur eine einzige Originaldatei drin.

Session-Verzeichnis nicht gefunden

PHP verwaltet Sessions in einem temporären Verzeichnis auf dem Server. Hier landet für jede Session eine eigene kleine Datei, auf die sich der Server immer wieder beziehen kann.

Wer sich einen PHP-Testserver auf Ubuntu aufbaut, wird allerdings eine Fehlermeldung bekommen: PHP findet das Session-Verzeichnis nicht und bringt eine Warnung. Außerdem funktionieren die Sessions einfach nicht.

Parameter für Session-Pfad in php.ini

Session-Pfad in php.ini einstellen

Sie können in der php.ini den Pfad für die Sessions frei einstellen. Öffnen Sie die Datei (in unserem Beispiel steckt sie in /etc/php5/apache2) und suchen Sie nach dem Eintrag session.save_path.

Entfernen Sie das Semikonolon vor dem Eintrag um ihn einzukommentieren. Dann setzen Sie einen sinnvollen Pfad. Bei unserer Ubuntu-Testinstallation ist das /var/www.

Nach dem Ändern des Eintrags speichern Sie die php.ini und starten den Apache-Server neu. Danach sollte das Session-Problem behoben sein.

Verschwundene Fehlermeldungen

Programmieren Sie in PHP auf Ihrem Testserver mit frisch installiertem PHP? Dann wundern Sie sich vielleicht, dass nie eine Fehlermeldung auftaucht.

Das liegt an einer Standardeinstellung in der php.ini. Ändern Sie dort den Eintrag display_errors auf on, erscheinen die Fehlermeldungen wieder wie gewohnt.

Fehlermeldungen in PHP einschalten

Für den Einsatz auf einem öffentlich zugänglichen Server sollten Sie display_errors auf off lassen. Das ist sicherer. Die Fehlermeldungen finden Sie, falls log_errors auf on steht, in der Fehler-Log-Datei des Apache-Servers (meist error_log).

Include-Dateien nur einmal einbinden

Je größer das Projekt, desto mehr Include-Dateien werden eingebunden. Das Dumme daran ist: Einige Include-Dateien benötigen ihrerseits weitere Includes, um zu funktionieren.

Deshalb bindet man normalerweise in die Include-Datei einen weiteren Include-Befehl ein. Doch man kommt leicht durcheinander: Irgendwann wird dann ein Include doppelt eingebunden — schwer zu behebende Fehler sind die Folge.

Abhilfe: Verwenden Sie statt include die Funktion include_once() und statt require die Funktion require_once(). Das garantiert, dass eine Datei zur Laufzeit nur einmal eingebunden wird.

 

Kaskadierte Include-Dateien optimieren

Verwendet ein PHP-Skript eine Include-Datei, die wiederum eine andere Datei lädt, dann bleibt für PHP das Verzeichnis, in dem sich das in der Hierarchie oberste Skript befindet, der Referenzordner.

Jede Include-Datei ist darum mit dem potentiellen Problem konfrontiert, dass die eine Datei laden möchte, aber nicht weiß, welcher Ordner gerade als Startordner gilt. Bei einer Anwendung, die lediglich einen einzigen Anwendungsort kennt, ist das natürlich kein Problem.

Läuft die Applikation aber auf mehreren Umgebungen, wo sie einmal im Root-Verzeichnis ders Webservers, aber ein anderes Mal in einem appliaktionspezifischen Subdirectory daheim ist, kann das zum Problem werden.

Dagegen hilft folgender Kniff:

Man verwendet zum Beispiel nicht folgende Zeile

include ‘include/config.inc.php’

sondern setzt ein Konstrukt ein wie

include dirname( __FILE__ ) .’/config.inc.php’

Die Funktion dirname ermittelt den Speicherort der aktuellen Datei, deren Name in der Spezialvariablen __FILE__ steckt (beachten Sie, die doppelten Unterstriche vor und nach “FILE”!). Obige Zeile bewirkt also, dass die include-Datei config.inc.php aus dem Verzeichnis geladen wird, in dem die aktuelle Datei liegt.

Egal von wo aus, ein Anwendungsskript die aktuelle Include-Datei lädt, die config.inc.php wird immer korrekt angesprochen.

Soll die Anwendung gleichermassen auch auf Windows-Servern laufen, empfiehlt es sich übrigens, den Schrägstrich durch die PHP-Variable DIRECTORY_SEPARATOR zu ersetzen. Die enthält das auf der jeweiligen Platform verwendete Zeichen um zwei Verzeichnisse zu trennen. Obige Zeile sähe dann so aus:

include dirname( __FILE__ ) . DIRECTORY_SEPARATOR . ‘config.inc.php’

Apache verarbeitet PHP-Dateien nicht

PHP in Ubuntu aktiviern

Durch ein Konfigurationsproblem in Ubuntu 10.4 (Lucid Lynx) kann es passieren, dass der Aufruf einer PHP-Datei des Apache-Webservers den Download-Dialog des Browsers bringt. Wenn Sie dann den Download starten und die heruntergeladene Datei öffnen, sehen Sie den PHP-Quellcode.

Der Grund ist, dass die Konfiguration des Apache den PHP-Interpreter in bestimmten Verzeichnissen abschaltet.

So schalten Sie PHP wieder ein

Öffnen Sie die Datei /etc/apache2/mods-available/php5.conf in einem Editor.

Kommentieren Sie in der Datei alle Zeilen von <IfModule mod_userdir.c> bis </IfModule> aus, so dass die Datei nun so aussieht:

<IfModule mod_php5.c>
<FilesMatch “.ph(p3?|tml)$”>
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch “.phps$”>
SetHandler application/x-httpd-php-source
</FilesMatch>
# To re-enable php in user directories comment the following lines
# (from <IfModule …> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#    <IfModule mod_userdir.c>
#        <Directory /home/*/public_html>
#            php_admin_value engine Off
#        </Directory>
#    </IfModule>
</IfModule>

Lassen Sie den Apache mittels apache2ctl restart neu starten.

Nun sollte das Problem behoben sein.

Eclipse: Automatisches Schließen von Klammern verhindern

Wenn Sie zum Programmieren die Entwicklungsumgebung Eclipse oder eine darauf basierende Variante, wie das Zend Studio einsetzen, stört Sie vielleicht eine eingebaute Komfortfunktion.

In der Grundeinstellung ergänzt Eclipse automatisch jede von Ihnen eingegebene öffnende Klammer und jedes Anführungszeichen mit dem passenden Gegenstück. Das kann aber schnell nerven. Etwa dann, wenn Sie eine komplizierten Zeile mit aneinandergehängen Zeichenketten nachträglich ändern und die vom Editor gutgemeinten selbständigen Einfügungen von Anführungzeichen das Gebilde auswuchern lassen.

So können Sie diese Funktion deaktivieren:

– Gehen Sie zum Dialog Window – Preferences

– Dort suchen Sie den Eintrag für Ihre spezielle Programmiersprache und gehen darin zu Editor – Typing. Für Zend Studio ist das etwa PHP – Editor – Typing und Java-Entwickler gehen zu Java – Editor -Typing.

– Eclipse bietet Ihnen dann auf der rechten Seite alle Klammerungsvarianten einzeln zum Deaktivieren an. Stören Sie beispielsweise nur die selbständig gesetzten Anführungszeichen, können Sie diese Option selektiv ausschalten.

Eclipse automatische Klammerung

 

Ähnliche Beiträge