PHP - виснет скрипт IRC бота - PullRequest
       20

PHP - виснет скрипт IRC бота

1 голос
/ 20 ноября 2010

У меня проблема с моим скриптом IRC Bot, я внедрил его в свой метод переноса Curl.

У меня проблема, когда бот IRC отправляет сообщение на канал IRC, все "echo "в конце скрипта не показывает и страница зависает.Весь Apache зависает.

<?php

$ircServer = "///";
$ircPort = "6667";
$ircChannel = "#bots";

set_time_limit(0);

$msg = $_POST['msg'];
$paper = $_POST['paper'];
$sizzor = $_POST['sizzor'];
$hand = $_POST['hand'];

$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS);

if ($ircSocket)
{

    fwrite($ircSocket, "USER Lost rawr.test lol :code\n");
    fwrite($ircSocket, "NICK Rawr" . rand() . "\n");
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n");

ignore_user_abort(TRUE); // Noob Close down page

    fwrite($ircSocket, "PRIVMSG " . $ircChannel . " :" . $msg . "\n");

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

            // Separate all data
            $exData = explode(' ', $data);

            // Send PONG back to the server
            if($exData[0] == "PING")
            {
                fwrite($ircSocket, "PONG ".$exData[1]."\n");
            }
}
    echo $eS . ": " . $eN;
}
}
?>
if ($bootcontents == 'success') {     
 echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>';

Эта часть не отображается во время сценария:

if ($bootcontents == 'success') { 
    echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>';

Страница просто зависает, если я добавлю функцию exit(); в верхнюю частьвся информация "эхо" не отображается.

Пожалуйста, кто-нибудь может помочь.

Ответы [ 3 ]

0 голосов
/ 13 августа 2012

Вы пропускаете некоторые строки из тегов <?php ?>, поэтому все, что находится за их пределами, будет рассматриваться как простой текст.Вы исправили это, переместив закрывающие теги ?> дальше вниз:

        [this is the while(1) closing bracket]
        }
    // code past this line will never run, see below for details
    echo $eS . ": " . $eN;
    }
}
if ($bootcontents == 'success') {
  echo '<center><marquee behavior="alternate" direction="left">Spinning xxx at ' . $power . '% power.</marquee></center>';
}
?> <!-- closing tag goes here -->

Страница в любом случае не будет работать должным образом , поскольку в цикле while(1) отсутствует условие выхода:

while(1) {
    while($data = fgets($ircSocket, 128)) {
      // ...
    }
}

После завершения внутреннего while ваш сценарий продолжает зацикливаться, оказываясь в ловушке в пустом бесконечном цикле (который может привести к зависанию сервера, если он не настроен на обнаружение и устранение такого рода лазеек).

В заключение отметим, что PHP, вероятно, не лучший инструмент для работы: вам будет гораздо лучше с автономным приложением.

0 голосов
/ 15 октября 2012
while($data = fgets($ircSocket, 128))

Эта часть блокирует выполнение скрипта до тех пор, пока он не получит данные, и если каким-то образом вы не получаете данные через этот сокет ... ну, вы застряли там ... навсегда ... LOL хорошо, застрял до сценария PHP время ожидания.

Если эта часть не перехватывает, вы все еще застряли в цикле while, и поэтому нет никакого способа запустить часть кода, которая выводит информацию ... так что и apfelbox, и Alex верны, просто не объяснено полностью ...

Для того, чтобы иметь бесконечный цикл, а также иметь возможность запускать код снаружи, вам необходимо отловить «событие», в котором вы хотите захватить и запустить код. Все события, которые вы хотите захватить, должны находиться внутри цикла while или, по крайней мере, отправляться из цикла while в функцию, которая будет анализировать входные данные с сервера и правильно реагировать.

Еще лучший способ сделать это - использовать шаблон наблюдателя.

Я бы на самом деле не сделал IRC-бота с PHP, даже если вы запускаете его через командную строку ... PHP не предназначен для запуска в качестве приложения, работающего долго.

0 голосов
/ 07 августа 2012

Вы создаете бесконечный цикл:

while (1)
// ...

Этот цикл не может завершиться, поскольку вы не использовали оператор выхода (например, break). Поэтому код после бесконечного цикла никогда не выполняется. Кроме того, это занятый цикл (использующий много ресурсов ЦП), поэтому весь апач (и компьютер) зависнет.

...