Avatar billede fixbabe Nybegynder
05. januar 2009 - 16:53 Der er 6 kommentarer og
1 løsning

First in, first out

Jeg har følgende script som skriver de sidste 3 nyheder fra en hjemmeside på en række irc kanaler, problemer er at botten flooder fordi den skriver det hele på en gang. Jeg har fået anbefalet at benytte FIFO men jeg har ingen ide om hvad det er eller hvordan jeg laver det så jeg håber der er en der kan hjælpe.

Script:
<?php

    include_once("/sql.php");

    $res = mysql_query("SELECT * FROM nyheder where order by id desc limit 3")or die(mysql_error());
    while ($row = mysql_fetch_assoc($res)) {
       
        $fp = fsockopen("IP", "PORT", $errno, $errstr, 30);
        if (!$fp) { echo "$errstr ($errno)\n"; } else {
           
            $out = "PASS PASSWORD\r\nUSER USERNAME dk.quakenet.org :IRC bit\r\nNICK BOTNICK\r\n";
            fwrite($fp, $out);
           
                $res1 = mysql_query("SELECT * FROM irc_kanaler order by id asc")or die(mysql_error());
                while ($channel = mysql_fetch_assoc($res1)) {
               
                    fwrite($fp,"PRIVMSG #".$channel['channel']." : Nyhed: ".$row['titel']." www.website.dk/nyhed/".$row['id']."/\r\n");
                }
            fwrite($fp,"QUIT \r\n");
            while (!feof($fp)) { $buffer = fgets($fp, 128); }
        }
    }
?>
Avatar billede jokkejensen Novice
05. januar 2009 - 17:07 #1
FIFO er sikkert en fin ide, men det er nok lettere bare symptombehandle det ved at få dit script til at vente 500ms før du fyrer den næste besked ind på kanelen.

fwrite($fp,"PRIVMSG #".$channel['channel']." : Nyhed: ".$row['titel']." www.website.dk/nyhed/".$row['id']."/\r\n");
//vent 750ms


/J
Avatar billede fixbabe Nybegynder
05. januar 2009 - 17:15 #2
Hvordan får jeg den til at vente? jeg har prøvet med sleep men det har ingen virkning
Avatar billede jokkejensen Novice
05. januar 2009 - 17:35 #3
årh.. jeg kender ikke til php....

Jeg kan ikke huske om man kan oprette alias så det kunne løses med mirc script.

alias wait {
  ; defaults to 1000ms
  if ($1) { var %duration = $1 }
  else { var %duration = 1000 }
  var %tmp = $+($ticks,.wsf)
  var %cmd = <job id="js"><script language="jscript">WScript.Sleep( $+ %duration $+  );</script></job>
  write %tmp %cmd
.comopen %tmp WScript.Shell | if !$comerr { .comclose %tmp $com(%tmp,Run,3,bstr,%tmp,uint,0,bool,true) }
  .remove %tmp
}


så vil: /wait(1000) vente et sec i mirc.

Med php kan du vel gøre det ved at sammenligne et tidspuinktet sidste linie var udskrevet med det aktuelle tidspunkt, altså i en løkke teste om tidspunktet (sat ved første udskrift) er 500 ms senere, ellers forsæt løkken.

/J
Avatar billede mstorgaard Praktikant
05. januar 2009 - 19:24 #4
Avatar billede mstorgaard Praktikant
05. januar 2009 - 19:25 #5
Mere præcist: http://dk.php.net/usleep
Avatar billede fixbabe Nybegynder
05. januar 2009 - 20:58 #6
usleep virker heller ikke.
Avatar billede fixbabe Nybegynder
10. januar 2009 - 11:30 #7
Lukker, har ikke fundet en løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester