Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 9 Networking
  gp 9.1 Net_IPv4
  gp 9.2 Net_IPv6
  gp 9.3 Net_FTP
  gp 9.4 Net_POP3
  gp 9.5 Net_SMTP
  gp 9.6 Net_CheckIP
  gp 9.7 Net_IDNA
  gp 9.8 Net_Curl
  gp 9.9 Net_Socket
  gp 9.10 Net_UserAgent_Detect


Rheinwerk Computing

9.3 Net_FTP  toptop


Besprochene Version: 1.3.0RC1 Lizenz: PHP-Lizenz
Klassendatei(en): Net/FTP.php

Es kann schnell mal passieren, dass Sie Daten zu einem ftp-Server übertragen müssen. Entwickeln Sie beispielsweise ein CMS, das über einen Staging- und einen Live-Server verfügt, müssen die Daten von einem Server zum anderen übertragen werden. So etwas wird gern mit ftp gemacht. Zwar sind in PHP schon Funktionen zur Nutzung des ftp-Protokolls vorgesehen, auf die die Klasse Net_FTP auch zurückgreift. Der Vorteil an dieser Stelle ist allerdings, dass die Klasse ein wenig mehr leisten kann, ein Error-Handling vorsieht und einen etwas größeren Leistungsumfang bietet.

Um eine Verbindung zu einem ftp-Server aufzubauen, benötigen Sie zuerst ein Net_FTP-Objekt. Der Konstruktor erwartet keine Parameter. Um eine Verbindung zu einem Server aufzubauen, benötigen Sie die Methode connect(), der Sie den Namen des Servers oder seine IP-Adresse übergeben. Als zweiten Parameter können Sie den Port des Servers übergeben. Geben Sie den zweiten Parameter nicht an, geht die Klasse davon aus, dass die Verbindung über den normalen ftp-Port (21) erfolgen soll.

Nachdem die Verbindung aufgebaut worden ist, müssen Sie sich gegenüber dem Server authentifizieren. Mit der Methode login() senden Sie einen Benutzernamen und das dazugehörige Passwort an den Server. In den meisten Fällen wird es sicherlich so sein, dass Sie einen Benutzer-Account auf dem Zielserver haben. Sollte es sich um einen Server handeln, der einen anonymen Zugriff erlaubt, können Sie als Benutzernamen anonymous angeben und einen String, der wie eine E-Mail-Adresse aussieht, als Passwort.

require_once("Net/FTP.php"); 
 
$server="ftp.uni-bielefeld.de"; 
 
$user="anonymous"; 
$passwort="geheim@example.com"; 
 
$ftp=new Net_FTP(); 
$res=$ftp->connect($server); // Verbindung aufbauen 
if (PEAR::isError($res)) // Ist ein Fehler aufgetreten? 
{ 
   die ($res->getMessage()); 
} 
 
$res=$ftp->login($user,$passwort); //Authentifizieren 
if (PEAR::isError($res)) // Ist ein Fehler aufgetreten? 
{ 
   die ($res->getMessage()); 
} 
 
//Weitere ftp-Befehle 
 
$ftp->disconnect();  // Verbindung beenden

Listing 9.2 Aufbau einer Verbindung zu einem ftp-Server

Wie Sie in Listing 9.2 sehen können, sollten Sie nach dem Ende der Transaktion die Verbindung zum Server wieder beenden. Andernfalls würde der Server die Verbindung noch eine bestimmte Zeit offen halten, bis sie dann irgendwann aufgrund der Inaktivität geschlossen wird.

Wie Sie in diesem kurzen Beispiel schon sehen können, liefern die Methoden im Fall eines Fehlers ein PEAR_Error-Objekt zurück. Dies gilt auch für alle anderen Methoden des Pakets.

Nachdem Sie nun wissen, wie Sie eine Verbindung aufbauen, stellt sich die Frage, was Sie mithilfe des Pakets noch alles machen können.

Zuerst ist es sicher wichtig, sich auf dem Server orientieren zu können. Den Inhalt des aktuellen Verzeichnisses können Sie mit der Methode ls() auslesen. Sie liefert die Namen aller Dateien und Unterverzeichnisse als Array zurück. Standardmäßig enthält dieses Array für jede Zeile ein weiteres assoziatives Array, das die Schlüssel hat, die Sie in Tabelle 9.1 finden.

