Download slots ermöglichen nur wie?

strex

Erfahrenes Mitglied
Hi Leute,

soweit so gut, bin fast fertig meinen OTR-Mirror aufzubohren nur fehlt noch ein Fetaures. Ich möchte die Downloads über ein PHP-Script abwickeln und Speed und Anzahl gleichzeitiger sowie maximale Anzahl alle Verbindungen begrenzen.

Abwickeln tu ich derzeit durch dieses Script:
PHP:
include("dbconnect.php");

//Daten werden ausgelesen und ausgegeben
$auslesen = "SELECT downloads FROM stats";
$stat = mysql_query($auslesen, $DatabasePointer);

while ($stats = mysql_fetch_row($stat)) {
      $stt = $stats[0];
}  


//Download wird hinzu gezählt
$statt = ($stt+1);

//Update der Datenbank
$update1 = "UPDATE stats SET downloads = '$statt'";
$statt2 = mysql_query($update1, $DatabasePointer);

//Speed kontrolle
$speed=500; //Max-Speed in kbs

$file="".$_GET['file']."";
$dlfile="hf83jdw8ej3dsd/".$_GET['file']."";
$size=filesize($dlfile);
header("Cache-control: private");
header("Content-Type: application/x-otrkey");
header("Content-Length: ".$size);
header("Content-Disposition: filename=".$file);
flush();
$fd = fopen($dlfile, "r");
while(!feof($fd)) {
echo fread($fd, round($speed*1024));
flush();
sleep(1);
}

fclose ($fd);
mysql_close();

Nun habe ich mir gedacht, ich mache eine tabelle in der ich bei jedem Download abspeichere das ein download aufgerufen wurde. Aber wie erkenne ich das ein slot wieder frei ist, bzw. erkenne wann der Download fertig ist?

Gibt es da eine Möglichkeit?

grüße strex
 
Eine Frage, die dich hoffentlich auf eine Lösung dieses Problems führt: Warum schließt du die Datei und die Datenbankverbindung nach dem while-Konstrukt?
 
Also die Dateiausgabe habe ich aus einem Codesnipsel zusammen gebastelt und die DB-Abfrage, hmm ich mache das immer so das ich am Ende der Datei die Verbindung wieder schließe.

Ich ahne vll. was du meinst bin mir aber nicht schlüssig. Was meinst du denn genau?

grüße strex
 
Du machst es ja, weil diese nicht mehr benötigt werden. Also bedeutet das, dass zu diesem Zeitpunkt alle Aktionen abgeschlossen sind, der Dateizeiger also auch das Ende der Datei erreicht hat (was ja Bedingung zur Ausführung des while-Kontrollkostrukts ist). Dort könntest du den Zähler wieder dekrementieren.
 
Danke, das hatte ich mir fast gedacht, dass du das meinst. Ja ich werd das jetzt mal ausprobieren und sehen ob alles klappt. Danke schön:)
 
Das Inkrementieren des Zählers kannst du übrigens in einer Abfrage zusammenfassen:
Code:
UPDATE
         `stats
  SET
         `downloads` = `downloads` + 1
Das Dekrementieren analog dazu.
 
PHP:
<?php
include("dbconnect.php");

$maxslot = 4;

//Anzahl slots auslesen
$freeslot = "SELECT `used` FROM `slots`";
$slotss = mysql_query($freeslot, $DatabasePointer);

while ($slotsfree = mysql_fetch_row($slotss)) {
      $slotf = $slotsfree[0];
}  

if ($slotf > $maxslot) //Sollte weniger slots gebraucht sein als maximal dann download
{

//Update der benutzten slots
$update12 = "UPDATE slots SET `used` = `used` + 1";
$slott22 = mysql_query($update12, $DatabasePointer);


//Update der Datenbank, Anzahl der Downloads
$update1 = "UPDATE`stats SET `downloads` = `downloads` + 1";
$statt2 = mysql_query($update1, $DatabasePointer);

//Speed kontrolle
$speed=500; //Max-Speed in kbs

