pclzip

jenno

Erfahrenes Mitglied
Wer benutzt diese library und kann mir vielleicht weiterhelfen?

Ich habe ein Script, welches verschiedene Dateien zippen und anschliessend auf den Server uploaden soll. Dieses Script funktioniert jedoch nur ungefähr jedes 5. Mal. Meistens fliegt er raus beim hinzufügen einer Datei von ca. 24 MB. Jedoch funktioniert das eben auch manchmal. Bin etwas ratlos.
 
Oder hat jemand vielleicht ein anderes Skript, welches ich zum zippen von Dateien benutzen kann?
 
jenno hat gesagt.:
Ich habe ein Script, welches verschiedene Dateien zippen und anschliessend auf den Server uploaden soll. Dieses Script funktioniert jedoch nur ungefähr jedes 5. Mal. Meistens fliegt er raus beim hinzufügen einer Datei von ca. 24 MB. Jedoch funktioniert das eben auch manchmal. Bin etwas ratlos.
  1. ohne Code können wir dir nicht helfen,
  2. vielleicht hilft dir ja dass http://de2.php.net/manual/de/ref.zip.php.
mfg
forsterm
 
Deswegen ja die Nachfrage, ob jemand diese library benutzt.
Nun gut, ich habe sie jetzt mit angehängt. An der library selbst habe ich aber absolut nichts gemacht. Es funktioniert ja auch manchmal, nur eben nicht immer.

Meine Vermutung ist, dass es etwas mit der Grösse der zu packenden Dateien zu tun hat. Wie gesagt, die Datei aangifte.csv ist ca. 24 MB gross. Ich hab sie jetzt schon aus der Schleife, in der alle Datenbanktabellen in Dateien geschrieben und anschliessend gezippt werden, herausgeholt und erstelle und packe diese Datei extra. Leider hat das nichts gebracht.

Hier noch mein Skript, in dem ich diese library benutze (gekürzte Version). Kurzer Ablauf des Skriptes:
- auf zwei Servern (lokal + remote) werden zwei Ordner rekursiv verglichen
- wenn die Dateien lokal aktueller sind oder remote nicht existieren, werden sie zum zip Archiv zugefügt
- zum selben Archiv wird die Datei aangifte.csv hinzugefügt
- von allen übrigen Datenbanktabellen werden Backupdateien angelegt (tabellenname.csv) und diese dann auch dem Archiv zugefügt
- das gesamte zip Archiv wird per ftp auf den remote Server geschickt und dort entpackt
- auf dem remote Server wird die Datenbank aktualisiert

PHP:
<?
//otherwise timeout
set_time_limit(300);  
  
///////////////////////////////////////////////////////////  
// INCLUDE FILES
///////////////////////////////////////////////////////////
//variables to be set
include_once("config.inc");
//collection with local functies
include_once("funkties_local.inc"); 
//SOAP functionality 
include_once("nusoap.inc");
//zip package
include_once("pclzip-2-3/pclzip.lib.php");
///////////////////////////////////////////////////////////
//END INCLUDE FILES
///////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////
//BACKUP FILES
///////////////////////////////////////////////////////////

//new soapclient object: get content from remote directory
$client = new soapclient("http://##URL##/soap_GetDirContent.php");
$dirContent = $client->call("getDirContent",
														array("root"=>"aangiftebiljet"));
$dirContent = unserialize($dirContent);			

//get content from local directory
$localfilesArr = getDirContent($absRoot);
$tempDirName = time();
$archive = new PclZip($tempDirName.".zip"); 
$countadded = 0;

//all local files 
foreach($localfilesArr as $value) {
	
	$sizeLocal = $value['size'];
	$sizeRemote = $dirContent[$value['relRoot']]['size'];
	$lastmodLocal = strftime("%d.%m.%Y %H:%M", $value['lastmod']);
	$lastmodRemote = strftime("%d.%m.%Y %H:%M", $dirContent[$value['relRoot']]['lastmod']);
	
	//compare (size and last modified) local and remote files
	if($sizeLocal!=$sizeRemote || $lastmodLocal!=$lastmodRemote) {
		
		//if not the same, add to zip
		$archive->add($value['path']."/".$value['name'], "", $absRoot);
		$countadded++;
		
	}
	
}

