簡體   English   中英

PHP-IRC Bot腳本掛起

[英]PHP - IRC Bot Script Hanging

我的IRC Bot腳本有問題,我已將其實現為Curl傳輸方法。

我有一個問題,一旦IRC漫游器向IRC通道發送了一條消息,腳本末尾的所有“ echo”都不會顯示,並且頁面會掛起。 整個Apache掛起。

<?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>';

該部分在腳本執行期間不顯示:

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

如果我添加exit();頁面只會掛起exit(); 功能到頂部附近,不會顯示整個“回聲”信息。

請有人幫忙。

您正在創建一個無限循環:

while (1)
// ...

由於您沒有使用exit語句(例如break ),因此該循環永遠無法完成。 因此,永遠不會執行無限循環之后的代碼。 此外,這是一個繁忙的循環(使用大量CPU資源),因此整個apache(和計算機)將掛起。

您在<?php ?>標記中保留了一些行,因此它們之外的所有內容都將被視為純文本。 您修復了此問題,使結束的?>標記進一步向下移動:

        [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 -->

無論如何,該頁面將無法正常工作,因為while(1)循環缺少退出條件:

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

內后while結束,你的腳本不斷循環,結束了被困在一個空的,無限循環(這將掛起服務器最多,如果它不被配置為檢測並殺死這種漏洞)。

最后要注意的是,PHP可能並不是最好的工具:使用獨立應用程序會更好。

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

這部分阻止腳本運行,直到它接收到數據為止,並且如果不知何故您沒有通過該套接字獲取數據...那么,您將永遠被困在那里...永遠...哈哈,好吧,直到PHP腳本超時為止。

如果該部分沒有捕獲,則您仍停留在while循環中,因此無法運行代碼中回顯內容的那一部分...因此apfelbox和Alex都是正確的,只是沒有完全解釋...

為了具有無限循環但還可以在外部運行代碼,您需要捕獲要捕獲並運行代碼的“事件”。 您要捕獲的所有事件都需要放在while循環內,或者至少從while循環調度到一個函數,該函數將解析服務器的輸入並正確響應。

一種更好的方法是利用觀察者模式。

即使您通過命令行運行它,我也真的不會用PHP制作IRC機器人... PHP並不是要作為長期運行的應用程序運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM