php - 需要 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 和欢迎消息。
解决方案
推荐阅读
- javascript - 不断收到返回未定义的 TypeError
- r - 无法在 R 中合并 xlsx 文件
- javascript - “AuthEffects.googleSignIn”调度了一个无效的动作,并且动作必须有一个类型属性
- node.js - npm install 默认尝试全局安装
- amazon-web-services - 用于 @searchable 注释的 AWS Amplify 过滤器
- html - 如何在没有查看/下载限制的网站上获取音频?
- javascript - 为什么 testmysite 声称我的网站很慢?
- python-3.x - 使用 numpy 现值函数
- angular - Angular`useFactory`服务设置抛出未捕获的错误:无法解析组件的所有参数
- c++ - 如何在 C++ 中修复 SDL2'SDL_RenderClear_REAL 处的断言失败'?