//aangifte table
//HIER FLIEGT ER MEISTENS RAUS (aber nicht immer)
if(file_exists($backupRoot."aangifte.csv")) {
			chmod($backupRoot."aangifte.csv", 0755);
			$testbla = $archive->add($backupRoot."aangifte.csv", "db", $backupRoot) or die("not added");
			$countadded++;
			echo(", 1 (".$testbla.") ");
			$value_size = filesize($backupRoot."aangifte.csv");
			//delete local csv-file
			unlink($backupRoot."aangifte.csv");
}

///////////////////////////////////////////////////////////
//BACKUP DATABASE
///////////////////////////////////////////////////////////
//for all tables 
$sql = "show tables";
$result = mysql_query($sql) or die(mysql_error());

while($data = mysql_fetch_row($result)) {
	
	foreach($data as $key=>$value) {
		
		if($value != "aangifte") {
		
				//create Backupfile 
				...
				
				//add backupfile to zip archive
				$archive->add($backupRoot.$value.".csv", "db", $backupRoot);
				$countadded++;
				
				//delete local csv-file
				unlink($backupRoot.$value.".csv");
			}				
		}
	}
}
chmod($backupRoot.$tempDirName.".zip", 0755);

echo("aantal bestanden (inkl. database backup): ".$countadded."<br>");

///////////////////////////////////////////////////////////
//END BACKUP DATABASE
///////////////////////////////////////////////////////////

//if anything added, zip file has to be sent to remote server
if($countadded>0) {
	
	//send everything per ftp
	...
	
	//new soapclient object: unzip uploaded zip file
	$client = new soapclient("http://##URL##/soap_Update.php");
	$update = $client->call("update",
															array("zipname"=>"$remote_file"));
	$update = unserialize($update);					
	
} else {
	fwrite($fp, "nothing to update".chr(13).chr(10));
}

///////////////////////////////////////////////////////////
//END BACKUP FILES
///////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////
//UPDATE REMOTE DATABASE 
///////////////////////////////////////////////////////////

//new soapclient object: delete and update tables 
$client = new soapclient("http://##URL##/soap_UpdateDb.php");
$resUpdateDb = $client->call("updateDb", array());
	
///////////////////////////////////////////////////////////
//END UPDATE REMOTE DATABASE 
///////////////////////////////////////////////////////////

?>
 

Anhänge

Nun denn, manchmal ist das naheliegendste so weit entfernt, dass man sich einfach nur an den Kopf fassen kann:

Wie schon erwähnt, ist die eine Datei ziemlich gross und da könnte einem ja der Gedanke kommen, dass die Ausführung des Skriptes etwas länger dauert. Und nicht, dass mir der Gedanke noch nicht gekommen wäre, aber die logische Schlussfolgerung habe ich erst jetzt aus meinem Unterbewusstsein gekramt:

Erhöhe die maximale Ausführgungszeit des Skriptes und alles wird gut :)

Ich wünsche Euch allen einen ebenso erfolgreichen Tag und viel Spass!

Ach ja, und jetzt wo alles bestens funktioniert, diese zip-library ist echt zu empfehlen. Hatte noch nach einer Alternative gesucht, aber so eins zwei drei keine gefunden. Mit dieser Library könnt ihr einfach einen Pfad angeben, von wo aus alles rekursiv gezippt wird.

Und das mit nur wenigen Zeilen eigenem Code:

PHP:
include_once("pclzip-2-3/pclzip.lib.php");
$archive = new PclZip(%%NAME%%.".zip");
//zufügen kann beliebig oft!
$archive->add(%%FILELIST%%, %%ADD_DIR%%, %%REMOVE_DIR%%);
 

Neue Beiträge

Zurück