php irc bot,定期向通道发送消息

php irc bot,定期向通道发送消息,php,bots,irc,Php,Bots,Irc,我按照一些教程从头开始创建bot,基本功能运行良好,比如我可以连接,它响应命令,并将结果输出到网页 我想要的是周期性地向频道发送带有更新的消息,这是我从某个有curl的网站上得到的 $irc和$curl只是带有设置的数组,date('s')是返回更新的函数。当然,我有工作旋度函数。$irc['delay']被设置为10,因此对于sleep(1),它应该每10秒发送一次更新 问题是,在第一分钟左右,它每10秒发送一次当前秒数,但它不听我设置的任何命令。它在第一次初始延迟后执行命令,我不知道它来自哪

我按照一些教程从头开始创建bot,基本功能运行良好,比如我可以连接,它响应命令,并将结果输出到网页

我想要的是周期性地向频道发送带有更新的消息,这是我从某个有curl的网站上得到的

$irc和$curl只是带有设置的数组,date('s')是返回更新的函数。当然,我有工作旋度函数。$irc['delay']被设置为10,因此对于sleep(1),它应该每10秒发送一次更新

问题是,在第一分钟左右,它每10秒发送一次当前秒数,但它不听我设置的任何命令。它在第一次初始延迟后执行命令,我不知道它来自哪里
然后,仅当有人在频道上讲话时,它才会显示当前秒数(if条件)。我猜它会等待这128个字节?但它确实会立即听取命令

while(1) {
    while($data = fgets($socket, 128)) {
        echo nl2br($data);
        flush();

        if ($curl['delay'] <= $d) { fputs($socket, "PRIVMSG ".$irc['channel']." :".date('s')."\n"); $d=0; };
        $d+=1;
        sleep(1);

        $ex = explode(' ', $data);
        if($ex[0] == "PING") fputs($socket, "PONG ".$ex[1]."\n");
        $command = str_replace(array(chr(10), chr(13)), '', $ex[3]);
        switch ($command) {
            case ":!say" : fputs($socket, "PRIVMSG ".$ex[2]." :Hello!\n"); break;
            case ":!off" : break 3;
        };
    };
}
while(1){
而($data=fgets($socket,128)){
echo nl2br(数据);
冲洗();

如果($curl['delay'],我想问题是($data=fgets($socket,128))
循环中有所有逻辑。如果你想一想,如果聊天中发生了什么事情,就会执行你的逻辑。因此,当你启动脚本时,它执行ok,因为它读取了那里的数据(我假设是这样),但在读取该数据之后,它仅对新数据执行

现在,它在聊天时只打印秒数,因为它等待128字节的10倍(您的意思是10秒),因为只有当内部while循环条件始终为真时(如果每秒执行一次),它才会打印10秒

您可以尝试将一些逻辑移到内部while循环之外。我还为您更改了curl计时-使其休眠1秒并向计数器添加1的方式-这是不可靠的。您可以简单地将当前时间与上次请求的时间进行比较

while(1) {
    flush();

    if ($curl['next_request'] <= time()) {
        fputs($socket, "PRIVMSG ".$irc['channel']." :".date('s')."\n");
        $curl['next_request'] = time() + $curl['delay'];
    };

    while($data = fgets($socket, 128)) {
        echo nl2br($data);
        $ex = explode(' ', $data);
        if($ex[0] == "PING") fputs($socket, "PONG ".$ex[1]."\n");
        $command = str_replace(array(chr(10), chr(13)), '', $ex[3]);
        switch ($command) {
            case ":!say" : fputs($socket, "PRIVMSG ".$ex[2]." :Hello!\n"); break;
            case ":!off" : break 3;
        };
    };

    sleep(1);
}
while(1){
冲洗();

如果($curl['next_request']经过一天的痛苦,我终于找到了愚蠢的原因和解决方案。基本上,延迟1分钟的原因是fget命令,而($data=fgets($socket,128));
解决方法是在循环之前设置流\u设置\u超时($socket,1);我也最终设置了nginx服务器而不是apache。但我不确定这是否有帮助。
另外,我认为我可以设置流中的时间\u设置\u超时($socket,1);以控制发送消息的最小间隔

$next=time();
stream_set_timeout($socket,1);
while(1) {

    $data = fgets($socket, 128);
    echo nl2br($data);

    $ex = explode(' ', $data);
    if($ex[0] == "PING") fputs($socket, "PONG ".$ex[1]."\n");
    if (isset($ex[3])) $command = str_replace(array(chr(10), chr(13)), '', $ex[3]);

    switch ($command) {
        case ":!sayit" : 
            $msg = NULL; for ($i = 4; $i < count($ex); $i++) { $msg .= $ex[$i] . ' '; }
            fputs($socket, "PRIVMSG ".$ex[2]." :".$msg."\n"); 
            break;
        case ":!off" :
          fputs($socket, "PRIVMSG ".$irc['channel']." : Bye\n");
          fputs($socket,"QUIT Client Disconnected!\n");
          die('Exited!');
    };

    if ($next <= time()) {
        fputs($socket, "PRIVMSG ".$irc['channel']." :".date('H:i:s')."\n");
        echo "PRIVMSG ".$irc['channel']." :".date('H:i:s')."<br />";
        $next = time() + $curl['delay']; 
    };
    flush(); 
};
$next=time();
流设置超时($socket,1);
而(1){
$data=fgets($socket,128);
echo nl2br(数据);
$ex=爆炸(“”,$data);
如果($ex[0]=“PING”)FPUT($socket,“PONG”。$ex[1]。“\n”);
如果(isset($ex[3]))$command=str_replace(数组(chr(10),chr(13)),“”,$ex[3]);
开关($命令){
案例“:!说吧”:
$msg=NULL;对于($i=4;$i如果($next)感谢您的快速回复,但是没有,我将编辑我的主要帖子来说明发生了什么?因为有限制。单独调试curl块。它现在是单独的,所以这是可能的。回显变量可以查看出了什么问题。这是有线的,它不会时不时地回显秒。