$file="".$_GET['file']."";
$dlfile="hf83jdw8ej3dsd/".$_GET['file']."";
$size=filesize($dlfile);
header("Cache-control: private");
header("Content-Type: application/x-otrkey");
header("Content-Length: ".$size);
header("Content-Disposition: filename=".$file);
flush();
$fd = fopen($dlfile, "r");
while(!feof($fd)) {
echo fread($fd, round($speed*1024));
flush();
sleep(1);
}

fclose ($fd);
 

//Aktuelle slots werden geupdatet
$update122 = "UPDATE `slots` SET `used` = `used` - 1";
$slotakk2 = mysql_query($update122, $DatabasePointer);

}
else
{
echo "Leider sind derzeit alle Slots belegt"; //Alle slots belegt, dann error
}
mysql_close();
?>

Aber es wird immer nur die error Meldung angezeigt. Obwohl noch genügend frei wären.

edit:// Unötige Abfragen hab ich jetzt weg gelassen und habe ob das script passend dazu updatet. Aber immer noch der oben genannte Fehler.
 
Zuletzt bearbeitet:
Mein Vorschlag:
PHP:
<?php

	include_once "dbconnect.php";

	// Konfigurations
	$speed = 500; //Max-Speed in kbs
	$maxslots = 4; 

	$file = basename($_GET['file']);
	$path = "hf83jdw8ej3dsd/".$file;


	// Existenz der Datei prüfen
	if( !file_exists($path) || !is_readable($path) ) {
		// Datei existiert nicht oder ist nicht lesbar
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		echo 'Die angefragte Datei wurde nicht gefunden.';
		exit;
	}


	// Anzahl der verfügbaren Slots prüfen
	$query = '
		SELECT
		        1
		  FROM
		        `slots`
		  WHERE
		        `used` < ' . $maxslots . '
		';
	if( !mysql_num_rows(mysql_query($query, $DatabasePointer)) ) {
		// keine freien Slots verfügbar
		header($_SERVER['SERVER_PROTOCOL'].' 503 Service Unavailable');
		header('Rerty-After: 60');
		echo 'Es sind bereits alle Slots belegt. Bitte versuchen Sie es in ein paar Minuten wieder.';
		exit;
	}


	// Datei öffnen
	if( ($fd = fopen($dlfile, "r")) === false ) {
		// Datei konnte nicht geöffnet werden
		header($_SERVER['SERVER_PROTOCOL'].' 500 Internal Server Error');
		exit;
	}


	// Inkrementieren der benutzten Slots
	$query = '
		UPDATE
		        `slots`
		  SET
		        `used` = `used` + 1
		';
	mysql_query($query, $DatabasePointer);


	header("Cache-control: private");
	header("Content-Type: application/x-otrkey");
	header("Content-Length: ".filesize($path));
	header("Content-Disposition: filename=".$file);
	flush();
	while( !feof($fd) ) {
		echo fread($fd, round($speed*1024));
		flush();
		sleep(1);
	}

	// Inkrementieren des Download-Zählers
	$query = '
		UPDATE
		        `downloads`
		  FROM
		        `stats` = `stats` + 1
		';
	mysql_query($query, $DatabasePointer);


	// Dekrementieren der benutzten Slots
	$query = '
		UPDATE
		        `slots`
		  SET
		        `used` = `used` - 1
		';
	mysql_query($query, $DatabasePointer);


	fclose ($fd);
	mysql_close();

?>
 
Ja, habe es auch gerade hin bekommen. Leider bekomme ich bei deiner Lösung, die viel edler aussieht nur folgenden Fehler: "Die Webseite wurde nicht gefunden."

Zu dem bin ich auf ein Problem gestoßen, wenn man den Download abbricht oder sonst was, dann bleibt der sollt trozdem belegt und wird nicht mehr frei gegeben. Was kann man dagegen machen?:rolleyes:

Danke für deine große Hilfe!
 
Ein Tippfehler meinerseits: Setz mal vor das is_readable() ein Ansrufezeichen wie es nun auch in der korrigierten Version steht.
 
Zurück