Systemvoraussetzung
- Linux
- Windows
- PHP 4 >= 4.0.3
- PHP 5
- CURL-Bibliothek
Datei(en)
curl_upload.php
Problem
Sie haben bereits in einem vorangegangenen Kapitel gesehen, wie Sie ein
Backup Ihrer Datenbank oder von Dateien in Ihrem Webordner erstellen können.
Sicherlich möchten Sie aber diese Backups nicht auf dem gleichen Server
speichern, sondern auf einem entfernten Backup-Server.
Die Frage ist nur, wie man die Backupdatei auf dem anderen Server sichert.
Das nachfolgende Beispiel erledigt genau diese Aufgabe. Sie können also
beide Programme kombinieren und erhalten dadurch eine vollständige Backup-Lösung.
Lösung
Wir werden in unserem Beispiel ein Backup (Upload) einer Datei auf einen
anderen Server realisieren. Der Kapitelbezeichnung CURL gemäß werden wir
dabei ausschließlich die CURL-Funktionen
nutzen.
Hier im Beispiel geht es zunächst nur um die Realisierung des Uploads und
seiner Ausgaben. In einem späteren Beispiel werden Sie sehen, wie eine Komplettlösung
aussehen könnte, also Upload, Download und Speicherung der
Info-Daten
in einer Datenbank.
function curlUpload($ftp, $ftpFile)
@param array $ftp
@param string $ftpFile
@return array $info
Die Funktion curlUpload() erwartet als Parameter zum einen ein Array mit
den Verbindungswerten (Host, Pfad, neuer Dateiname, FTP-Benutzername,
FTP-Passwort)
und zum anderen die Datei, die per Upload auf den anderen Server
kopiert werden soll.
Zuerst öffnen (35) wir die Datei, die wir später auf den anderen Server kopieren
werden. Die übermittelten Verbindungswerte aus unserem Array müssen wir
im Anschluss daran zu einem Verbindungsstring zusammenfügen (36). Der
Aufbau dieses Strings unterliegt einer Norm, die eingehalten werden muss.
ftp://BENUTZERNAME:PASSWORT@HOST:PORT/DateiMitPfadangabe |
Nachfolgend sehen Sie ein Beispiel für den zusammengesetzten String.
ftp://ftp3782637:km63TgD@nureinbeispiel4.de:21/www/curlftp/pecl5.1.2Win32.zip |
Bei der Pfadangabe ist eines zu beachten. Die Pfadangabe beginnt in Ihrem
Document-Root
(wie bei Ihrem FTP-Programm
auch). Sollte also Ihre Webpräsenz
im Ordner
/kunden/27356282/www/htdocs |
liegen, und Sie möchten die Datei meinBackup.zip in dem Ordner
/kunden/27356282/www/htdocs/backups |
speichern, so müssen Sie folgende Pfadangabe benutzen:
Wir initialisieren wieder unsere CURL-Session
(38) und setzen anhand des
Handle im weiteren Verlauf die Parameter (40-44)
für die Verbindung. Zuerst
setzen wir den Parameter (40) mit unserer URL, um überhaupt eine Verbindung
zu dem entfernten Server zu erhalten. Da wir ja einen Upload durchführen
wollen und keine Seite abfragen, müssen wir den Transfermodus (41) für diese
Verbindung deaktivieren (ungleich 0 setzen).
Im nächsten Schritt bereiten wir PHP darauf vor (42), dass es sich bei dieser
Verbindung um einen Upload handelt, um im nächsten Schritt (43) die Datei
für den Upload zu übergeben. Der letzte zu setzende Parameter bestimmt
die Dateigröße der Upload-Datei.
Die Größe müssen wir PHP vor dem Upload
mitteilen (44).
Da alle Parameter gesetzt sind, können wir jetzt den Upload starten (46) und
erhalten als Rückgabe (48) alle Informationen (wie zu Beginn des Kapitels
beschrieben) in einem Array geliefert. Wir schließen die CURL-Verbindung
(50)
und geben das Array (52) an die aufrufende Stelle zurück.
033:
034: 035: 036:
037:
038: 039: 040: 041: 042: 043: 044: 045: 046: 047: 048: 049: 050: 051: 052: 053: 054: |
function curlUpload($ftp,$ftpFile)
{
$fp = fopen($ftpFile, "r");
$url = "ftp://".$ftp['user'].":".$ftp['passwd']."@".
$ftp['host'].":21" .$ftp['pfad'].$ftp['file'];
$handle = curl_init(); curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($handle, CURLOPT_UPLOAD, 1); curl_setopt($handle, CURLOPT_INFILE, $fp); curl_setopt($handle, CURLOPT_INFILESIZE, filesize($ftpFile));
$result = curl_exec($handle);
$info = curl_getinfo ($handle);
curl_close($handle); return $info;
}
|
Beispiel 10.8: curl_upload.php
function makeInfoUpload($info)
@param array $info
@return array $infoF
Die Funktion makeInfoUpload() erwartet als Parameter das vollständige Array
mit den Informationen der zuletzt abgearbeiteten CURL-Sitzung.
Wir rechnen
in dieser Funktion lediglich die Werte für eine ansprechende Darstellung
um. Zuerst formatieren wir die durchschnittliche Übertragungsgeschwindigkeit.
Bei diesem Wert handelt es sich um Byte/Sekunde, die wir entweder in Kilobyte
oder Megabyte umrechnen wollen.
Sollte der Wert größer oder gleich 1 Million sein (65), so handelt es sich bei
der Ausgabe um Megabyte und wir formatieren die Ausgabe so, dass nur noch
zwei Stellen hinter dem Komma angezeigt werden (67). War der Wert kleiner
(68), formatieren wir ihn nach Kilobyte (70).
Genauso verfahren wir mit der Dateigröße (73). Sollte der Wert größer oder
gleich 1 Million sein (73), formatieren wir ihn nach Megabyte (75), ansonsten
nach Kilobyte (78).
Zum Schluss müssen wir nur noch die komplette Uploadzeit formatieren (81),
um danach das neue Array mit den formatierten Zeiten und Größen (83) an
die aufrufende Stelle zurückgeben zu können.
063: 064: 065: 066: 067:
068:
069: 070:
071:
072: 073: 074: 075:
076:
077: 078:
079:
080: 081:
082:
083: 084: 085: |
function makeInfoUpload($info)
{
if($info['speed_upload'] >= 1000000) {
$speed = $info['speed_upload'] / 1000000; $infoF['speed_upload'] = sprintf("%01.2f", $speed) .
' MegaByte/s';
} else {
$speed = $info['speed_upload'] / 1000; $infoF['speed_upload'] = sprintf("%01.1f", $speed) .
' KiloByte/s'; }
if($info['size_upload'] >= 1000000) {
$speed = $info['size_upload'] / 1000000; $infoF['size_upload'] = sprintf("%01.2f", $speed) .
' MegaByte/s';
} else {
$speed = $info['size_upload'] / 1000; $infoF['size_upload'] = sprintf("%01.1f", $speed) .
' KiloByte/s'; } $infoF['total_time'] = sprintf("%01.1f", $info['total_time']) .
' Sek.'; return $infoF; }
|
Beispiel 10.9: curl_upload.php
Die restliche PHP-Datei
besteht hauptsächlich aus Parametern und den Funktionsaufrufen.
Sie müssen folgende Parameter für die Verbindung aufführen:
- FTP-Benutzername
(87)
- FTP-Passwort
(88)
- HOST (89)
- Pfad (90), ausgehend vom Document-Root
- Datei (91) Pfadangabe inkl. dem neuen Dateinamen
- Uploaddatei (92), die zu kopierende Datei
Sind alle Parameter gesetzt, können Sie den Upload starten (94) und erhalten
als Rückgabewert ein Array mit den Informationen der CURL-Verbindung.
Sie
können nachfolgend noch die Informationen formatieren (96), da die Werte in
Byte vorliegen und die Zeiten ebenfalls nicht formatiert sind.
087: 088: 089: 090: 091: 092: 093: 094: 095: 096: 097: 098: 099: 100: 101: | $ftp['user'] = 'ftp1042434-test';
$ftp['passwd'] = 'up24TzF'; $ftp['host'] = 'nureinbeispiel4.de'; $ftp['pfad'] = '/www/'; $ftp['file'] = 'curlftp/pecl-5.1.2-Win32.zip'; $ftpFile = 'pecl-5.1.2-Win32.zip';
$info = curlUpload($ftp,$ftpFile);
$infoF = makeInfoUpload($info);
echo 'Dateigröße: ' . $infoF['size_upload'] . '<br>'; echo 'Geschwindigkeit: ' . $infoF['speed_upload'] . '<br>'; echo 'Gesamtzeit: ' . $infoF['total_time'] . '<br><br>'; print_r($info);
|
Beispiel 10.10: curl_upload.php
Wie Sie sehen, war der Upload auch hier relativ einfach. Die Informationen
könnten Sie z. B. in eine Datenbank speichern und statistisch auswerten. Zusätzlich
können Sie die Datei mit einem CronJob verknüpfen, der dann täglich
die Backupdatei auf dem Backup-Server
speichert. Sie werden später in diesem
Buch eine derartige Lösung vorgestellt bekommen.
Ausgabe im Browser
Dateigröße: 1.71 Megabyte/s
Geschwindigkeit: 2.43 Megabyte/s
Gesamtzeit: 0.7 Sek. |
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|