2025-04-14

应用场景

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');
    
  }
}

 

标签: PHP