2010-11-19 10 views
1

Ich habe ein Problem mit meinem IRC Bot-Skript, ich habe es in meine Curl-Transfer-Methode implementiert.PHP - IRC Bot Skript Hängen

Ich habe ein Problem, sobald der IRC-Bot sendet eine Nachricht an den IRC-Kanal, alle "Echo" am Ende des Skripts nicht angezeigt und die Seite hängt. Der ganze Apache hängt.

<?php 

$ircServer = "///"; 
$ircPort = "6667"; 
$ircChannel = "#bots"; 

set_time_limit(0); 

$msg = $_POST['msg']; 
$paper = $_POST['paper']; 
$sizzor = $_POST['sizzor']; 
$hand = $_POST['hand']; 

$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS); 

if ($ircSocket) 
{ 

    fwrite($ircSocket, "USER Lost rawr.test lol :code\n"); 
    fwrite($ircSocket, "NICK Rawr" . rand() . "\n"); 
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n"); 

ignore_user_abort(TRUE); // Noob Close down page 

    fwrite($ircSocket, "PRIVMSG " . $ircChannel . " :" . $msg . "\n"); 

    while(1) 
    { 
     while($data = fgets($ircSocket, 128)) 
     { 
      echo nl2br($data); 
      flush(); 

      // Separate all data 
      $exData = explode(' ', $data); 

      // Send PONG back to the server 
      if($exData[0] == "PING") 
      { 
       fwrite($ircSocket, "PONG ".$exData[1]."\n"); 
      } 
} 
    echo $eS . ": " . $eN; 
} 
} 
?> 
if ($bootcontents == 'success') {  
echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>'; 

Dieser Teil zeigt nicht im Skript:

if ($bootcontents == 'success') { 
    echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>'; 

Die Seite hängt nur, wenn ich die exit(); Funktion auf in der Nähe der Spitze der ganze „Echo“ Info zeigen nicht hinzufügen.

Bitte kann jemand helfen.

+0

Ich sehe, Sie haben eine Schleife: while (1). Wenn Sie keine Abbruchbedingung haben, um aus dieser Schleife auszubrechen, handelt es sich um eine Endlosschleife. – ryanlahue

+3

Start solcher Sachen über einen Webserver ist schlecht. Zusaetzlich lassen gesunde Server Ihren Bot keine Nachrichten senden, da er nicht auf ein PING reagiert, das wahrscheinlich direkt nach dem Empfang von USER und NICK gesendet wird. – ThiefMaster

+0

Sie müssen Ihren Bot über die Befehlszeile und nicht über eine Webseite ausführen. – Jocelyn

Antwort

0

Sie erstellen eine Endlosschleife:

while (1) 
// ... 

Diese Schleife kann nie Ende, da Sie nicht eine Exit-Anweisung (wie break) verwendet haben. Daher wird der Code nach der Endlosschleife niemals ausgeführt. Darüber hinaus ist es eine ausgelastete Schleife (mit viel CPU-Ressourcen), so dass der gesamte Apache (und Computer) hängen bleibt.

+0

Warum die -1? Die Antwort sollte korrekt sein (?) – apfelbox

+0

Das Skript soll unendlich laufen, das ist von Entwurf. Wahrscheinlich sehen Sie deshalb den Downvote. Es ist offensichtlich aus dem Code, dass dies Absicht ist. Sicher ist die Erklärung, die gegeben wird, Teil des Fehlschlags OP tut. Sie bekommen also eine Gegenabstimmung. – hakre

+0

hakre ... OP hat eine Endlosschleife, um die Serverausgabe zu erfassen, aber sein Design ist völlig falsch ... Und die Frage von OP zu beantworten, warum das Echo nie mit den obigen 2 Antworten läuft, ist vollkommen gültig, da er nie nachgefragt hat über sein Design, aber warum dieser Teil des Codes nicht funktioniert. So können wir ignorieren, was seine Entwurfsabsichten waren und den Code selbst kommentieren. – Populus

0

Sie verlassen einige Zeilen aus den <?php ?> Tags, also was auch immer außerhalb von ihnen ist, wird als reiner Text behandelt. Sie fixieren die Schließung bewegt ?> Tags weiter unten:

 [this is the while(1) closing bracket] 
     } 
    // code past this line will never run, see below for details 
    echo $eS . ": " . $eN; 
    } 
} 
if ($bootcontents == 'success') { 
    echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>'; 
} 
?> <!-- closing tag goes here --> 

Die Seite würde sowieso nicht richtig arbeiten, weil die while(1) Schleife eine Exit-Bedingung fehlt:

while(1) { 
    while($data = fgets($ircSocket, 128)) { 
     // ... 
    } 
} 

Nach den inneren while Oberflächen, Ihr Skript läuft weiter und endet in einer leeren Endlosschleife (die den Server aufhängt, wenn er nicht dafür konfiguriert ist, diese Art von Lücke zu erkennen und zu beseitigen).

Auf eine letzte Notiz, PHP ist wahrscheinlich nicht das beste Werkzeug für den Job: Sie wären viel besser dran mit einer eigenständigen Anwendung.

0
while($data = fgets($ircSocket, 128)) 

Dieser Teil blockiert das Skript ausgeführt wird, bis er Daten empfängt, und wenn irgendwie bist du keine Daten über das Socket bekommen ... gut du bist dort stecken ... für immer ... lol ok, stecken bis das PHP-Skript abgelaufen ist.

Wenn dieser Teil nicht abruft, steckst du immer noch in der while-Schleife und es gibt keine Möglichkeit, den Teil deines Codes auszuführen, der Echos ausfüllt ... also sowohl apfelbox als auch Alex sind korrekt, einfach nicht vollständig erklärt ...

Um eine Endlosschleife zu haben, aber auch Code außerhalb ausführen zu können, müssten Sie das "Ereignis" abfangen, in dem Sie Code erfassen und ausführen möchten. Alle Ereignisse, die Sie erfassen möchten, müssen innerhalb der while-Schleife oder zumindest von der while-Schleife an eine Funktion gesendet werden, die die Eingabe vom Server analysiert und korrekt reagiert.

Ein noch besserer Weg, dies zu tun, ist die Verwendung des Beobachtermusters.

Ich würde wirklich nicht einen IRC-Bot mit PHP machen, auch wenn Sie es über die Kommandozeile ausführen ...PHP ist nicht als lang laufende Anwendung gedacht.