FTP Listing inklusive Speicherung...optimierung

strex

Erfahrenes Mitglied
Hi Leute,

ich hab ein Script geschrieben, dass einen FTP ausliest und die enthaltenen Dateien in eine DB einträgt. Leider trägt dies öfters doppelt die Datei ein und zweitens braucht das für das auslesen doch längere Zeit.

Wie behebe ich diese Fehler?

Danke für eure Hilfe!

Grüße strex

PHP:
<?
include("dbconnect.php");

//FTP
$ftp = "xxx";
$user = 'xxx';
$pw = 'xxx';

//OTR-FTP Verzeichnisse
$Verzeichnisse = array("dvbotr01","dvbotr02","dvbotr03","dvbotr04","dvbotr05","dvbotr06","dvbotr07","dvbotr08","dvbotr09","dvbotr10","dvbotr11","dvbotr12","dvbotr13",
                       "dvbotr14","dvbotr15","dvbotr16","dvbotr17","dvbotr18","dvbotr19","dvbotr20","dvbotr21","dvbotr22","dvbotr23","dvbotr24","dvbotr25");

//Bad Files, die nicht eingetragen werden sollen
$bads = array("index.txt","done");


function logg($str) {
  $pref = "[> FTP <]";
  $time = date("H:i:s");
  echo("(".$time.")".$pref." >> ".$str."\r\n");
}

@set_time_limit(0);
$verbindung = @ftp_connect($ftp);
logg("*** Verbindung zu FTP-Server ".$ftp." wird hergestellt.<br>");
$fehler=false;
if(!$verbindung) {
	logg("*** Konnte kein Verbindung zu FTP-Server herstellen.<br>");
	@ftp_quit($verbindung);
	$fehler=true;
	die();
} else {
	$login = @ftp_login($verbindung, $user, $pw);
	logg("*** Verbindung zu FTP-Server hergestellt. Anmeldung läuft.<br>");
	if(!$login) {
		logg("*** Benutzername oder Passwort falsch.<br>");
		@ftp_quit($verbindung);
		$fehler=true;
		die();
	}
}

if(!$fehler) {

$sql = mysql_query("SELECT `otrkey`, `pfad` FROM `otrlist` WHERE `status` = '0' AND `server` = '$ftp' ORDER BY `time` DESC");
     while ($data = mysql_fetch_row($sql)) {

             $ftpsize = @ftp_size($verbindung, $data[1]);
	   
	   if($ftpsize == -1){
	   $sql2 = mysql_query("UPDATE `otrlist` SET `status` = '10' WHERE `otrkey` = '$data[0]'");
	   logg("*** <b>OTRKEY-STATUS</b>: $data[0] wurde als nicht mehr existent makiert<br>");  
	 }else{
	  logg("*** <b>OTRKEY-STATUS</b>: $data[0] ist noch auf dem OTR-Server vorhanden<br>"); 	  
	 }
	}    

	foreach($Verzeichnisse as $Verzeichnis) {
		if(@ftp_chdir($verbindung, "/$Verzeichnis")) {
			logg("*** Betrete Verzeichnis ".$Verzeichnis."<br>");
			$dateien = @ftp_nlist($verbindung, ".");
			foreach($dateien as $datei) {
				$DateiGroesse = @ftp_size($verbindung, "/$Verzeichnis/$datei");
				$filetime = @ftp_mdtm($verbindung, "/$Verzeichnis/$datei");
				
				$on=false;
				
				$sql = mysql_query("SELECT otrkey FROM `otrlist` WHERE `otrkey` = '$datei' LIMIT 1");
                $file_check = mysql_num_rows($sql);
				
				  if($file_check == 1){
				     logg("*** <b>OTRKEY</b>: $datei ist schon in der DB<br>");  
				     $on=true;
				  }
				  foreach($bads as $badfile) {
				     if($datei == $badfile){
				        $on=true;
				     }
				     if (strstr($datei, '.info')) {
				        $on=true;
				     }
				  }
				  $sql = mysql_query("SELECT otrkey FROM `otrlist` WHERE `otrkey` = '$datei' LIMIT 1");
                  $file_check = mysql_num_rows($sql);
				  if($file_check == 1){
				     logg("*** <b>OTRKEY</b>: $datei ist schon in der DB<br>");  
				     $on=true;
				  }
				if(!$on and $file_check == 0){
				    $timestamp = time();
					$pfad = "/$Verzeichnis/$datei";
                    $status = 0;
					
					$sql = mysql_query("SELECT otrkey FROM `otrlist` WHERE `otrkey` = '$datei' LIMIT 1");
                    $file_check = mysql_num_rows($sql);
				
				   if($file_check == 0 && $sql == true){
				    $sql = mysql_query("INSERT INTO otrlist (otrkey, dir, pfad, size, time, status, server, filetime) VALUES ('".$datei."','".$Verzeichnis."','".$pfad."','".$DateiGroesse."','".$timestamp."','".$status."','".$ftp."','".$filetime."')");
					   if($sql == true){
                          logg("*** <b>OTRKEY</b>: $datei eingetragen<br>");
                       }else{
                          logg("*** <b>OTRKEY-Fehler</b>: $datei nicht eingetragen<br>");
                      }  
				   }else{
				   
				    logg("*** <b>OTRKEY</b>: $datei Filecheck nicht möglich abbruch<br>");
				   }
				}
			}
		}
	 @ftp_chdir($verbindung, "../");
    }
 }
