[PHP] fread, moet loopen voor altijd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik maak een streaming applicatie die gebruik maakt van een webserver om zijn data op te slaan.

* Persoon A upload aan een variabele snelheid (kan 2-5kB/s zijn) zijn data.

* 5 minuten later begint persoon B van de (web)server de data te halen met zijn speciaal programma dat ik hiervoor heb gemaakt.

Probleem: aangezien dat die upload afhankelijk is van de data die persoon A genereert en dat redelijk kan verschillen (of er al dan niet iets gebeurt) kan er dit optreden:

1) persoon A upload tegen 5kB/s en persoon B download tegen 2kB/s -> programma zal op een gegeven moment te weinig data hebben om te verwerken -> big problem

2) persoon A upload tegen 2KB/s en persoon B download tegen 5kB/s -> php script komt aan einde van file op server en programma B stopt ermee -> na een tijdje komt programma aan einde data aangezien die niet meer van server gehaald wordt.


(het is voor FREEWARE natuurlijk :*) , namelijk voor mohTV, iets zoals HLTV, om de het spel van anderen te volgen voor het spel medal of honor....


Nu kan ik :
a) voor optie 2 gaan met dat probleem, maar als het script ophoudt, direct een nieuwe connectie maken met webserver & een offset voor de file meegeven. --> maar is veel te veel overhead, teveel connecties opzetten enz -> niet goed

b) voor optie 2, maar mijn PHP script zo wijzigen dat het niet ophoudt als het bestand op de server ten einde is dat 'fread' leest.

dit is de code en hieronder de pseude code
(ik kan PHP, maar ben geen expert)


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    if(file_exists($file) && is_file($file))
    {
       header("Cache-control: private");
       header("Content-Type: audio/x-mpeg");//application/octet-stream
       header("Content-Length: ".filesize($file));
       header("Content-Disposition: filename=$file" . "%20");
    
       flush();
    
       $fd = fopen($file, "r");
       while(!feof($fd))
       {
           echo fread($fd, round($speed*1024));
           flush();
           sleep(1);
       }
       fclose ($fd);



pseudo code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(file_exists($file) && is_file($file))
    {
       header("Cache-control: private");
       header("Content-Type: audio/x-mpeg");//application/octet-stream
       header("Content-Length: ".filesize($file));
       header("Content-Disposition: filename=$file" . "%20");
    
       flush();
    
       $fd = fopen($file, "r");
       while(true)
       {
               if( currentFilePointer <= (FileSize-$speed*1024)  )
                {
                 echo fread($fd, round($speed*1024));
                  flush();
                  }
           sleep(1);
       }
       fclose ($fd);


zodat het script niet ophoudt, ook al wordt het einde van de file gelezen. Want 5 seconden erna wordt de file upgedate en is er weer nieuwe data :)


snap je? ;)

audio/x-mpeg -> dat staat er omdat het werkt _/-\o_ zou kunnen dat server alleen audio wil streamen ofzo :)

[ Voor 7% gewijzigd door Verwijderd op 07-11-2004 22:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ik snap je script wel, maar jouw argumenten iets minder. PHP is namelijk server-side, dus volgens mij zou het niet afhankelijk moeten zijn van externe gebruikers. Of vergis ik me nou zo volledig?

Acties:
  • 0 Henk 'm!

Verwijderd

het is volledig afhankelijk van externe gebruikers

ik ga het nog eens uitleggen, wat simpeler :)


er staat één bestand op mijn webserver waar continue data wordt bijgezet door een gebruiker.

alle andere gebruikers downloaden dat bestandje en het is de bedoeling dat die download eigenlijk oneindig is. Dat je webbrowser niet zou ophouden of je connectie zou sluiten zelfs als het einde van het bestand bereikt is.

want 5 seconden later wordt er weer nieuwe data bij dat bestand toegevoegd door één gebruiker.

Nu stopt mijn script als het het einde van de file tegenkomt. Dit moet veranderen in een loop forever en het script moet gewoon slapen tot er weer data is.


realtime streaming via een webserver is misschien een raar, maar het is goedkoop efficient en aangezien een iedereen php ruimte heeft eenvoudiger dan een custom programma dat ergens op een server zou moeten draaien.

(net nieuwe user aangemaakt op werk, want weet mn pwd niet van erazerbe)

Acties:
  • 0 Henk 'm!

Verwijderd

Dat wil je niet met PHP doen.

Pak een krachtiger taal die als "mini-daemon" op je server kan draaien, en uploads en downloads kan synchroniseren. Je kan kiezen uit C, C++, Perl, Ruby, Python, ....

PHP is hier niet voor gemaakt en ook al kun je er waarschijnlijk wel omheen hacken zodat het lukt, mooi en stabiel zal het niet worden.

Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

het enige wat ik kan bedenken is een automatische page-refresh (clientside) om de zoveel tijd ...

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

Verwijderd

de helft snapt het al niet :p

autorefresh = internet explorer

wil ik niet, mijn applicatie leest dat in, niet IE of what dan ook
de tcp/ip connectie moet open blijven

ik wil gewoon de php code, het is zo stabiel als de mount everest
ik heb gewoon niet voldoende PHP kennis om dat script zelf te schrijven met een file offset ....

danke

andere opties zijn er niet, ik kan geen prive server huren en mijn custom app daar laten draaien. En daarbij het is even efficient

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
opgelost slotje

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
    if(file_exists($file) && is_file($file))
    {
        header("Cache-control: private");
        header("Content-Type: application/octet-stream");
        header("Content-Length: ".filesize($file));
        header("Content-Disposition: filename=$file" . "%20");

        flush();

        $pointer = 0;
        $fd = fopen($file, "r");
        while(true)
        {
            fseek($fd, 0, SEEK_END);
            $filesize = ftell($fd);
            fseek($fd, $pointer);
            if($filesize >= $pointer+($speed*1024))
            {
                echo fread($fd, round($speed*1024));
                $pointer = $pointer+($speed*1024);

                flush();

                fseek($fd, 0, SEEK_END);
                $filesize = ftell($fd);

                fseek($fd, $pointer);
            }
            sleep(1);
        }
        fclose ($fd);
    }

[ Voor 7% gewijzigd door Verwijderd op 08-11-2004 23:53 ]

Pagina: 1