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

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

subscribe.php

В моем subscribe.php подать имя функции процедура звонил из 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) — подписка должна выполняться непосредственно на сервере в фоновом режиме, а не вызываться через браузер (чтобы избежать тайм-аутов сервера, тайм-аутов соединения с браузером, …)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]