» FTP Syncy (PHP FTP to FTP Sync/Copy Script)

Dateiupload als Multiupload + pdf aus HTMLNeuen Thread eröffnenNeue Antwort erstellenShoutbox Zeitangabe
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52420
Wohnort: Lohmar


Meine eBay-Auktionen:
23.02.2013, 23:43
zitieren

FTP Syncy holt von einer FTP Quelle Verzeichnisse und Dateien ab und gleicht sie mit den lokalen Dateien ab.

Bei Bedarf prüft das Script ob die Quelldatei neuer ist und/oder eine andere Dateigröße aufweist. Existiert die Datei lokal noch nicht wird sie vom FTP Account abgeholt.

CHMOD Rechte und Zeitstempel werden übernommen.

FTP Syncy löscht keine Dateien. D.h. wenn lokal eine Datei vorhanden ist, die auf dem Quellserver nicht existiert, dann wird diese nicht entfernt. Vom FTP Server wird natürlich nur gelesen. Allerdings werden lokal vorhandene Dateien überschrieben, sofern die Quelldatei neuer ist (und die entsprechende Option gesetzt wurde).

Ich übernehme keine Gewähr. FTP Syncy ist Beta und die Nutzung erfolgt auf eigene Gefahr.

Bitte gebt Feedback zur Funktion, auch wenn keine Fehler vorkommen. Danke!

ftpsyncy.zip
Version 0.1


zip

 Download

Dateigröße: 2,44KB
Heruntergeladen: 223 mal



Verfasst am: 23.02.2013, 23:44
zitieren

Das Ganze sieht dann übrigens so aus:

 
2013-02-24 00_43_37-maxrev.de.dedi2569.your-server.de_ftpget5.php_lf=.%2Ffiles%2F2007%2F04%2Ffrechen.png
2013-02-24 00_43_37-maxrev.de.dedi2569.your-server.de_ftpget5.php_lf=.%2Ffiles%2F2007%2F04%2Ffrechen.png - Angeschaut: 1214 mal

Verfasst am: 23.02.2013, 23:44
zitieren

Hier der Quelltext von Version 0.1 fürs Archiv und die Suche:
<?php

// settings
ini_set("display_errors", 1);// debug
ini_set('error_reporting', E_ALL);// debug
$ftp_server = "ftp.example.org";
$ftp_user = "user";
$ftp_pass = "password";
$ftp_dir = "htdocs";// use "." to copy the root directory or "dir/sub" (without ending slash) to copy a subdirectory
$local_dir = ".";// use "." to copy into the root directory or "dir/sub" (without ending slash) into a subdirectory
$ftp_passive_mode = true;// solves several problems
$files_per_cycle = 300;
$file_check_size = false;
$file_check_time = true;

