Длинная телеграмма опроса с асинхронным React PHP - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь сделать длинный опрос с реакцией php. У меня есть функция getNotifications , которая остается в длительном опросе в ожидании ответа от Telegram. Эта телеграмма API может держать запрос открытым до таймаута или может отправлять ответ до конца 50 секунд, если есть уведомление. Как я могу вспомнить getNotifications после ответа от Telegram? В основном я хочу, чтобы getNotifications вызывалось снова, когда есть ответ. Это мой код, спасибо всем

<?php

require "vendor/autoload.php";

use Clue\React\Buzz\Browser;
use Psr\Http\Message\ResponseInterface;
use React\EventLoop\LoopInterface;

$loop = React\EventLoop\Factory::create();

$browser = new Browser($loop);

$method = "getUpdates";

$timeout = 50;

$params = [
    "offset" => 550495530,
    "limit" => 1000,
    "timeout" => $timeout
];

$bot_key = "your bot token";

$query = http_build_query($params);

$url = "https://api.telegram.org/bot" . $bot_key . "/" . $method . "?" . $query;

$browser = $browser->withOptions(array(
    'timeout' => $timeout
));

function callback(){
    echo "done";
}

function getNotifications($url, $browser, LoopInterface $loop){
    $browser->get($url)->then(function (ResponseInterface $response) {
        // response received within 50 seconds. Telegram longpolling
        var_dump((string)$response->getBody());
        callback();
    });
}

function timer($start, LoopInterface $loop)
{
    //Timer only used to count seconds
    $loop->addPeriodicTimer(1.0, function ($timer) use (&$start, $loop) {
            echo "tick ". $start++ . "\n";
    });
}

timer(0, $loop);

getNotifications($url, $browser, $loop);

$loop->run();

1 Ответ

0 голосов
/ 26 марта 2020

Хорошо, я нахожу решение. Чтобы передать параметр анонимной функции, мне нужно использовать ключевое слово use . Тогда внутри функции я могу получить доступ к переменным.

function getNotifications($url, $browser, LoopInterface $loop){
    $browser->get($url)->then(function (ResponseInterface $response) use ($url, $browser,$loop) {
      // response received within 50 seconds. Telegram longpolling
      var_dump((string)$response->getBody());
      callback();
      getNotifications($url, $browser,$loop);
});

}

...