SseController.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller;
  4. use Hyperf\HttpServer\Contract\RequestInterface;
  5. use Hyperf\HttpServer\Contract\ResponseInterface;
  6. use Psr\Http\Message\ServerRequestInterface;
  7. class SseController extends AbstractController
  8. {
  9. public function stream(RequestInterface $request, ResponseInterface $response)
  10. {
  11. var_dump("===");
  12. // 设置响应头
  13. $response = $response
  14. ->withAddedHeader('Access-Control-Allow-Origin', '*') // 确保允许跨域
  15. ->withAddedHeader('Access-Control-Allow-Methods', 'GET')
  16. ->withAddedHeader('Content-Type', 'text/event-stream')
  17. ->withAddedHeader('Cache-Control', 'no-cache')
  18. ->withAddedHeader('Connection', 'keep-alive');
  19. var_dump("bbbbbbb");
  20. $origin = $request->getHeaderLine('Origin');
  21. if ($this->isAllowedOrigin($origin)) {
  22. var_dump("nicde");
  23. $response = $response->withAddedHeader('Access-Control-Allow-Origin', $origin);
  24. $response = $response->withAddedHeader('Access-Control-Allow-Credentials', 'true');
  25. }
  26. // 开始流式传输
  27. $this->container->get(\Swoole\Http\Response::class)->status(200);
  28. for ($i = 0; $i < 10; $i++) { // 模拟发送10个事件
  29. $data = json_encode(['message' => "Event $i"]);
  30. var_dump("测试数据");
  31. $response->write("data: $data\n\n");
  32. usleep(1000000); // 暂停1秒
  33. }
  34. return $response;
  35. }
  36. protected function isAllowedOrigin(string $origin): bool
  37. {
  38. // 实现你的逻辑来判断是否允许该来源
  39. // 可以是硬编码的值,也可以是从数据库或其他地方获取的动态值
  40. $allowedOrigins = ['http://localhost:3000', 'http://192.168.1.100:3000']; // 替换为你的前端地址
  41. return in_array($origin, $allowedOrigins, true);
  42. }
  43. }