使用 Php Guzzle 的异步请求无法异步工作

Async requests with Php Guzzle are not working async

我创建了下面的代码来发出异步请求以从 API.

中获取数据
<?php
require 'vendor/autoload.php';
$url = "https://pucminas.instructure.com/api/v1/";

$client = new GuzzleHttp\Client(['base_uri' => $url]);

$headers = [
    'Authorization' => "Bearer 11111~dsgffdhstggfjsdhf",
    'Accept'        => 'application/json',    
];

$course_id = "2242";
set_time_limit(300);

$promise = $client->getAsync( 'courses/'.$course_id.'/students/submissions?student_ids[]=all&grouped=true&post_to_sis=false&enrollment_state=active&include[]=user&include[]=assignment&include[]=total_scores&per_page=1000', ['connect_timeout' => 600, 'headers' => $headers]);

$promise
->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode();
});

?>
<h2>Reports</h2>

我想当我加载页面时,它会在页面中显示文本 "Reports",并且在从 API 获取内容后(至少需要 60 秒),它会显示消息 "Got a response",但它不会那样工作。

首先,页面从 API 加载内容,然后才同时显示文本 "Reports" 和 "Got a message"。

我希望在加载页面时立即显示文本 "Reports",而仅当从 API.

加载数据时才显示文本 "Got a response"

我该怎么做?

您只能从 PHP 脚本发送单个响应,即您的浏览器请求一个页面,PHP 服务器构建该页面并将其发回。由于 HTTP 是无状态的,因此 PHP 服务器无法 'push' 将页面更新到您的浏览器。

要实现您想要的功能,您需要编写一些 javascript,它将调用 PHP 脚本来启动 guzzle 异步承诺。当承诺完成时,此承诺会将结果写入文件(或数据库)。

然后您需要第二个 javascript 函数来连续检查第二个 php 脚本。第二个 PHP 脚本将检查文件的内容(或数据库条目等)和 return 结果。

你最好看看 Axios 之类的东西,然后完全丢掉 PHP

https://www.npmjs.com/package/axios