Fortgeschrittenes Linkchecking - PHP & MySQL

zkmlch

Master of Disaster
Hallo liebe Tutorianer

Ich bin zurzeit an einem kleinen Projektchen namens Downloadmanager beschäftigt. Das ganze Backend des Manager läuft wie geschmiert. Nun bin Ich bei den Feinarbeiten angelangt. Vielleicht kann man mir da helfen. Hab mir auch schon die Finger wund gegoogelt aber nix exaktes gefunden was mein Begieren befriedigen konnte.

Kurz zu meiner Infrastruktur:

Ich habe 5 Virtuelle Webserver davon ist ein Server der Master (192.168.4.222). Alle Downloads sollen --> immer <-- vom Master-Server heruntergeladen werden. falls dieser aber nicht erreichbar ist, soll er beim klick auf den Downloadlink automatischen einen Alternativserver finden (einer der 4 Slave Server). Alle 5 Server sind genau gleich gemirrort.

Master Server: 192.168.4.222 (downloads.test.org) Debian 6.0
1. Slave Server: 192.168.4.223 (test1.org) Debian 6.0
2. Slave Server: 192.168.4.224 (test2.org) Debian 6.0
3. Slave Server: 192.168.4.225 (test3.org) Debian 6.0
4. Slave Server: 192.168.4.225 (test4.org) Debian 6.0

Also nochmals ein bisschen detaillierter:

Wenn ein User die Download Seite besucht und etwas herunterladen will, soll PHP automatisch checken, ob der Master-Downloadserver erreichbahr ist, falls dieser nicht verfügbahr ist, soll PHP automatisch den nächstmöglichen Slave-Server ausfindig machen.

Die IP-Adressen sind in einer separaten MySQL Tabelle aufgeführt:

--> tbl_serverprio

Spalten: server_prio (PRIMARY KEY), server_address (VARCHAR), server_comment (TEXT)

Der user soll nix vom Linkcheck mitbekommen nur falls keiner der Server erreichbahr ist soll er auf eine Error-Seite verweisen.

In diesen bestehenden Quellcode müsste der Linkchecker eingebaut werden:

PHP:
<html>
<body>

<font face="Century Gothic, URW Gothic L, Verdana, Arial,Helvetica">


<?php
	//Datenbank-Login
    	$mysqlhost="localhost"; // MySQL-Host angeben
	$mysqluser="*******"; // MySQL-User angeben
	$mysqlpwd="*******"; // Passwort angeben
	$mysqldb="db_filemanager"; // Gewuenschte Datenbank
     
	//Mit Datenbank Verbinden
    	$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
     
	//Datenbank auswählen
    	mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");

	//Variabel für das Auslesen aller Files"
	$sql_files = "SELECT * FROM tbl_files ORDER BY software_category";
	//Öffnet eine persistente Verbindung mit der MySQL Datenbank im zusamenhang mit Browser
	$files_query = mysql_query($sql_files) or die("Anfrage nicht erfolgreich");
	

?>

<table>

<?php

	do {			// Beginn der do...while Schleife (Ab dem "{"-Zeichen)	
	
									

	if ($categorytitel!=$files['software_category']){		//If Anweisung für Tabellen Untertitel anfang
		
		if ($categorytitel==""){			//Wenn $categorytitel noch nicht vorhanden dann...
		$categorytitel=$files['software_category'];		//...man nehme aus Variabel $files einen Kategoriename und 									//weist ihm $categoryname zu
		}

										
							
											
	
			?>

			<tr>
      				<td COLSPAN=10 bgcolor=#D3D3D3><b><?=$categorytitel=$files['software_category'];?></b></td>
			</tr> 

			<?php
			
			}	// Ende der If Anweisung "Categoryname"

			if ($files['software_name']!=""){    // Wenn kein(!=) Softwarename in Datenbankeintrag vorhanden dann keine Ausgabe!
			
			?>

			<tr>
            			<td bgcolor=#bfdaf2><?=$files['software_name']?></td>
            			<td bgcolor=#bfdaf2>V. <?=$files['software_version']?></td>
            			<td bgcolor=#bfdaf2><?=$files['software_system']?></td>
            			<td bgcolor=#bfdaf2><?=$files['software_size']?></td>
           			<td bgcolor=#bfdaf2><?=$files['software_language']?></td>
            			<td bgcolor=#bfdaf2><a href="<?=$files['autor_link']?>"><?=$files['autor_name']?></a></td>
            			<td bgcolor=#bfdaf2><a href="<?=$files['autor_download']?>"><img src="bilder/homepage.jpg" width="20" height="20" 					border="0" alt="Download"></a></td>
            			<td bgcolor=#bfdaf2><a href="http://www.test.org/dowloads/<?=$files['software_filename']?>"><img 					src="bilder/download.jpg" width="20" height="20" border="0" alt="Download"></a></td>

			</tr>

			<?php
			}		// Ende der If Anweisung "Softwarename"

	$categorytitel=$files['software_category']; // Variablenzuweisung für $categorytitle

}while ($files = mysql_fetch_array($files_query)) // Ende der Schleife 

