PHP IRC机器人创建无限循环

PHP IRC机器人创建无限循环,php,irc,Php,Irc,各位堆栈溢出的开发人员好!我最近又回到了web开发领域(尽管我以前不太擅长),PHP是我的首选武器。自从我离开PHP之后,PHP似乎已经发生了变化,再加上我从未使用过PHP套接字,这导致了我第一次尝试创建IRC bot的灾难性尝试(我在一个IRC频道上,bot开发规模很大,我想将其集成到我的网站中。用PHP编写它似乎也是一个有趣的挑战)。它创建了一个无限循环,使我的浏览器运行缓慢,我无法复制任何错误或警告。好朋友们会不会介意看一下这个脚本(基于此): 幸运云 服务器: 频道: 端口: ___

各位堆栈溢出的开发人员好!我最近又回到了web开发领域(尽管我以前不太擅长),PHP是我的首选武器。自从我离开PHP之后,PHP似乎已经发生了变化,再加上我从未使用过PHP套接字,这导致了我第一次尝试创建IRC bot的灾难性尝试(我在一个IRC频道上,bot开发规模很大,我想将其集成到我的网站中。用PHP编写它似乎也是一个有趣的挑战)。它创建了一个无限循环,使我的浏览器运行缓慢,我无法复制任何错误或警告。好朋友们会不会介意看一下这个脚本(基于此):


幸运云

服务器:
频道:
端口:
___________________________________________________________________________________________________________________


很抱歉出现任何格式问题。cpanel编辑器的行为很奇怪

您无法以这种方式实现它,导致问题的原因很简单,就是一旦
while(true)
循环启动,它就不会停止


您需要将请求与处理循环分开。因此,将循环作为后台进程(守护进程),然后通过另一个接口(例如
线程
数据库)将ping和pong ect推送到它,然后在循环的每次迭代中,查询数据库中的ping和pong。

PHP不是此工作的最佳选择。它真的不善于保持长时间运行的连接。此脚本可能用于短时间连接,您只需删除一条消息并离开即可。类似于“基于事件的通知”

脚本中的几个附加内容:

  • 时区
  • 错误报告和显示
  • 时限0
  • 当修改为
    while(!feof($socket)){
  • 乒乓球:用substr代替爆炸
  • 这连接到freenode,quakenet是个婊子-这里需要更多的魔法:)
  • 加入是在虽然,但我们只需要它一次-卫兵补充说
  • 在频道内观看它的连接
  • 输出未刷新…嗯


幸运云
<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>Lucky Cloud</title>
    </head>

    <body>
        <?php
            error_reporting(E_ERROR);

            $bot = array(
                            "Host"     => "irc.quakenet.org",
                            "Channels" => ["#cplusplus", "#BotDevGroundZero"],
                            "Nick"     => "LuckyCloud",
                            "Ident"    => "LuckyCloud",
                            "Real"     => "LuckyCloud",
                            "Port"     => 6667
                   );
            $buffer = "";
        ?>

        <p>
            Server: <?php echo $bot["Host"]; ?><br />
            Channel(s): <?php foreach($bot["Channels"] as $channel) echo $channel.($channel != end($bot["Channels"]) ? ", " : ""); ?><br />
            Port: <? echo $bot["Port"]; ?><br />
            ___________________________________________________________________________________________________________________<br />
        </p>

        <?php
            global $socket;
            $socket = fsockopen($bot["host"], $bot["Port"]);

            function sendData($cmd, $msg = null) {
                if($msg == null) {
                    fputs($socket, $cmd."\r\n");
                    echo "<strong>".$cmd."</strong><br />";
                }

                else {
                    fputs($socket, $cmd." ".$msg."\r\n");
                    echo "<strong>".$cmd." ".$msg."</strong><br />";
                }
            }

            sendData("NICK", $bot["Nick"]);
            sendData("USER", $bot["Ident"]." ".$bot["Host"]." ".$bot["Real"]);

            $buffer = "";

            while(true) {
                foreach($bot["Channels"] as $channel) {
                    sendData("JOIN", $channel);
                }

                $buffer += fgets($socket, 1024);
                $temp = explode("\n", $buffer);
                $buffer = end($temp);

                foreach($temp as $line) {
                    echo $line;
                    $line = rtrim($line);
                    $line = explode($line);

                    if($line[0] == "PING") {
                        sendData("PONG", $line[1]);
                    }
                }
            }
        ?>
    </body>
</html>
<html lang="en-US">
<head>
    <title>Lucky Cloud</title>
</head>  
<body>
    <?php
        date_default_timezone_set('America/Los_Angeles');
        error_reporting(E_ALL);
        ini_set("display_errors", 1);
        set_time_limit(0);

        $bot = array(
            "Host"     => "kornbluth.freenode.net", #"underworld2.no.quakenet.org", #irc.quakenet.org",
            "Channels" => ["#testerchan"],
            "Nick"     => "Tester7888",
            "Ident"    => "Tester7888",
            "Real"     => "Susi Q",
            "Port"     => 6667
        );
    ?>

    <p>
        Server: <?php echo $bot["Host"]; ?><br />
        Channel(s): <?php foreach($bot["Channels"] as $key => $channel) { echo $channel; } ?><br />
        Port: <?php echo $bot["Port"]; ?><br />
        ___________________________________________________________________________________________________________________<br />
    </p>

    <?php
        global $socket;

        function sendData($cmd, $msg = null) {
            global $socket;
            if($msg == null) {
                fputs($socket, $cmd."\r\n");
                echo "<strong>".$cmd."</strong><br />";
            } else {
                fputs($socket, $cmd." ".$msg."\r\n");
                echo "<strong>".$cmd." ".$msg."</strong><br />";
            }
        }

        $socket = fsockopen($bot["Host"], $bot["Port"], $error1, $error2);
        if(!$socket) {
            echo 'Crap! fsockopen failed. Details: ' . $error1 . ': ' . $error2;
        }

        sendData("NICK", $bot["Nick"]);
        sendData("USER", $bot["Ident"]." ".$bot["Host"]." ".$bot["Real"]);

        $join_at_start = true;

        $buffer = "";

        while (!feof($socket)) {
            $buffer = trim(fgets($socket, 128));
            echo date('H:i')." ".nl2br($buffer)."<br/>";
            flush();

            # Ping <-> Pong
            if(substr($buffer, 0, 6) == "PING :") {
                fputs($socket, "PONG :".substr($buffer, 6)."\r\n");
                echo $buffer;
                flush();
            }

            // break out of while, 0 bytes
           /* $stream_meta_data = stream_get_meta_data($socket);
            if($stream_meta_data['unread_bytes'] <= 0) {
                break;
            }*/

            # join only one time
            if($join_at_start === true && false === strpos($buffer, 'Your host is trying to (re)connect too fast -- throttled')) {
                foreach($bot["Channels"] as $key => $channel) {
                   sendData("JOIN", $channel);
                   $join_at_start = false;
                }
            }
        }
    ?>
</body>