php 如何发送头两次(100继续)

y0u0uwnf  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(124)

我试图利用HTTP 100 continuepreload头预加载一些内容到浏览器。
问题是我没有得到预期的结果。
下面是我的示例代码:

header('HTTP/1.1 100 Continue');
header('Link: </assets/style.css>; rel=preload');
header('Link: </assets/app.js>; rel=preload');
header(''); // send empty line to end 100 continue section
flush();

sleep (4); // Emulate some processing while browser is preloading assets

header('HTTP/1.1 200 OK');
echo "aaa\n";
echo "bbb\n";
flush();

exit;

但不是预期的响应:

HTTP/1.1 100 Continue
Link: </assets/style.css>; rel=preload
Link: </assets/app.js>; rel=preload

HTTP/1.1 200 OK

aaa
bbb

我得到了这个:

HTTP/1.1 200 OK
Date: Wed, 04 Oct 2023 15:21:24 GMT
Server: Apache/2.4.57 (Ubuntu)
Link: </assets/app.js>; rel=preload
Upgrade: h2,h2c
Connection: Upgrade
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

aaa
bbb

我是不是漏了什么?
除了flush(),我还需要其他东西来发送100 continue报头吗?
我当前的堆栈是apache + php-fpm
我使用的命令是curl -i https://localhost/
此外,我将使用这个与symfony项目,所以我需要确保重置headers_sent()后,100 continue部分,或symfony将只是不发送任何东西(发送功能开始与if(headers_sent()) return;),
但我不知道如何重置后,第一冲水。

oogrdqng

oogrdqng1#

预加载只是提前告诉浏览器一些资源需要被获取,这减少了页面的加载和可能的呈现时间。
通常你的浏览器在从html中读取css/js/images/etc时会加载它们,这些html会被逐行解析。如果你的html很大,你可以告诉浏览器在浏览器在HTML中看到它们之前加载一些资源(因为它已经在响应头中看到了它们)。
你不需要先刷新内容,在读取html之前总是先读取标题。只要浏览器看到一个预加载,它就开始拉取该文件,甚至在html被解析之前。
你唯一需要做的就是提前应用这些头文件。这就是为什么大多数框架不使用<?php echo "<html>" ?>,因为现在你不能再发送任何头了。Html响应是延迟的,这样你就知道一个页面需要哪些资源,这样你就可以添加那些响应头。
由于您标记了symfony,似乎Controller有一个名为addLink的方法,它可以为您完成此操作。
https://symfony.com/doc/current/web_link.html#resource-hints

相关问题