PHP: Real-time reaktion ved post til mySQL

Tags:    php

Kan PHP reagere samtidig med at en bruger tilføjer data til mySQL? Og hvordan?

Jeg har forsøgt at lave noget med

while(1){
....
....
sleep(2);
}

sådan at den hver 2. sekund tjekker om der er sket noget nyt. Men scriptet virker ikke.... HJÆÆÆÆLP!



10 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Sådan fungerer PHP ikke. PHP bliver kört som et script hver gang siden loades, fra en ende til en anden. Du kan godt lave et neverending loop, men det betyder at du aldrig får kört scriptet til ende, og siden bliver da aldrig serveret for brugeren.

Det du vil have, kan ikke lade sig göre serverside. Du kan lave noget AJAX der får det til at se sådan ud, men det er lidt avanceret.



Det er som sådan ikke muligt at lave real-time handlinger med php da det foregår over HTTP, hvor klienten forespørger og får et svar umiddelbart efter. Den eneste rigtige måde at lave den slags på er via TCP, som er den måde netværksspil arbejder.

Dog er der en metode der minder om det, kaldet Comet eller server pushing. Den går i bund og grund ud på at lade klienten spørge til en bestemt side på serveren, der aldrig ender i timeout.
Denne side læser konstant ændringer på serveren, fortolker og "pusher" så output til klienten.

Denne metode er temmelig resourcekrævende, iogmed den aldrig lukker http-services da en forespørgelse aldrig ender.

Det script som klienten får serveret kan se således ud:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 27.02.2008 18:44 af Bruger #10216
Hvad er det du vil have skal puttes ind i databasen?

Hvis det bare er et forum, kan du lave et slags preview med javascript, og så nå brugeren går ud af sitet, putte det ind i databasen...



Er ikke helt sikker på, at jeg har skrevet det korrekt, men det er noget i den stil.... Kan det lade sig gøre?


Det kan sagtens lade sig gøre, hvis du smider lidt flere point i så laver jeg enda også en lille template du kan arbejde videre med.



Mikael,

Den eneste måde jeg kender til at gøre det "live" er ved hjælp af ajax. Men hvis du ikke er skarp på javascript fronten vil det blive et problem for dig.

Alternativt kan du lave din chat med frames..

Fold kodeboks ind/udKode 


Hvis du ser oven over har du nederst en bjælke hvor brugeren kan skrive i, altså en simpel form med en submit. Den loader "sig selv" igen, og her laver du bare en if sætning som tjekker nogle parametre og indsætter i databasen.

I øverste venstre side har du din "chat". Her henter du alt data med tidsstempler, eventuelt sæt limit på 50 eller 100 linjer chat" Efter alt dette er hentet skriver du det ud med et linebreak efter hver post. I slutningen af din kode laver du en sleep(10) og så skal den kalde sig selv igen. Benyt evt denne funktion:

function redirect($url = "."){
?><script type="text/javascript">
location.href="<?=$url?>";
</script><?
exit();
}


I højre side har du din bruger liste som du laver på samme måde som chatten på, den henter alle de brugere som er online fra din database. I din bruger database laver du et feldt som heder lastlogin hvor du sætter et tidsstempel. Når du henter din brugerliste kan du hente alle brugere som har været online inden for de sidste 5 min eks. Hver gang en bruger opdaterer sin klient, henter data eller noget så opdateres denne lastlogin så dine brugere ikke bliver smidt af chatten automatisk efter 5 min.

Håber det gav dig lidt insight i hvordan man kan gøre det.



Indlæg senest redigeret d. 29.02.2008 10:34 af Bruger #12245
Men jeg har hørt noget med, at man kan "buffe" oplysninger ved hjælp af funktionen flush(). Jeg har læst om funktionen på php.net, men kan ikke finde ud af, hvordan jeg skal bruge den, og hvor jeg skal sætte den ind....



Kan PHP reagere samtidig med at en bruger tilføjer data til mySQL? Og hvordan?

Jeg har forsøgt at lave noget med

while(1){
....
....
sleep(2);
}

sådan at den hver 2. sekund tjekker om der er sket noget nyt. Men scriptet virker ikke.... HJÆÆÆÆLP!


Prøv lige at sætte et reelt eksempel op på hvordan du havde tænkt dig dette skal bruges?



Gnu: lyder spændende... tjekker det lige ud!

Jer andre:
Jeg skal lave et chatrum. I JavaScript er jeg totalt lost, og derfor vil jeg gerne udvikle et php-script der med det samme udskriver de data en bruger har sendt for et øjeblik siden (eller 2 sek. for den sags skyld). Så jeg har lavet noget lignende:

Fold kodeboks ind/udKode 




Er ikke helt sikker på, at jeg har skrevet det korrekt, men det er noget i den stil.... Kan det lade sig gøre?



og hvordan er det så lige man gør det...? Er ny her...



t