?>


</table>
</body>
</html>


Ich weiss das war jetzt viel Text, aber hat vielleicht noch jemand den Durchblick oder gar eine Lösung?

Freue mich auf jede Antwort :-)

Gruss Patrick
 
Zuletzt bearbeitet:
Hi Patrick,

du könntest die Header der Datei abfragen mit get_headers().
Wenn du zB. nach 0.1 Sek keine Antwort bekommst oder der Status ungleich 200 ist schickst du die Anfrage zum nächsten Server.
 
Wie könnte das aussehen? Respektive, wie wird der User dann automatisch an den richtigen Server geleitet? *grübel*
 
Wäre es nicht ausreichend wenn du die Server in einer Schleife durchläufst und dann einfach mit fopen arbeitest?

PHP:
<?php
function server_check (){
// hier ein Array als Beispiel, bei dir wird dafür das Ergebnis der Datenbankabfrage durchlaufen
$ip = array ("htp://www.tutorials.de", "http://w.tutorials.de", "http://www.tutorials.de", "http://www.tutorials");

for ($a = 0; $a < count($ip); $a++) {
	if (@fopen($ip[$a], "r")) {
		echo '<a href="' .$ip[$a] .'">' .$ip[$a] .'</a>';
		return;
	}
}
// wenn kein Server erreichbar
echo "<b>Es ist ein Fehler aufgetreten!</b>";
return;
}

echo "Und hier das Ergebnis welche der Adressen erreichbar ist:<br />";
server_check();

?>
 
Hallo tombe

Hört sich super an :-) Aus deinem Script resultiert bei mir ein Problem....

Wie binde Ich deinen Script ein? Sprich wie binde Ich so eine Funktion in den <a href="Link_zum_Download"> ein?

PHP:
<td bgcolor=#bfdaf2><a href="http://www.test.org/dowloads/<?=$files['software_filename']?>"><img src="bilder/download.jpg" width="20" height="20" border="0" alt="Download"></a></td>
 
Ändere die Funktion wie folgt ab:

PHP:
<?php
function server_check ($file){
// hier ein Array als Beispiel, bei dir wird dafür das Ergebnis der Datenbankabfrage durchlaufen
$ip = array ("htp://www.tutorials.de", "http://w.tutorials.de", "http://www.tutorials.de", "http://www.tutorials");

for ($a = 0; $a < count($ip); $a++) {
    if (@fopen($ip[$a], "r")) {
		$pfad = "/downloads/" .$file;
        $link = '<a href="' .$ip[$a] .$pfad .'"><img src="bilder/download.jpg" width="20" height="20" border="0" alt="Download"></a>';
        return $link;
    }
}
// wenn kein Server erreichbar
$link = "<b>Es ist ein Fehler aufgetreten!</b>";
return $link;
}

?>
<table>
	<tr>
		<td bgcolor=#bfdaf2><?php echo server_check($files['software_filename']); ?></td>
	</tr>
</table>

Dann wird der Dateiname an die Funktion übergeben und du kannst den Rückgabewert entsprechend mit echo ausgeben.
 
Danke tombe :-)

Das läuft schon mal super... Jedoch dauert eine einzige Serveranfrage schon 5 - 7 Sekunden, nun wie sieht das den bei 100 Links aus? Wäre da eine onClick Funktion evetuell besser? Sonst würde der doch 100 mal die Funktion ausführen, dass bräuchte mal ne Zeit....

Irr ich mich, so gebt mir aufs Maul ;-)
 
Hm, das ist wirklich blöd.

Dann könnte man es höchstens so machen das einmal die Prüfung durchgeführt wird und dann alle Links mit dem gleichen Server erstellt werden.

Das müsste doch auch klappen oder?
 
Das heisst man müsste dem server_check() eine Varible $working_server zuweisen und dann würde der html tag in etwa so aussehen? :

PHP:
<a href="<?php $working_server ($files['software_filename']); ?>Downloadlink</a>

hmm ich kenn leider nur die PHP Logik jedoch nicht das genaue zusamenfügen der Befehle....
 
Zurück