[Die Dokumentation sagt, dass das Feld true enthält, wenn es sich um ein Directory handelt. Daher sollten Sie in der aktuellen Version testen, ob ein d oder true enthalten ist. ]
Tabelle 9.1 Aufbau des datenführenden Arrays
Schlüssel Bedeutung
Name Name der Datei
Size Größe der Datei in Byte
Rights Rechtemaske im Unix-Format
User Eigentümer der Datei
Group Gruppe, zu der die Datei gehört
files_inside Dateien, die enthalten sind; bei einer normalen Datei ist der Wert immer 1.
date Datum der letzten Änderung
is_dir Enthält ein d, wenn es sich um ein Directory handelt, und andernfalls ein false.
stamp Datum als Timestamp

Mit einer kleinen Routine wie der folgenden können Sie also den Inhalt des aktuellen Verzeichnisses auslesen und ausgeben lassen.

// Verbindungsaufbau 
 
$dir_name=$ftp->pwd();// Auslesen des Verzeichnisnamens 
$dir=$ftp->ls();// Vezeichnis auslesen 
// Tabellenkopf ausgeben 
echo "Aktuelles Verzeichnis: $dir_name<br />"; 
echo "<table border=\"1\">"; 
echo "<tr><td>Name</td> 
          <td>Gr&ouml;&szlig;e</td> 
          <td>Rechte</td> 
          <td>User</td> 
          <td>Gruppe</td> 
          <td>Dateien</td> 
          <td>Datum</td> 
          <td>Directory</td> 
          <td>Timestamp</td></tr>"; 
// Ausgabe der Daten 
foreach ($dir as $line) 
{ 
   echo "<tr><td>"; 
   echo implode($line,"</td><td>"); 
   echo "</td></tr>"; 
} 
echo "</table>";

In diesem kleinen Code-Fragment wird noch die Methode pwd() genutzt, die den Namen des aktuellen Verzeichnisses ausliest. Die Ausgabe sehen Sie in Abbildung 9.1.

Abbildung 9.1 Ausgabe des Verzeichnisses eines ftp-Servers

An dieser Stelle muss allerdings erwähnt werden, dass ls() es nicht in allen Fällen schafft, die Daten korrekt voneinander zu trennen. Solange der Server die Daten des Verzeichnisses im »normalen Unix-Stil« liefert, ist das unproblematisch. Sollte der Server ein anderes Format wählen, scheitert die Methode. In so einem Fall können Sie ihr die Konstante NET_FTP_RAWLIST als zweiten Parameter übergeben. Dann liefert sie nur ein großes Array zurück, bei dem jede Zeile in einem Array-Feld abgelegt ist. Der erste Parameter muss dann definieren, welches Verzeichnis ausgegeben werden soll. Darüber hinaus sind auch die Konstanten NET_FTP_FILES_ONLY und NET_FTP_DIRS_ONLY definiert. Mit der ersten liefert ls() nur Dateien zurück und mit der zweiten nur Informationen zu Verzeichnissen.

Um weitere Informationen zu Dateien zu erhalten, stehen die Methoden size() (zum Auslesen der Größe in Byte) und mdtm() (zum Bestimmen von Datum und Uhrzeit der letzten Änderung) zur Verfügung. Beide bekommen einen Dateinamen übergeben und können nicht bei allen FTP-Servern genutzt werden, da nicht alle die benötigten Features unterstützen. Die Funktionen liefern, wenn sie nicht mit dem Server arbeiten können, ein PEAR-Error-Objekt zurück. Anzumerken ist noch, dass die Methode mdtm() auf einigen Servern die Zeit zurückliefert, zu der die Datei angelegt worden ist, und dass Sie ihr einen Format-String, der auf den Möglichkeiten von PHPs date() basiert, übergeben können, um den normalerweise zurückgelieferten Timestamp in ein passendes Format zu bringen.

Um innerhalb des Verzeichnisbaums zu navigieren, können Sie die Methode cd() nutzen, mit der Sie das Verzeichnis wechseln können.

Natürlich können Sie auch Verzeichnisse anlegen oder löschen, wenn Ihr FTP-Account Sie dazu berechtigt. Zum Anlegen eines Verzeichnisses steht mkdir() zur Verfügung. Die Methode bekommt den Namen des Verzeichnisses, das angelegt werden soll, in relativer oder absoluter Schreibweise übergeben. Möchten Sie mehrere Verzeichnisse untereinander anlegen, können Sie den Pfad, der angelegt werden soll, komplett übergeben und als zweiten Parameter ein true nutzen, um zu bestätigen, dass alle Verzeichnisse angelegt werden sollen.

// Verbindungsaufbau 
$ftp->cd("/public_html"); // Wechselt nach public_html 
// legt neu und noch_neuer an 
$ftp->mkdir ("/public_html/neu/noch_neuer", true);