// functions
function ftpexit($error_msg="") {
global $ftp;
ftp_close($ftp);
exit($error_msg . "<br />\n");
}
function _get($var, $else=null, $force=false) {
if (!$force) {
return isset($_GET[$var]) ? $_GET[$var] : $else;
}
else {
$force = array_flip($force);
return isset($_GET[$var]) && isset($force[$_GET[$var]]) ? $_GET[$var] : $else;
}
}
function permstr_dec($str) {
$str = strtr(str_pad($str, 9, '-'), array(
'-' => '0',
'r' => '4',
'w' => '2',
'x' => '1'
));
return octdec(($str[0] + $str[1] + $str[2]) . ($str[3] + $str[4] + $str[5]) . ($str[6] + $str[7] + $str[8]));
}
function format_size($value) {
$units = array(1099511627776 => 'TiB', 1073741824 => 'GiB', 1048576 => 'MiB', 1024 => 'KiB', 1 => 'Bytes');
foreach ($units as $step => $unit) {
if ($value >= $step) {
return round($value / $step, 2) . ' ' . $unit;
}
}
return 0;
}
function unix_file_type($str) {// http://en.wikipedia.org/wiki/Unix_file_types
switch ($str) {
case "-":
case "r":
case "w":
case "x":
return "file";
case "d":
return "dir";
case "l":
return "link";
case "p":
return "fifo";// named pipe
case "s":
return "socket";
case "c":
return "char";// device file for character devices
case "b":
return "block";// device file for block devices
}
return "unknown";
}
function rmdirs($dir) {
$files = glob($dir . '*');
if ($files) {
foreach ($files as $file) {
if (is_dir($file)) {
rmdirs($file . '/');
}
else {
if (!@unlink($file)) {
chmod($file, 0777);
unlink($file);
}
}
}
}
if (!@rmdir($dir)) {
chmod($dir, 0777);
rmdir($dir);
}
}
//rmdirs("example_folder/");exit;// debug
function js_redirect($url, $timeout=100) {
ftpexit("<script>window.setTimeout('location.replace(\"" . $url . "\");', $timeout);</script>");
}
function ftp_sync($ftp_dir, $local_dir, &$last_file) {
global $ftp;
global $file_check_size, $file_check_time;
global $files_per_cycle, $i;
global $start_time, $files_count, $files_size, $update_count, $insert_count;
$new_last_file = "";
//echo 'ftp_rawlist: ' . $ftp_dir . "<br />\n";
$files = ftp_rawlist($ftp, "-A " . $ftp_dir);
foreach ($files as $file) {
list($perms, $links, $user, $group, $size, $d1, $d2, $d3, $name) = preg_split('/\s+/', $file, 9);
$time = strtotime(implode(' ', array($d1, $d2, $d3)));
$type = unix_file_type($perms[0]);
$name = "/" . $name;
$perms = permstr_dec(substr($perms, 1));
// skip until last written file has been reached
if ($last_file) {
if (strpos($last_file, $local_dir . $name) === false) {
continue;
}
// last file found, skip to next file
else if ($last_file == $local_dir . $name) {
$last_file = "";
continue;
}
}
// write files
// todo: add ftp login from local server to raise permissions in creating files
switch ($type) {
case "dir":
if (!file_exists($local_dir . $name)) {
if (!mkdir($local_dir . $name, $perms, true)) {
ftpexit("Couldn't create dir " . $local_dir . $name . " ($perms)");
}
else if (!touch($local_dir . $name, $time)) {
ftpexit("Couldn't change time " . $local_dir . $name . " ($time)");
}
//echo $local_dir . $name . " created<br />\n";
}
// recursive
ftp_sync($ftp_dir . $name, $local_dir . $name, $last_file);
break;
case "file":
$i++;
$files_count++;
$create_reason = false;
if (!file_exists($local_dir . $name)) {
$create_reason = ' (did not exist)';
$insert_count++;
}
else if ($file_check_size && filesize($local_dir . $name) != $size) {
$create_reason = ' (size differed)';
$update_count++;
}
else if ($file_check_time && filemtime($local_dir . $name) != $time) {
$create_reason = ' (source was newer)';
$update_count++;
}
if ($create_reason) {
$fh = fopen($local_dir . $name, 'wb');
if (!ftp_fget($ftp, $fh, $ftp_dir . $name, FTP_BINARY)) {
fclose($fh);
unlink($local_dir . $name);
ftpexit("There was a problem while downloading " . $ftp_dir . $name . " to " . $local_dir . $name);
}
else if (!touch($local_dir . $name, $time)) {
fclose($fh);
unlink($local_dir . $name);
ftpexit("Couldn't change time " . $local_dir . $name . " ($time)");
}
fclose($fh);
chmod($local_dir . $name, $perms);
$files_size += $size;
//echo $local_dir . $name . " $create_reason<br />\n";
}
$new_last_file = $local_dir . $name;
break;
default:
ftpexit("The file $name has an unsupported filetype $type");
}
if ($i >= $files_per_cycle) {
break;
}
}
if ($i >= $files_per_cycle && $new_last_file) {
echo 'Processed: ' . $files_count . "<br />\n";
echo 'Transferred: ' . ($files_size ? format_size($files_size) : 0) . "<br />\n";
echo 'Transfer Rate: ' . ($files_size ? format_size(round($files_size / (time() - $start_time))) : "0 KiB") . "/s<br />\n";
echo 'Updated: ' . $update_count . "<br />\n";
echo 'Inserted: ' . $insert_count . "<br />\n";
echo 'Last File: ' . $new_last_file . "<br />\n";
echo 'Refresh Time: ' . date('d.m.Y H:i:s') . "<br />\n";
js_redirect($_SERVER['SCRIPT_NAME'] . '?lf=' . urlencode($new_last_file)
. '&st=' . $start_time
. '&fs=' . $files_size
. '&uc=' . $update_count
. '&ic=' . $insert_count
. '&fc=' . $files_count
);
}
}
// set vars
$i = 0;
$start_time = intval(_get("st", time()));
$files_count = intval(_get("fc", 0));
$files_size = intval(_get("fs", 0));
$update_count = intval(_get("uc", 0));
$insert_count = intval(_get("ic", 0));
$last_file = _get("lf");