@ftp_quit($verbindung);
 
Einfach gesagt: Modifiziere die Spalte in der DB, die den Datennamen darstellt als UNIQUE. Dann haste keine doppelten Dateinamen drin.

Das Auslesen der Quelle dauert halt so lange wie es dauert, ich wüsste nicht, wie man es verschnellern sollte. Wenn ein Webserver auf der Kiste liegt, die den FTP hostet, kannst du vllt über ein PHP-Script auf dem FTP-Server den Dateisystem-Inhalt deines FTP-Servers als TXT zur Verfügung stellen, welche du dann auf dem Server mit der MySQL-DB abrufst und parst.

Das hat vor allem den Vorteil, das du das PHP-Script des Dateisystem auslesens als Cronjob starten kannst, was bspw. stündlich ausgeführt wird.
 
Ok, zur verhinderung von doppelten Einträgen werde ich mir zu brust nehmen.

Auch hätte ich eine index.txt im root-verzeichniss, dass mir das Dateisystem anzeigt, inhalt sieht so aus:

dvbotr01/Wie_soll_man_Dr_Mracek_ertraenken_07.07.23_13-30_rbb_85_TVOON_DE.mpg.avi.otrkey
dvbotr01/Wilder_Amazonas_07.07.10_04-30_zdfdoku_45_TVOON_DE.mpg.avi.otrkey
dvbotr01/Grisu_der_kleine_Drache_07.07.11_04-00_nickelodeon_20_TVOON_DE.mpg.avi.otrkey
dvbotr01/Zoey_101_07.07.15_11-30_nickelodeon_30_TVOON_DE.mpg.avi.otrkey
dvbotr01/mare_TV_Monsterkrabben_im_Polarmeer_07.07.25_11-15_ardeinsfestival_45_TVOON_DE.mpg.avi.otrkey
dvbotr01/Rundflug_Thueringen_07.07.17_03-50_mdr_15_TVOON_DE.mpg.avi.otrkey
dvbotr01/American_Chopper_07.07.11_00-05_dmax_100_TVOON_DE.mpg.avi.otrkey
dvbotr01/Planet_Wissen_07.07.18_07-20_wdr_60_TVOON_DE.mpg.avi.otrkey

Wie soll ich hier ansetzten, hab keine Ahnung, wie zerlege ich den Pfad und den Dateiname. Kann mir gerade nicht vorstellen wie ich das machen sollte. Aber die größe kann ich aber nicht mehr auslesen bzw. müsste das pro File extra machen?

Danke für deine Hilfe!

Grüße strex
 
Mit file_get_contents() den Inhalt und in array splitten oder gleich file() verwenden, das gibt die Datei als Array zurück, jedes Element ist eine Zeile.

Dieses Array durchläufst du mit foreach, bei jedem Durchlauf haste eine Zeile. Diese Zeile splittest du nun mit explode bspw. oder anderen Techniken (str* oder regex) auf. Mit explode könntest du es so machen:

