应用场景
1. 用户获取接口. 获取接口了以后还需要写入日志. 但是写入日志后面这段用户可以不用知道。可以先把数据响应给用户
2. 我们提供一个通知接口. 我们在收到接口了以后直接可以告诉用户收到了。而不是处理一大堆逻辑成功了再通知用户我们收到了
php实现
<?php
function delayOutput($output) {
$is_fastcgi = function_exists("fastcgi_finish_request");
if (!$is_fastcgi) {
ob_end_clean();
ob_start();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
}
echo $output;
if(!$is_fastcgi){
$size = ob_get_length();
header("Content-Length: ". $size . "\r\n");
ob_end_flush();
flush();
header("Test-Header: fastcgi_finish_request\r\n");
ignore_user_abort(true);
}else{
fastcgi_finish_request();
}
}
delayOutput('hello world');
sleep(5);
file_put_contents('delay.txt', 'delay');
在Drupal接口中如何用这个东西
namespace Drupal\mymodule\Plugin\rest\resource;
use Drupal\rest\Plugin\ResourceBase;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* Represents TestApi records as resources.
*
* @RestResource (
* id = "rest_output_testapi",
* label = @Translation("TestApi"),
* uri_paths = {
* "canonical" = "/api/testapi"
* }
* )
*
* For entities, it is recommended to use REST resource plugin provided by
* Drupal core.
* @see \Drupal\rest\Plugin\rest\resource\EntityResource
*/
final class TestapiResource extends ResourceBase {
/**
* Responds to GET requests.
*/
public function get() {
$data = [
'userid' => 1,
'username' => 'xiukunabcd'
];
$response = new JsonResponse($data);
// 因为这里的send已经实现了fastcgi_finish_request. 所以不需要过多的逻辑
$response->send();
//先输出内容. 后面用于写入日志啊这种不需要响应给用户的处理
sleep(20);
file_put_contents('test.txt', 'test');
}
}