Nachdem Sie ein Verzeichnis neu angelegt haben, kann es notwendig sein, die Rechte auf das Verzeichnis zu ändern. Wie Sie sich vielleicht schon gedacht haben, ist eine Member-Funktion chmod() vorgesehen. Wie ihre Schwestermethode chmodRecursive(), die bei mehreren Verzeichnissen rekursiv die Rechte ändert, bekommt sie erst den Namen des betroffenen Verzeichnisses übergeben und dann die gewünschte Rechte-Maske als Integer-Zahl.

$ftp->chmodRecursive("neu/noch_neuer",777);

chmod() kann natürlich genau so auf Dateien angewandt werden, und chmodRecursive() ändert auch die Rechte der Dateien in dem betreffenden Verzeichnis bzw. in den Verzeichnissen.

Das Wichtigste an einem ftp-Paket ist aber sicher die Übertragung von Dateien. Vor der Übertragung müssen Sie allerdings erst den korrekten Übertragungsmodus wählen, der mit setMode() eingestellt werden kann. Übergeben Sie eine der Konstanten FTP_ASCII oder FTP_BINARY, können Sie damit den korrekten Modus aktivieren.

Für die eigentliche Übertragung stehen auch wieder Methoden zur Verfügung, deren Namen an die entsprechenden ftp-Befehle angelehnt sind. Um Dateien vom entfernten Rechner auf den eigenen herunterzuladen, sind get() bzw. getRecursive() vorgesehen. In der ersten Variante wird nur eine Datei heruntergeladen. Der Name der entfernten Datei wird als erster Parameter angegeben, worauf der Name folgt, unter dem sie lokal abgelegt werden soll. Optional können Sie mit einem dritten Parameter angeben, ob eine eventuell schon vorhandene lokale Datei überschrieben werden soll. Auch ist noch ein vierter Parameter möglich, mit dem Sie den Übertragungsmodus für diese Übertragung festlegen können. Sie können hierbei dieselben Konstanten nutzen, die auch für setMode() definiert sind. Mit der Methode getRecursive() können Sie alle Dateien herunterladen, die sich in einem Verzeichnis befinden. In der Benutzung unterscheidet sie sich nur insofern von get(), als dass sie die Pfade von Verzeichnissen und nicht die Namen von Dateien übergeben bekommt.

// Abholen der Datei quelle.php und Speichern als ziel.php 
$ftp->get("quelle.php","ziel.php",true); 
// Download dar Dateien aus quelle und Speichern in /down/ziel 
$ftp->getRecursive("./quelle/ ","/down/ziel/",true);

Bitte bedenken Sie hierbei, dass es sich um eine Übertragung von einem Server zum anderen handelt. Möchten Sie einen serverbasierenden ftp-Client erstellen, der die Daten an einen Client, sprich Browser, überträgt, reicht es, wenn Sie mit normalen Links auf die Dateien arbeiten. Das heißt: Wenn Sie beispielsweise den Inhalt eines ftp-Verzeichnisses ausgeben, können Sie einfach die Dateinamen mit Links versehen. Da Browser das ftp-Protokoll unterstützen, ist das unproblematisch.

Um eine oder mehrere Dateien an einen entfernten Server zu schicken, hat Tobias Schlitt die Methoden put() bzw. putRecursive() vorgesehen. Die beiden funktionieren wie get() und getRecursive(). Der Unterschied besteht nur darin, dass die beiden ersten Parameter in ihrer Reihenfolge vertauscht sind. Es wird also erst der Name der lokalen Datei und dann der Name der entfernten Zieldatei angegeben.

Zu guter Letzt darf nicht unerwähnt bleiben, dass Sie auf dem entfernten Server natürlich auch Dateien umbenennen, verschieben oder löschen können. Die Methode rename() kann Dateien umbenennen bzw. verschieben. Sie bekommt den Namen einer Quelldatei und den der Zieldatei übergeben und verschiebt dann die Quell- in die Ziel-Datei. Bei genauer Betrachtung handelt es sich hierbei immer um ein Verschieben und nicht um ein Umbenennen. Somit ist es auch kein Problem, die Datei in ein anderes Unterverzeichnis zu verschieben. Allerdings kommt es zu Problemen, wenn Quelle und Ziel nicht auf der physikalisch selben Festplatte liegen. Dann scheitert die Methode. In einem solchen Fall müssten die Dateien erst beim entfernten Server abgeholt, gelöscht und dann wieder neu zu ihm übertragen werden. Das Löschen können Sie mit rm() durchführen. Die Methode bekommt den Namen einer Datei oder eines leeren Verzeichnisses übergeben. Möchten Sie ein Verzeichnis inklusive Inhalt oder einen ganzen Pfad löschen, übergeben Sie als zweiten Parameter einfach ein true, und Sie können die Daten als gelöscht betrachten.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de