PHP downloadsnelheid beperken / registreren aantal downloads

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het programmeren van een script dat een download forceert.
Dat is inmiddels allemaal gelukt en getest. Echter wil ik ook de onderstaande dingen nog doen:

1. Het begrenzen van de downloadsnelheid, dat kan toch met fread?
2. Ik wil dat een gebruiker maar tegelijk 2 films kan downloaden met een lage snelheid. Daarvoor moet ik weten wanneer die begint en klaar is. Ik wil dat in combinatie met een database doen.

Dit betreft een gedeelte van de code waar het om gaat. Ik heb al veel gegoogled maar kan niet echt een duidelijk antwoord of oplossing vinden.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(!$error){
   if(file_exists($file)){
     if(is_readable($file)){
         $size=filesize($file);
         if($fp=@fopen($file,'r')){
            // send the headers
            header("Content-type: $mime");
            header("Content-Length: $size");
            header("Content-Disposition: attachment; filename=\"$file\"");
            // send the file content
            fpassthru($fp);

            // close the file
            fclose($fp);

         }
      }else{ 
         $error='Cannot read file';
      }
   }else{  
      $error='File not found';
   }
}

[ Voor 10% gewijzigd door Verwijderd op 27-06-2009 17:05 . Reden: Foutje in het script ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Snelheid is hoeveelheid data per tijds eenheid. Wil je de snelheid regelen dan zul je ergens moeten regelen dat er per tijdseenheid maar een beperkte hoeveelheid data verstuurd wordt. Dat gaat je sowieso niet lukken wanneer je een functie gebruikt die rechtstreeks de file op de output zet.


Het tweede deel van je vraag staat compleet los van het eerste deel. Dat zul je op moeten lossen met iets van sessies of ip filtering.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
Die comments, echt WTF. '//if file exists' ... if(file_exists())
Bedankt captain obvious!

{signature}


Acties:
  • 0 Henk 'm!

  • BBrunekreeft
  • Registratie: Mei 2004
  • Laatst online: 13:23

BBrunekreeft

Dus...

De PEAR class HTTP_Download heeft een "Basic throttling mechanism".
Wellicht is dat iets voor je?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BBrunekreeft schreef op vrijdag 26 juni 2009 @ 16:02:
De PEAR class HTTP_Download heeft een "Basic throttling mechanism".
Wellicht is dat iets voor je?
Heb het bekeken en dit kan wel eens de oplossing zijn.
Ben nu bezig om het te installeren op de server.
Het tweede deel van je vraag staat compleet los van het eerste deel. Dat zul je op moeten lossen met iets van sessies of ip filtering.
Dit volg ik niet helemaal, ik kan wel in een sessie noteren wanneer een download begin. Maar hoe kan ik dan afvangen als hij klaar is met downloaden. Of denk ik nu te moeilijk?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op vrijdag 26 juni 2009 @ 16:42:
Dit volg ik niet helemaal, ik kan wel in een sessie noteren wanneer een download begin. Maar hoe kan ik dan afvangen als hij klaar is met downloaden. Of denk ik nu te moeilijk?
Dat is ook zo. Er is helemaal geen gedeelde context in php. Sessie aanpassingen worden pas weggeschreven wanneer het script afgelopen is. Eventueel zou je kunnen kijken of je iets met memcache kunt doen of zelf in een database bij houden wanneer een upload begint en wanneer deze geeindigd is. (update tabelletje set downloads = downloads + 1 aan het begin en downloads = downloads -1 aan het einde)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Eerst geef je gebruiker een sessie.
Bij download requests insert je iets in je db, als de dowload klaar is, of na een bepaalde tijd delete/update je die row.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op vrijdag 26 juni 2009 @ 16:49:
[...]

Dat is ook zo. Er is helemaal geen gedeelde context in php. Sessie aanpassingen worden pas weggeschreven wanneer het script afgelopen is....
Je kan de sessie wegschrijven met session_write_close(). Later kan je hem weer openen met session_start(), waarna je de sessie weer kan wijzigen, en weer opnieuw kan wegschrijven.

Let er wel op dat slechts 1 script gelijktijdig de sessie open kan hebben. Het is dus verstandig de sessie te openen, wijzigingen door te voeren, en zo snel mogelijk weer weg te schrijven.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Je kan anders ook de wacht-tijd van ze laten bepalen op file-grootte, volgens mij doet RapidShare dit ook. Als ik 80mb daar weghaal van de server en me download is (compleet / incompleet) moet ik eerst x aantal minuten wachten voordat ik pas weer iets mag gaan downloaden.

Trouwens, om het te controleren of er iemand aan het downloaden is kan je toch ook de Apache functions gebruiken? Die houdt namelijk ook bij of je een connectie hebt of niet, dus dat moet niet zo moeilijk zijn hoop ik.

(PS: Heb ik eens gelezen in een artikel)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben nog bezig geweest met PEAR. Dat kreeg ik niet zo snel voor elkaar. Ga het in de vakantie nog een keer proberen want denk dat het wel een goede oplossing is.

Daarom ben ik maar weer wat gaan zoeken en wat geprobeerd. Een kennis heeft me ook nog geholpen. Inmiddels is het gelukt om het script te vertragen.

code:
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
// Stel de headers in.
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$bestand_download\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $bestands_omvang);

// Download het bestand.
$download = @fopen($bestands_pad,"rb");
$teller = 1;
if($download){
    while(!feof($download)) {
        print(fread($download, 1024*8));
        flush();
        
        // Met sleep wordt voor vertraging gezorgd. Stel $teller in hoeveel vertraging.
        if($teller == 25){
            sleep(1);
            $teller = 1;
        }else{
            $teller++;
        }
        
        
        if (connection_status()!=0) {
          @fclose($download);
          die();
        }
    }
    @fclose($download);
}


Dit is een gedeelte van het script. Het gaat eigelijk om sleep dat was de oplossing. Je ziet nu tijdens het download wel een happering maar dat maakt verder niet uit.
Manueltje22 schreef op vrijdag 26 juni 2009 @ 17:21:
Je kan anders ook de wacht-tijd van ze laten bepalen op file-grootte, volgens mij doet RapidShare dit ook. Als ik 80mb daar weghaal van de server en me download is (compleet / incompleet) moet ik eerst x aantal minuten wachten voordat ik pas weer iets mag gaan downloaden.

Trouwens, om het te controleren of er iemand aan het downloaden is kan je toch ook de Apache functions gebruiken? Die houdt namelijk ook bij of je een connectie hebt of niet, dus dat moet niet zo moeilijk zijn hoop ik.

(PS: Heb ik eens gelezen in een artikel)
Dat is ook een goede oplossing die ik al bedacht had. Kan gewoon in de database opgeven dat een gebruiker een aantal minuten moet wachten.

Ik hoor graag wat jullie van het script vinden of dat het nog beter kan!

Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Doe dit nooit meer:

PHP:
1
2
3
4
5
6
<?php
file_exists("$file");
is_readable("$file");
filesize("$file");
etc.
?>


Zet variable altijd buiten quotes. Bespaard veel problemen en performance.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
vdvleon schreef op zaterdag 27 juni 2009 @ 17:02:
Doe dit nooit meer:

PHP:
1
2
3
4
5
6
<?php
file_exists("$file");
is_readable("$file");
filesize("$file");
etc.
?>


Zet variable altijd buiten quotes. Bespaard veel problemen en performance.
Je hebt helemaal gelijk, is me niet opgevallen eigenlijk.
Gebruik het script niet meer omdat het niet voldeed aan mijn eisen.

Toch bedankt!
Pagina: 1