$teile = explode('/', $zeile);

Nun haste in Teile den Pfad und den Dateinamen. Wenn du verschachtelte Unterverzeichnisse hast, werden die Teile immer mehr. An das letzte Teil, welches den Dateinamen darstellen sollte, kannst du so kommen

echo $teile[ count($teile) -1 ];

Viele Grüße
 
Danke werde ich mal in den kommenden Tage ausprobieren. Werde mich dann nochmals melden.

Doppelte Einträge habe ich per: ALTER IGNORE TABLE otrlist ADD UNIQUE INDEX key (otrkey) gelöst.

Danke!

Grüße strex
 
Hab das jetzt einmal angepasst, leider gibt er nur unregelmäßig Dateigröße und Dateizeit aus.

Warum macht er das?

Ausgabe:

Code:
String: dvbotr01/Was_der_Bauer_nicht_kennt_07.08.07_09-00_wdr_60_TVOON_DE.mpg.avi.otrkey Dir: dvbotr01 File: Was_der_Bauer_nicht_kennt_07.08.07_09-00_wdr_60_TVOON_DE.mpg.avi.otrkey Size: 476315012 Time: -1
String: dvbotr01/Auf_schlimmer_und_ewig_07.08.04_16-30_comedycentral_30_TVOON_DE.mpg.avi.otrkey Dir: dvbotr01 File: Auf_schlimmer_und_ewig_07.08.04_16-30_comedycentral_30_TVOON_DE.mpg.avi.otrkey Size: -1 Time: -1
String: dvbotr01/Unfabulous_07.07.30_08-30_nickelodeon_30_TVOON_DE.mpg.avi.otrkey Dir: dvbotr01 File: Unfabulous_07.07.30_08-30_nickelodeon_30_TVOON_DE.mpg.avi.otrkey Size: -1 Time: 1186242280
String: dvbotr01/Auf_schlimmer_und_ewig_07.08.10_08-25_comedycentral_25_TVOON_DE.mpg.avi.otrkey Dir: dvbotr01 File: Auf_schlimmer_und_ewig_07.08.10_08-25_comedycentral_25_TVOON_DE.mpg.avi.otrkey Size: -1 Time: -1
String: dvbotr01/Expedition_Wissen_07.08.03_01-15_zdfdoku_30_TVOON_DE.mpg.avi.otrkey Dir: dvbotr01 File: Expedition_Wissen_07.08.03_01-15_zdfdoku_30_TVOON_DE.mpg.avi.otrkey Size: 2147483647 Time: -1


PHP:
//OTR-FTP
$ftp = "xxx";
$user = 'xxx';
$pw = 'xxx';

function logg($str) {
  $pref = "[> FTP <]";
  $time = date("H:i:s");
  echo("(".$time.")".$pref." >> ".$str."\r\n");
}

$files = @file('ftp://xxx:xxx@xxx/index.txt');

@set_time_limit(0);
$verbindung = @ftp_connect($ftp);
logg("*** Verbindung zu FTP-Server ".$ftp." wird hergestellt.<br>");
$fehler=false;
if(!$verbindung) {
	logg("*** Konnte kein Verbindung zu FTP-Server herstellen.<br>");
	@ftp_quit($verbindung);
	$fehler=true;
	die();
} else {
	$login = @ftp_login($verbindung, $user, $pw);
	logg("*** Verbindung zu FTP-Server hergestellt. Anmeldung läuft.<br>");
	if(!$login) {
		logg("*** Benutzername oder Passwort falsch.<br>");
		@ftp_quit($verbindung);
		$fehler=true;
		die();
	}
}

if(!$fehler) {
foreach($files as $file) {
   $teile = explode('/', $file);
      @ftp_chdir($verbindung, "/$teile[0]");
	     $DateiGroesse = @ftp_size($verbindung, "/$teile[0]/$teile[1]");
		     $filetime = @ftp_mdtm($verbindung, "/$teile[0]/$teile[1]");
                 echo "String: $file Dir: $teile[0] File: $teile[1] Size: $DateiGroesse Time: $filetime<br>";
 }

}
@ftp_quit($verbindung);
 
Zurück