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