[英]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.