echo "<b>FTP-Syncy</b><br />\n";
echo 'Start Time: ' . date('d.m.Y, H:i:s', $start_time) . "<br />\n";
echo 'Start File: ' . htmlspecialchars($last_file) . "<br />\n";

// start ftp sync
$ftp = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
if (!ftp_login($ftp, $ftp_user, $ftp_pass)) {
ftpexit("Couldn't connect as $ftp_user");
}
ftp_pasv($ftp, $ftp_passive_mode);
ftp_sync($ftp_dir, $local_dir, $last_file);

echo 'Processed: ' . $files_count . "<br />\n";
echo 'Transferred: ' . ($files_size ? format_size($files_size) : 0) . "<br />\n";
echo 'Transfer Rate: ' . ($files_size ? format_size(round($files_size / (time() - $start_time))) : "0 KiB") . "/s<br />\n";
echo 'Updated: ' . $update_count . "<br />\n";
echo 'Created: ' . $insert_count . "<br />\n";
echo 'Finish Time: ' . date('d.m.Y, H:i:s') . "<br />\n";
ftpexit();
?>

 1x  bearbeitet

Verfasst am: 23.02.2013, 23:51
zitieren

Ich habe mit dem Script übrigens dieses Forum hier transferiert. Insgesamt wurden dabei ca. 700.000 Dateien mit einer Gesamtgröße von 260 Gbyte übertragen. Probleme mit Maximum execution time (max_execution_time) gab es dabei nicht. Allerdings hatte ich in der Anfangszeit Probleme mit der FTP Verbindung als ich zu viele Dateien pro Runde verarbeiten lies. Daher ist jetzt der Passivmodus für die FTP Verbindung hinterlegt und es werden im Standard nur 300 Dateien pro Aufruf verarbeitet. Wer will kann an den Parametern Änderungen vornehmen.

 1x  bearbeitet

Verfasst am: 23.02.2013, 23:52
zitieren

