Почему в файле phpMQTT превышено максимальное время выполнения 30 секунд - PullRequest
0 голосов
/ 31 мая 2018

Я столкнулся с проблемой при получении данных из 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 функция proc определена, как показано ниже.

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 Ответ

0 голосов
/ 31 мая 2018

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

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

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

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

...