Почему в файле phpMQTT превышено максимальное время выполнения 30 секунд

Я столкнулся с проблемой, когда я получаю данные из cloudmqtt. Я скачал проект по этой ссылке GitHub.

subscribe.php

В моем subscribe.php подать имя функции proc, вызываемой из phpMQTT.php файл. Это subscribe.php код файла

$topics['sensor_data'] = array("qos" => 0, "function" => "procmsg");
$mqtt->subscribe($topics, 0);
while($mqtt->proc()){       
}
$mqtt->close();

phpMQTT.php

В моем phpMQTT.php Подайте функцию, определенную как показано ниже.

function proc( $loop = true){
    if(1){
        $sockets = array($this->socket);
        $w = $e = NULL;
        $cmd = 0;

            //$byte = fgetc($this->socket);
        if(feof($this->socket)){
            if($this->debug) echo "eof receive going to reconnect for good measure\n";
            fclose($this->socket);
            $this->connect_auto(false);
            if(count($this->topics))
                $this->subscribe($this->topics);    
        }

        $byte = $this->read(1, true);

        if(!strlen($byte)){
            if($loop){
                usleep(100000); //Fatal error shows this line
            }

        }else{ 

            $cmd = (int)(ord($byte)/16);
            if($this->debug) echo "Recevid: $cmd\n";

            $multiplier = 1; 
            $value = 0;
            do{
                $digit = ord($this->read(1));
                $value += ($digit & 127) * $multiplier; 
                $multiplier *= 128;
                }while (($digit & 128) != 0);

            if($this->debug) echo "Fetching: $value\n";

            if($value)
                $string = $this->read($value);

            if($cmd){
                switch($cmd){
                    case 3:
                        $this->message($string);
                    break;
                }

                $this->timesinceping = time();
            }
        }

        if($this->timesinceping < (time() - $this->keepalive )){
            if($this->debug) echo "not found something so ping\n";
            $this->ping();  
        }


        if($this->timesinceping<(time()-($this->keepalive*2))){
            if($this->debug) echo "not seen a package in a while, disconnecting\n";
            fclose($this->socket);
            $this->connect_auto(false);
            if(count($this->topics))
                $this->subscribe($this->topics);
        }
    }
    return 1;
}

Если я использую set_limit_time(0); в верхней части файла phpMQTT.php. Тогда, когда я брови subscribe.php в браузере загрузка никогда не заканчивается.

Если я использую set_limit_time(60); в верхней части файла phpMQTT.php. Тогда, когда я брови subscribe.php в браузере через 60 секунд я получаю некоторые данные (6 данных) с этой ошибкой.

Неустранимая ошибка: максимальное время выполнения 60 секунд превышено в C:\xampp\htdocs\phpMQTT\examples\phpMQTT.php в строке 275

Строка 275 указывает, что usleep(100000);,

Если я использую set_limit_time(30); в верхней части файла phpMQTT.php. Тогда, когда я брови subscribe.php в браузере через 30 секунд я получаю некоторые данные (3 данных) с этой ошибкой.

Неустранимая ошибка: максимальное время выполнения 30 секунд превышено в C:\xampp\htdocs\phpMQTT\examples\phpMQTT.php в строке 275

Где я не прав? И как я могу решить эту проблему?

1 ответ

proc Метод предназначен для запуска "навсегда"

while($mqtt->proc()){ }

Поскольку он всегда возвращает true, цикл никогда не заканчивается. Таким образом, если вы установите ограничение по времени на 30 секунд (или что-то еще), оно всегда потерпит неудачу после этого периода времени (скорее всего, в usleep метод, потому что сценарий проводит почти все время там)

Как упоминалось в некоторых ( проблема github) - подписка должна выполняться непосредственно на сервере в фоновом режиме, а не вызываться через браузер (так что вы избегаете тайм-аутов сервера, тайм-аутов соединения с браузером, ...)

Другие вопросы по тегам