Teil von  SELFPHP
Professional CronJob-Service

Suche

International PHP Conference


WebTech Conference


:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP?
In über 130.000 Beiträgen finden Sie sicher die passende Antwort!  

 
PHP Summit


Software Architecture Summit


:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 
HTML5 Days


JavaScript Days


:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
FTP-Upload mit CURL

Am Ende der Seite finden Sie das komplette Beispiel als Download.

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:

/backups/meinBackup.zip

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($handleCURLOPT_URL$url);  
    
curl_setopt($handleCURLOPT_RETURNTRANSFER1);  
    
curl_setopt($handleCURLOPT_UPLOAD1);  
    
curl_setopt($handleCURLOPT_INFILE$fp);  
    
curl_setopt($handleCURLOPT_INFILESIZEfilesize($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.




 

Download

Info   ZIP BZIP2 TARGZ
Größe   1.27 Kilobyte 1.43 Kilobyte 1.35 Kilobyte

Alle Beispiele als PHP-Datei(en)

Hier haben Sie die Möglichkeit, sich sämtliche auf dieser Seite gezeigten Beispiele als PHP-Dateien direkt downzuloaden.

Umständliches Copy & Paste ist daher nicht mehr notwendig, da alle Beispiele sofort ausprobiert werden können.

Sie haben bei der Auswahl der bereitgestellten Downloads mehrere Möglichkeiten, je nachdem welches Komprimierungsverfahren Sie bevorzugen.

Zurück zur Übersichtsseite


 




:: Premium-Partner ::

Webhosting/Serverlösungen

Profihost AG weitere Premium-Partner
 

:: SELFPHP Sponsor ::

ionCube Ltd. weitere Sponsoren
 

:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 
 

Ausgewählter Tipp im Bereich PHP-Skripte


Datum/Uhrzeit von MySQL-Format ins deutsche Format und zurück

Weitere interessante Beispiele aus dem SELFPHP Kochbuch finden Sie im Bereich PHP-Skripte
 

SELFPHP Code Snippet


Den aktuellen Monat in Kalenderform darstellen

Weitere interessante Code Snippets finden Sie auf SELFPHP im Bereich PHP Code Snippets
 
© 2001-2014 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt
© 2005-2014 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de