Die Statistik gibt bei der "Transfer Rate" nur einen Näherungswert aus. Er wird simpel aus der Startzeit und der aktuellen Zeit berechnet. Wenn man den Sync ein zweites Mal ausführt sinkt die Transferrate daher, weil keine oder nur wenige Dateien kopiert werden bezogen auf den Gesamtzeitraum. Also nicht wundern. Das ist trotzdem schnell ;)
pn email
Gast 
23.02.2013, 23:52
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "FTP Syncy (PHP FTP to FTP Sync/Copy Script)" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Windows Sync-Software mit Instant-/Sofort-Sync?
Kennt jemand eine (kleine) App, die zwei Verzeichnisse auf Änderungen überwacht und dann fehlende Dateien kopiert? Das Microsoft Sync Toy kann zwar fein syncen, aber eben nicht automatisch, wenn eine Dateiänderungen erfolgt ist, sondern nur nach Zeitplan...
von mgutt
3
438
10.05.2016, 11:03
Dreffi
Telefonleitung / DSL Sync über PowerLAN?
Ich soll bei jemandem DSL Hybrid realisieren. Das Problem dabei ist, dass der Telefonanschluss im EG ist und nur im DG gibt es 4G Empfang. Ich hatte daher die Idee die zwei Adern des Telefonanschlusses auf LAN zu legen und dann per PowerLAN nach oben zu...
von mgutt
0
155
08.04.2019, 06:20
mgutt
Cloud App für Android mit Auto-Sync?
Hi, ich nutze aktuell Dropbox, da die die Möglichkeit haben, dass Dateien automatisch hochgeladen werden. Allerdings kann man keine Ordner auswählen. Es werden nur Bilder und Videos von der Kamera hochgeladen. Google Drive hatte ich auch mal...
von mgutt
0
360
15.05.2012, 09:40
mgutt
Sync-Software die Bilder, Videos und Musik komprimiert?
Ich habe da eine Idee bezüglich meines Problems um Dateien aus dem NAS auf allen angeschlossenen Rechnern verfügbar zu machen. Statt sie 1:1 zu synchronisieren, möchte ich auf den Rechnern nur komprimierte Versionen vorhalten. Bei Fotos hieße das, dass...
von mgutt
2
182
23.11.2012, 09:40
mgutt
Dropbox Ordner beim Sync ausschließen: Platte immer noch voll
Falls Ihr in den erweiterten Einstellung von Dropbox bestimmte Ordner für den Sync ausgeblendet habt oder Euch allgemein wundert wie groß das Dropbox Verzeichnis ist, dann solltet ihr im Windows Explorer mal auf diesen Pfad...
von mgutt
0
243
24.01.2013, 12:21
mgutt
eBay Sniper als PHP Script
Evtl. sucht ja jemand so ein Script. Hier habe ich eins gefunden, konnte es aber noch nicht...
von mgutt
0
135
03.11.2014, 13:12
mgutt
iList 1.3 Toplisten Script
Hallo. Ich habe heute die iList 1.3 von skoom.de entdeckt. http://www.skoom.de/toplist-script/ Ich habe sie mir heruntergeladen und versucht zu entpacken. Ich bekomme aber einen Fehler, dass das Archiv beschädigt sei etc. Hat jemand eine...
von situx
6
448
07.03.2012, 15:08
mgutt
Script für automatische Datei Löschung
Hallo an alle, ich habe die Aufgabe bekommen, ein Script zu erstellen was den Temp Ordner automatisch leeren soll. Dies ist ansich ja kein Problem und mit einem 2 Zeiler Batch erledigt. Nun soll dieses Script unter folgenden Bedingungen arbeiten: - Nur...
[Javascript]von Layer8User
0
220
27.03.2019, 09:19
Layer8User
Datei mittels Script herunterladen.
Habe heute mal ne Frage an die shell-script Profis. Ich habe ein script gebaut, das aus einem semantischen Wiki sowohl die semantischen MEtadaten als auch die Datei von einer Dateiseite herunterladen soll. Das Wiki ist geschlossen, d.h. das script muss...
von carchaias
0
253
14.09.2012, 10:31
carchaias
Softwareentwickler (m/w) Microsoft .Net und Java-Script
Von der kompetenten Kundenberatung, Projektierung und Installation bis hin zu individueller Software-Anpassung und Neuentwicklung, Schulung und Projekt-Betreuung, erhalten unsere Kunden ein komplexes und genau auf die individuellen Bedürfnisse...
[Jobs & Stellenangebote]von kimjob
0
291
10.06.2013, 14:41
kimjob
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |