Apache Throttle, ModRewrite

Apache Throttle, ModRewrite

Misschien ken je het probleem: Je wilt een video of audio bestand aanbieden via je website in een stream vorm. Op het moment dat de gebruiker de stream start wordt met volle snelheid het bestand naar de gebruiker verzonden. Er gaat echter enorm veel dataverkeer verloren als de gebruiker het bestand niet helemaal bekijkt. Het complete bestand is verzonden maar nooit bekeken. De oplossing zou zijn dat het verzenden net iets sneller gaat dan het afspelen. Genoeg om direct af te spelen maar niet te snel zodat er bandbreedte roekeloos verloren gaat als de gebruiker besluit om niet het hele bestand te bekijken of te beluisteren.

Je kunt dit probleem oplossen met een simpel perl script. Als je gebruik maakt van een script hoef je niet heel je apache server om te bouwen of nieuwe hardware te kopen. Het perl script ziet er als volgt uit:

#!/usr/bin/perl
use Time::HiRes qw( usleep ualarm gettimeofday
                               tv_interval nanosleep);
$datalen = $ENV{'QUERY_STRING'};
read (STDIN, $querystring, $datalen);
        @namevaluepairs = split (/&/, $datalen);
        $n = 0;
        foreach $namevalue (@namevaluepairs)
                {
                ($na[$n], $va[$n]) = split ( /=/,$namevalue);
                $key{$na[$n]}=$va[$n];
                $n++;
                }

$max_data_rate=200; # Snelheid in Kb/s
$max_data_rate = $max_data_rate / 8; # bits naar byte
$max_data_rate = $max_data_rate * 1024; # bytes naar kilobytes
$max_data_rate = $max_data_rate / 10; # per 0.1 seconde

if ($key{'q'} ne "")
        {
        print "Content-type: audio/mpeg3nn";
        open (FILE, "/home/streams/media/audio.mp3");
        binmode(FILE);
        while (read(FILE, $buf, $max_data_rate))
                { print "$buf"; usleep (100000); }
        close(FILE);
        }
else
        { print "Content-type: text/htmlnn"; print "?"; }

Het bovenstaande script. Leest de te verzenden file in en stuurt elke 0.1 seconde een door jou op te geven aantal bytes. Daarna wacht het 0.1 seconde en stuurt vervolgens de volgende aantal bytes en zo gaat dit door tot het einde van de file. Op deze manier wordt het verzenden beperkt en voorkom je dat je onnodig data aan het versturen bent.

Om het verhaal helemaal af te maken zou het mooi zijn dat de gebruiker in de URL niet kan zien dat er een perl script verborgen zit achter de audio of video file. Met ModRewrite kunnen we dit mooi verbergen. Het lijkt vervolgens net of je een echte MP3 file download maar op de achtergrond wordt de URL omgezet naar een perl script.

RewriteEngine on
RewriteRule /media/(.*) /index.tpl?q=$1 [L]

Bovenstaande regels zetten bijvoorbeeld de volgende url: http://www.test.com/media/audio.mp3 om in de volgende script aanroep: http://www.test.com/index.tpl?q=audio.mp3