gpt4 book ai didi

php - Connection keep-alive 时获取文件内容

转载 作者:可可西里 更新时间:2023-11-01 12:57:49 24 4
gpt4 key购买 nike

我需要获取远程文件的内容,但需要发送一些 header ,其中之一是“Connection: keep-alive” header ...所以我通过简单调用 file_get_contents() 进行了尝试,像这样:

<?php

$sfheaders="Cache-Control:max-age=0
Connection:keep-alive";

$opts = array(
'http' => array(
'method' => "GET",
'header' => $sfheaders
)
);

$context = stream_context_create($opts);

$url="http://somedomain.com/to.php";
$file = file_get_contents($url, false, $context);
?>

...代码有效,但 file_get_contents 需要 15 秒才能获取数据!看起来 file_get_contents() 在连接关闭后完成,但我希望它在数据传输后完成。如果我删除 keep-alive header 会更快,但这次我需要在连接保持事件状态时获取数据。我想这对 file_get_contents 是不可能的,所以......

有没有办法用 cURL 或其他东西做到这一点?

编辑:让我更准确地说,必须将“Connection:keep-alive” header 发送到我尝试访问的特定服务器,因为它会检查该 header ,如果不发送,则没有数据发给我!明白了吗?

最佳答案

保持连接

通常,如果连接未设置为keep-alive,一旦 PHP 终止当前脚本,剩余的输出缓冲区将转发到 Web 服务器,后者又将数据转发到客户端。然后网络服务器关闭到客户端(浏览器)的连接。

如果你要求

Connection: keep-alive

服务器就是这样做的:它保持连接打开,即使回复已经完全完成。因此,上述行为就可以了。 此外,例如feof() 不会返回 FALSE - 因为最终可能会收到更多数据。

请注意,您可以在当前运行的 PHP 脚本中重新使用保持连接。但是一旦您的 PHP 脚本完成,保持事件连接将断开。

因此,您不能重用使用下一个 PHP 脚本实例的保持连接。

案例 1 - 请求前已知的数据量

如果您事先知道数据量,您可能只读取该数据量$expectedAmountOfDataInBytes,然后关闭连接:

$expectedAmountOfDataInBytes = 2023;

$handle = fopen( "http://www.stackoverflow.com/", "r" );

if ( ! is_resource( $handle )) {
echo 'sorry';
exit;
}

while( ( ! feof( $handle ) )
&& ( 0 < $expectedAmountOfDataInBytes-- )
) {

$contents .= fread( $handle, 1 );

}

fclose($handle);

案例 2 - 请求前未知的数据量

如果您事先不知道数据量,则需要提交 HTTP要求

GET /infotext.html HTTP/1.1
Host: www.example.net

然后像这样解析一个答案:

HTTP/1.1 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: 4
Content-Language: de (nach RFC 3282 sowie RFC 1766)
Connection: close
Content-Type: text/html

ABCD

PHP Manuals 中查找基于 sockets I/O 的简单 HTTP 客户端.

关于php - Connection keep-alive 时获取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com