首页 > 解决方案 > 需要 IRC 机器人的非阻塞套接字的 PHP 帮助

问题描述

我一直在学习用 PHP 编写一个 IRC 机器人,它工作得很好,但是阻塞已经成为一个问题,因为我希望某些动作基于计时器发生。我一直在尝试学习非阻塞,但我正在努力让它正常工作。谁能看看我的代码,让我知道我哪里出错了?

<?php

$ircPort = 6667;
$ircBotNick = "CaveBot";
$ircBotPrefix = "!";
$ircBotPass = "";
$ircBotIdent = "CaveBot";
$ircBotRealName = "Cavemans Bot Script";
$ircDefaultChannel = "#CaveDen";
$ircServer = "localhost";

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$error = socket_connect($socket, $ircServer, $ircPort);
socket_set_nonblock($socket);

while (1) {

$read   = array($socket);
$write  = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, 0);

if ($num_changed_sockets === false) {
    // Error handling
} else if ($num_changed_sockets > 0) {

    $data = socket_read($socket, 1024, PHP_NORMAL_READ);
    echo $n . " - ";
    $d = explode(' ', $data);

    $d = array_pad($d, 10, '');

    if ($d[0] === 'PING') {

        socket_write($socket, "PONG $d[1]");
    }
    print_r($data);
}

}

我认为我没有正确处理读取/传入的数据。它开始连接,但在服务器发出有关查找主机名的消息后冻结。当我使用具有阻塞的类似代码时,我会在查找后收到 ping 和欢迎消息。

标签: phpsocketsirc

解决方案


推荐阅读