Heim  >  Fragen und Antworten  >  Hauptteil

Maximieren Sie die asynchrone Leistung: Nutzen Sie die volle Leistung von Guzzle 7 über die ReactPHP-Ereignisschleife für nicht blockierende E/A

Ich habe einen DiscordPHP-Bot und versuche, einige Webseiten herunterzuladen, die Cookies erfordern. Es scheint, dass ich den Curl-Handler mit Guzzle verwenden muss, da der ReactPHP-HTTP-Browser keine Cookies unterstützt.

Ich habe dieses minimale Skript erstellt:

use GuzzleHttp\Client;
use GuzzleHttp\Handler\CurlMultiHandler;
use GuzzleHttp\HandlerStack;
use Psr\Http\Message\ResponseInterface;

include 'vendor/autoload.php';

$loop = \React\EventLoop\Loop::get();

$curl = new CurlMultiHandler;
$handler = HandlerStack::create($curl);
$client = new Client( [ /* 'cookies' => $cookieJar, */ 'handler' => $handler ] );

$promise = $client->getAsync('https://httpstat.us/200')
    ->then(
        function (ResponseInterface $res) {
            echo 'response: ' . $res->getStatusCode() . PHP_EOL;
        },
        function (\Exception $e) {
            echo $e->getMessage() . PHP_EOL;
        }
    );


$timer = $loop->addPeriodicTimer(0.5, function () use ($curl, $promise) {
    if ($promise->getState() === 'pending') {
    echo 'Tick ';
    $curl->tick();
    }
    echo 'Beat ';
});

$loop->run();

Dies wird sofort beendet, ohne dass der addPeriodicTimer 来检查挂起并手动调用 tick()-Code hinzugefügt wird:

$ time php minimal.php
0.022u 0.010s 0:00.03 100.0%    0+0k 0+0io 67pf+0w

Mit dem Timer funktioniert es wie erwartet:

Tick Beat Tick Beat Tick Beat Tick Beat Tick Beat Tick Beat Tick response: 200
Beat Beat Beat ...

Die Idee zur Verwendung tick() kam aus diesem geschlossenen Thread mit 73 Kommentaren auf github.com.

Es gibt einige ähnliche Fragen, aber keine scheint dieses Problem zu lösen:

So verwenden Sie Cookie Jar, um HTTP GET zu initiieren und eine Antwort in der ReactPHP-Ereignisschleife zu erhalten, ohne blockierende Aufrufe (wie ->wait() oder manuelles Curling) zu verwenden GET 并在 ReactPHP 事件循环中获取响应,而不使用阻塞调用(例如 ->wait() 或手动 tick()

P粉043566314P粉043566314268 Tage vor492

Antworte allen(1)Ich werde antworten

  • P粉384366923

    P粉3843669232024-02-18 11:41:28

    嗯,ReactPHP 不会自动设置 cookie,已经有一个讨论此主题的票证: https ://github.com/reactphp/http/issues/445,但您仍然可以手动方式设置 HTTP cookie 标头。

    还值得一提的是,将 ReactPHP 与 Guzzle 一起使用将不起作用,因为 Guzzle 会阻止 ReactPHP 的事件循环。这意味着您可以发送多个请求,但不能异步执行任何其他操作。

    Antwort
    0
  • StornierenAntwort