Ik heb een probleem met een script dat ik heb gemaakt om maar 1 file download tegelijk toe te staan.
Mijn webhost wil namelijk niet de apache module mod_throttle.c of iets dergelijks installeren, dus moet ik zelf maar iets verzinnen.
Het probleem was namelijk dat leechers zoveel files tegelijk met zoveel threads downloaden dat de server op z'n kont ging.
Ik heb veel gezien op php.net en hier op tweakers en heb het volgende in elkaar geknutseld.
Download.php
In de html is de aanroep download.php?file=blaat.zip
de html (.php eigenlijk) heeft bij alle pagina's de volgende code gevolgd door de html.
Nu werkt het script voor het grootste gedeelte, maar om een reden wordt de session onder fclose gedaan tijdens het downloaden terwijl hij nog in de while loop zit.
Hierdoor kunnen gewoon meerdere bestanden tegelijk worden gedownload.
Haal ik die session weg, dan is de 2e download geblockt.
Mijn php kennis is erg matig maar waar maak ik hier een denkfout?
Mijn webhost wil namelijk niet de apache module mod_throttle.c of iets dergelijks installeren, dus moet ik zelf maar iets verzinnen.
Het probleem was namelijk dat leechers zoveel files tegelijk met zoveel threads downloaden dat de server op z'n kont ging.
Ik heb veel gezien op php.net en hier op tweakers en heb het volgende in elkaar geknutseld.
Download.php
PHP:
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
| <?php session_start(); error_reporting(E_ALL); // Session variable check if (!isset($_SESSION['download_started'])){ echo ("Downloadcheck variable not set"); exit; } // Session downloadcheck if ($_SESSION['download_started'] == 'started' ) { echo ("Downloadcheck: download in progress"); exit; } // Filecheck en download ignore_user_abort( true ); if (file_exists($file)){ header("Pragma: "); header("Cache-Control: "); header("Content-type: application/octet-stream"); header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=\"$file\""); header("Content-length: ".filesize($file)); header("Connection: close"); ob_flush(); flush(); $handle = fopen($file, "rb"); if ($handle === false) { return false; } while(!feof($handle) || connection_status()!=0 ) { echo fread($handle, (1*(1024*1024))); ob_flush(); flush(); session_start(); $_SESSION['download_started'] = 'started'; session_write_close(); } fclose ($handle); session_start(); $_SESSION['download_started'] = 'stopped'; session_write_close(); exit; } else { echo ("File Not Found"); exit; } echo ("End of script error"); exit; ?> |
In de html is de aanroep download.php?file=blaat.zip
de html (.php eigenlijk) heeft bij alle pagina's de volgende code gevolgd door de html.
PHP:
1
2
3
4
5
6
7
| <?php session_start(); if (!isset($_SESSION['download_started'])) { $_SESSION['download_started'] = 'stopped'; } @session_write_close(); ?> |
Nu werkt het script voor het grootste gedeelte, maar om een reden wordt de session onder fclose gedaan tijdens het downloaden terwijl hij nog in de while loop zit.
Hierdoor kunnen gewoon meerdere bestanden tegelijk worden gedownload.
Haal ik die session weg, dan is de 2e download geblockt.
Mijn php kennis is erg matig maar waar maak ik hier een denkfout?
[ Voor 18% gewijzigd door ^Ripper op 03-07-2005 13:05 ]