Gjest Slettet-rXRozPkg Skrevet 3. juni 2004 Del Skrevet 3. juni 2004 Lumted foreslår meg en løsning med å legge til en timestamp i databasen. Dette ville vært ok om databasen var lokal (min), men desverre snakker vi her om en remote database hvor jeg kun har lesetilgang. Og det er heller ingen løsning å få eieren til å modifisere databasen ved å tilføye timestamp, da dette jo ikke reduserer hans båndbredde krav, som sier at han ikke vil ha kall til databasen oftere enn hvert 60 sekund. Ok, hva med da å legge denne timestampen i en enkelt tekstfil der du har main.php? Når noen går til main.php, så åpner du timestamp.txt og sjekker om det er 60 sekunder eller mer siden det som står i tekstfila. Hvis det er det, så kjør oppdatering av html-filen (pluss oppdatering av timestampet), og send så vidre, ellers send rett til html-fila. Lenke til kommentar
Gjest Slettet-rXRozPkg Skrevet 3. juni 2004 Del Skrevet 3. juni 2004 Et forslag: <?php $fil = "timestamp.txt"; $timestamp_now = time(); if (file_exists($fil) && is_writable($fil) && is_readable($fil)) { /* r+ = Open for reading and writing; place the file pointer at the beginning of the file. ------------ w+ = Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it. */ $handle = fopen($fil, "r+"); $stamp_in_file = fgets($handle); if ($stamp_in_file == "") { // Hvis filen eksisteret, men er tom // Skriv nåværende timestamp til filen fwrite($handle, $timestamp_now); fclose($handle); } else { // Timestampet finnes, sammenlign med nåværende timestamp if ($timestamp_now - $stamp_in_file >=60) { // 60 eller flere sekunder har passert. $handle = fopen($fil, "w+"); fwrite($handle, $timestamp_now); fclose($handle); // Funksjoner for å oppdatere HTML fila kjøres // Hvis ønskelig: send vidre til HTML filen //header("Location: RESULTAT.HTML"); } else { // Mindre enn 60 sekunder har passert // Hvis ønskelig: send vidre til HTML filen //header("Location: RESULTAT.HTML"); } } } else { echo "Feil med $fil!"; } ?> Du må ordne skrivetilgang til filen med chmod eller noe slikt... Lenke til kommentar
Torbjørn Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 RogerM: når du bryter ssh forbindelsen så dør prosessen. enda et alternativ: bash myfile.bash &> logfile.txt & da kan du siden skrive tail -f logfile.txt for å se hva som skjer med prosessen. Lenke til kommentar
Torbjørn Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 man kan også legge til -q på wget kommandoen, dvs: wget -q --delete-after http://adresse/til/din/fil.php Lenke til kommentar
ZoRaC Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 (endret) *FJERNET* Endret 4. juni 2004 av ZoRaC Lenke til kommentar
RogerM Skrevet 4. juni 2004 Forfatter Del Skrevet 4. juni 2004 Takk Torbjørn Jeg vil gjerne komme tilbake til ditt siste forslag litt senere, men først vil jeg utforske Lumteds løsning litt. Hei lumted Jeg likte ditt forslag til løsning, og har derved forsøkt å bruke din kode sammens med den jeg hadde selv (main.php). Jeg tror dette vil virke, men jeg får en parse error: Parse error: parse error in /var/www/html/feeder/main.php on line 35 Kan du se i min komplette kode, og se hvor feilen evt. ligger, og om det er noe annet jeg gjør feil her? Her er den komplette main.php: MAIN.PHP <?php $fil = "timestamp.txt"; $timestamp_now = time(); $filename = "feed.html"; if (file_exists($fil) && is_writable($fil) && is_readable($fil)) { /* r+ = Open for reading and writing; place the file pointer at the beginning of the file. ------------ w+ = Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it. */ $handle = fopen($fil, "r+"); $stamp_in_file = fgets($handle); if ($stamp_in_file == "") { // Hvis filen eksisteret, men er tom // Skriv nåværende timestamp til filen fwrite($handle, $timestamp_now); fclose($handle); } else { // Timestampet finnes, sammenlign med nåværende timestamp if ($timestamp_now - $stamp_in_file >=60) { // 60 eller flere sekunder har passert. $handle = fopen($fil, "w+"); fwrite($handle, $timestamp_now); fclose($handle); //Noen variabler var $hostname = "xxxxxxxx"; var $username = "xxxxxxxx"; var $password = "xxxxx"; var $userstable = "xxxxx"; var $dbName = "xxxxxxx"; var $result; class db { function koble_til() { //Kobler til databasen vår mysql_connect($this->hostname,$this->username,$this->password) || die(mysql_error()); mysql_select_db($this->dbName) || die("Unable to select database"); } function skrivut() { //Skriver ut alt i tabellen ob_start(); //start the output buffer Echo "<html> <head><title>Live Feeder</title> <META HTTP-EQUIV=Refresh CONTENT=30> </head> <body>"; $query = "SELECT * FROM $this->userstable order by date desc limit 6"; $this->result = mysql_query($query); $number = mysql_num_rows($this->result); $i = 0; if ($number == 0) { echo "<CENTER><P>Fant ingen poster</CENTER>"; } elseif ($number > 0) { echo "<center><table border=0>"; while ($i < $number) { $username = mysql_result($this->result,$i,"username"); $description = mysql_result($this->result,$i,"description"); $date = mysql_result($this->result,$i,"date"); if($description=="New Member Signup") { echo '<tr><td><font style=verdana size=3><span style="color:red">'.$username.' </span></font></td><td><font style=verdana size=3><span style="color:red">'.$description.' </span></font></td><td><font style=verdana size=3><span style="color:red">'.$date.'</span></font></td></tr>'; } else { echo '<tr><td><font style=verdana size=3><span style="color:blue">'.$username.' </span></font></td><td><font style=verdana size=3><span style="color:blue">'.$description.' </span></font></td><td><font style=verdana size=3><span style="color:blue">'.$date.'</span></font></td></tr>'; } $i++; } echo "</table></CENTER>"; } echo "</body></html>"; $fp = fopen($filename, 'w'); fwrite($fp, ob_get_contents()); fclose($fp); ob_clean(); ob_end_flush(); // Send the output to the file } function steng_db() { mysql_free_result($this->result); //Lukker koblingen til databasen mysql_close(); } } //Slutt på klassen vår //Vi lager et nytt objekt $obj =& new db; //Så kaller vi opp funksjonene våre $obj->koble_til(); $obj->skrivut(); $obj->steng_db(); } else { // Mindre enn 60 sekunder har passert // Do NOTHING echo "Updating to fast, nothing done!"; } } } else { echo "Feil med $fil!"; } ?> Jeg planlegger så å legge bruke den omtalte INDEX.SHTML som trigger for main.php, ved å legge inn følgende i INDEX.SHTML <iframe src="http://adresse/til/main/main.php" width="0" height="0" scrolling=no frameborder="0"></iframe> Såfremt vi får main.php til å virke, er ovenstående en god måte å foreta denne triggingen på? Som du ser bruker jeg width og height = "0" for at den ikke skal vises i INDEX.SHTML Roger Lenke til kommentar
FuLu Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 (endret) Nå er jeg sånn passe trøtt, så orket ikke lese alle poster i detalj. Men sånn jeg forstår, så støtter serveren PHP? Og hovedmålet er å unngå for mye trafikk mot database (remote) når det ikke trengs? Men bare hver 60sec? Da tror jeg http://smarty.php.net/ kan være løsningen for deg. Om ikke det, så kan du stjele ideen med å cache en side som har en levetid på 60 sec. Dvs, re-caching av en side vil ikke bli trigget før en bruker stikker innom siden. Og skulle flere være innom samtidig, så er det bare den ene (første mann til mølla) som gjør at siden oppdaterer seg og de andre vil da få en statisk versjon opp som ikke krever noe database kall. Om smarty virker interessant, så kan "Crash Course" være kjekt å lese. Samt å lese manual om caching: http://smarty.php.net/manual/en/caching.php Dette vil kreve litt omskriving av din kode, så jeg regner med du sikkert forkaster dette Og ikke minst, så blir det ikke nødvendig med noe SSI og index.shtml opplegg, fordi den statiske siden vil bli outputtet av f.eks index.php Edit: En forenklet form for logikk når det gjelder caching: if(not cached) { do_database_query_and_render_html_page_etc() } else { show_cached_page() } Endret 4. juni 2004 av FuLu Lenke til kommentar
RogerM Skrevet 4. juni 2004 Forfatter Del Skrevet 4. juni 2004 (endret) FuLu Ditt forslag virker sikkert helt topp, men jeg er snart i mål med min "førskolekodeløsnig" og vil bruke den nå hvis jeg får det til. Vil kikke på ditt forslag når jeg avanserer og får lov til å starte i "første klasse grunnskole" :-) ******** Til lumted Jeg har nå "gjordt noe"....flyttet databasevariablene ned under class db.. class db { var $hostname = "67.18.54.176"; var $username = "canhost_members"; var $password = "xxxxxxxxx"; var $userstable = "micro"; var $dbName = "canhost_members"; var $result; ....og scriptet MAIN.PHP virker nå uten syntax feil, men der må likevel være en LOGISK FEIL et eller annet sted, for RESULTAT.HTML (eller feed.html som den egentlig heter) blir ikke oppdatert. Kan du ta en kikker hva jeg evt. gjør feil her? MAIN.PHP <?php $fil = "timestamp.txt"; $timestamp_now = time(); $filename = "feed.html"; if (file_exists($fil) && is_writable($fil) && is_readable($fil)) { /* r+ = Open for reading and writing; place the file pointer at the beginning of the file. ------------ w+ = Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it. */ $handle = fopen($fil, "r+"); $stamp_in_file = fgets($handle); if ($stamp_in_file == "") { // Hvis filen eksisteret, men er tom // Skriv nåværende timestamp til filen fwrite($handle, $timestamp_now); fclose($handle); } else { // Timestampet finnes, sammenlign med nåværende timestamp if ($timestamp_now - $stamp_in_file >=60) { // 60 eller flere sekunder har passert. $handle = fopen($fil, "w+"); fwrite($handle, $timestamp_now); fclose($handle); class db { var $hostname = "67.18.54.176"; var $username = "canhost_members"; var $password = "xxxxxxxxx"; var $userstable = "micro"; var $dbName = "canhost_members"; var $result; function koble_til() { //Kobler til databasen vår mysql_connect($this->hostname,$this->username,$this->password) || die(mysql_error()); mysql_select_db($this->dbName) || die("Unable to select database"); } function skrivut() { //Skriver ut alt i tabellen ob_start(); //start the outpu buffer Echo "<html> <head><title>C.A.N Micro Live Feeder</title> <META HTTP-EQUIV=Refresh CONTENT=30> </head> <body>"; $query = "SELECT * FROM $this->userstable order by date desc limit 6"; $this->result = mysql_query($query); $number = mysql_num_rows($this->result); $i = 0; if ($number == 0) { echo "<CENTER><P>Fant ingen poster</CENTER>"; } elseif ($number > 0) { echo "<center><table border=0>"; while ($i < $number) { $username = mysql_result($this->result,$i,"username"); $description = mysql_result($this->result,$i,"description"); $date = mysql_result($this->result,$i,"date"); if($description=="New Member Signup") { echo '<tr><td><font style=verdana size=3><span style="color:red">'.$username.' </span></font></td><td><font style=verdana size=3><span style="color:red">'.$description.' </span></font></td><td><font style=verdana size=3><span style="color:red">'.$date.'</span></font></td></tr>'; } else { echo '<tr><td><font style=verdana size=3><span style="color:blue">'.$username.' </span></font></td><td><font style=verdana size=3><span style="color:blue">'.$description.' </span></font></td><td><font style=verdana size=3><span style="color:blue">'.$date.'</span></font></td></tr>'; } $i++; } echo "</table></CENTER>"; } echo "</body></html>"; $fp = fopen($filename, 'w'); fwrite($fp, ob_get_contents()); fclose($fp); ob_clean(); ob_end_flush(); // Send the output to the file } function steng_db() { mysql_free_result($this->result); //Lukker koblingen til databasen mysql_close(); } } //Slutt på klassen vår //Vi lager et nytt objekt $obj =& new db; //Så kaller vi opp funksjonene våre $obj->koble_til(); $obj->skrivut(); $obj->steng_db(); } else { // Mindre enn 60 sekunder har passert // Do NOTHING echo "Updating to fast, nothing done!"; } } } else { echo "Feil med $fil!"; } ?> Roger Endret 4. juni 2004 av RogerM Lenke til kommentar
Gjest Slettet-rXRozPkg Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 Jeg ser ikke noe åpenlyst, men det er et par ting du kan gjøre for å lettere få oversikten. - Flytt db klassen ut av if-else strukturen, og la den stå etter selve scriptet. - Så kan du skrive ut mer debug informasjon, f.eks $query - Du kan også prøve å skrive ut ob_get_contents() til skjerm hvis det går... Lenke til kommentar
RogerM Skrevet 4. juni 2004 Forfatter Del Skrevet 4. juni 2004 Kan den logiske feil bestå i at jeg har objektkall og klasse INNI en function? Lenke til kommentar
RogerM Skrevet 4. juni 2004 Forfatter Del Skrevet 4. juni 2004 (endret) Er det mulig å gjøre noe slikt som dette? //Vi lager et nytt objekt $obj =& new db; //Så kaller vi opp funksjonene våre $obj->timestampvalidering(); if timestamvalideringengodkjennes { $obj->koble_til(); $obj->skrivut(); $obj->steng_db(); } else { // Mindre enn 60 sekunder har passert // Do NOTHING echo "Updating to fast, nothing done!"; } ? Endret 4. juni 2004 av RogerM Lenke til kommentar
Gjest Slettet-rXRozPkg Skrevet 4. juni 2004 Del Skrevet 4. juni 2004 Ja, burde fungere fint det... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå