Gå til innhold

CRONJOB erstatning - To php filer i uendelig loop?


Anbefalte innlegg

Gjest Slettet-rXRozPkg
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
Videoannonse
Annonse
Gjest Slettet-rXRozPkg

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

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

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 :green: 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 av FuLu
Lenke til kommentar

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 av RogerM
Lenke til kommentar
Gjest Slettet-rXRozPkg

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

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 av RogerM
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...