Saya mempunyai bot DiscordPHP dan saya cuba memuat turun beberapa halaman web yang memerlukan kuki. Nampaknya saya perlu menggunakan pengendali curl dengan Guzzle kerana pelayar ReactPHP http tidak menyokong kuki.
Saya mencipta skrip minimum ini:
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();
Ini akan keluar serta-merta tanpa menambah kod addPeriodicTimer
来检查挂起并手动调用 tick()
:
$ time php minimal.php 0.022u 0.010s 0:00.03 100.0% 0+0k 0+0io 67pf+0w
Menggunakan pemasa, ia berfungsi seperti yang diharapkan:
Tick Beat Tick Beat Tick Beat Tick Beat Tick Beat Tick Beat Tick response: 200 Beat Beat Beat ...
Idea untuk menggunakan tick()
datang daripada urutan tertutup 73 ulasan ini di github.com.
Ada beberapa soalan yang serupa, tetapi nampaknya tiada satu pun menyelesaikan masalah ini:
wait()
Ini adalah panggilan menyekat. sleep()
调用,ReactPHP 真的是异步的吗?执行一个长 for
gelung. Kedua-duanya menyekat gelung. Cara menggunakan balang kuki untuk memulakan HTTP GET
dan mendapatkan respons dalam gelung acara ReactPHP tanpa menggunakan panggilan menyekat (seperti ->wait()
atau manual GET
并在 ReactPHP 事件循环中获取响应,而不使用阻塞调用(例如 ->wait()
或手动 tick()
ing curl 强>
Nah, ReactPHP tidak menetapkan kuki secara automatik, sudah ada tiket membincangkan topik ini: https://github.com/reactphp/http/issues/445, tetapi anda masih boleh menetapkan pengepala kuki HTTP secara manual.
Perlu juga dinyatakan bahawa menggunakan ReactPHP dengan Guzzle tidak akan berfungsi kerana Guzzle menyekat gelung acara ReactPHP. Ini bermakna anda boleh menghantar berbilang permintaan, tetapi tidak boleh melakukan apa-apa lagi secara tak segerak.