Autor Beitrag
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 23.06.07 18:23 
So, ich habe gerade mit PHP etwas skuriles hinbekommen. Und zwar schreibe ich einen kleinen Downloadzähler. Da besteht natürlich das Problem, dass ein Downloadmanager mehrfach gezählt wird. Um das abzuändern, versuche ich das über die sid zu verhindern (ide ist ja immer gleich). Allerdings habe ich es nur geschafft, dass DownThemAll, bei max. 5 parallelen Downloads, nicht mehr 8 mal gezählt wird, sondern nur noch 2x. Des wegen habe ich jetzt einen Referenzzähler eingebaut, der zählt, wie wieviele parallele Datenströme geladen/angefordert werden.

Ergebnis: DownThemAll verfängt sich in einer Endlosschleife beim herunterladen (nach Beendigung fängt er wieder neu an). Der FF-"Downloadmanager" hat dagegen damit keine Probleme.

Wer also etwas gegen Donwloadmanager hat, kann dass ja gerne auf seinen Server mal aufsetzten (weiß allerdings nicht, wie Flashget etc. reagiert):

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
<?php
  //Hier die Datenbankverbindungsdaten setzten
  define("Host", "localhost");
  define("User", "root");
  define("Passwort", "");
  define("DB", "downloadcounter_test");

  $downloadname = $_GET["download"];
  $filename = "";
  if (empty($downloadname)) die("Keine Datei ausgewählt!");
  //mysql_connect(Server, Nutzer, Passwort);
  $mysqlcon = mysql_connect(Host, User, Passwort);
  if (!$mysqlcon) die("Das Verbinden zur Datenbank ist fehlgeschlagen!");
  if (!mysql_select_db(DB, $mysqlcon)){
    mysql_close($mysqlcon);
    die("Das Verbinden zur Datenbank-Tabelle ist fehlgeschlagen!");
  }

  $ret = mysql_query("SELECT `id`, `downloadfile` FROM `downloads` WHERE `downloadname`='" . mysql_real_escape_string($downloadname, $mysqlcon) . "' LIMIT 1", $mysqlcon);
  if (mysql_num_rows($ret) > 0){
    $row = mysql_fetch_assoc($ret);
    $id   = $row["id"];
    $filename = $row["downloadfile"];

    session_start();
    $sid = session_id();
    $ret = mysql_query("SELECT `id` FROM `sessions` WHERE `sid`='" . $sid . "' AND `download_id`=" . $id . " LIMIT 1", $mysqlcon);
    if (mysql_num_rows($ret) === 0){
      mysql_query("UPDATE `downloads` SET `downloads`=`downloads`+1 WHERE `id`=" . $id . " LIMIT 1", $mysqlcon);
      mysql_query("INSERT INTO `sessions` (`sid`, `download_id`) VALUES ('" . $sid . "'," . $id . ")", $mysqlcon);
    }else{
      mysql_query("UPDATE `sessions` SET `ref_cnt`=`ref_cnt`+1 WHERE `sid`='" . $sid . "' AND `download_id`=" . $id . " LIMIT 1", $mysqlcon);
    }
    //Während des Downloads kein Kontrolle benötigt (bei vielen Downloads großen führt es sonst zu Problemen wegen zu wenigen Verbindungen)
    mysql_close($mysqlcon);

    if (!is_readable($filename)) die("Die Datei wurde nicht gefunden!");
    header('Content-Description: File Transfer');
    header('Content-Type: application/force-download');
    header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
    header('Content-Length: ' . filesize($filename));
    readfile($filename);

    $mysqlcon = mysql_connect(Host, User, Passwort);
    mysql_select_db(DB, $mysqlcon);
    mysql_query("UPDATE `sessions` SET `ref_cnt`=`ref_cnt`-1 WHERE `sid`='" . $sid . "' AND `download_id`=" . $id . " LIMIT 1", $mysqlcon);
    $ret = mysql_query("SELECT `id` FROM `sessions` WHERE `ref_cnt`=0 LIMIT 1", $mysqlcon);
    if (mysql_num_rows($ret) > 0){
      $row = mysql_fetch_assoc($ret);
      mysql_query("DELETE FROM `sessions` WHERE `sid`='" . $sid . "' AND `id`=" . $row["id"] . " LIMIT 1", $mysqlcon);
    }
    mysql_close($mysqlcon);
  }else{
    mysql_close($mysqlcon);
    die("Die Datei existiert nicht!");
  }

?>


Die Tabelle dazu:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
CREATE TABLE `downloads` (
  `id` int(11NOT NULL auto_increment,
  `downloadname` varchar(255collate latin1_general_ci NOT NULL,
  `downloadfile` varchar(255collate latin1_general_ci NOT NULL,
  `downloads` int(11default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

CREATE TABLE `sessions` (
  `id` int(11NOT NULL auto_increment,
  `sid` varchar(32collate latin1_general_ci NOT NULL,
  `download_id` int(11NOT NULL,
  `ref_cnt` int(11NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;


Was ich an dem Skript bisher allerdings nicht getestet habe (Festplatte zu schnell und nur ein Volumentarif um es auf langsamen Verbindungen testen zu können): Kann er da wirklich noch 5 parallele Ströme abgreifen und wie macht man den Downloadzähler so, dass er den Downloadmanager wirklich nur einmal zählt?

//EDIT: Die Endloschleife scheint damit etwas zu tun zu haben, dass ich statt ref ref_cnt genommen habe ;).