当Connection保持活动状态时获取文件内容

时间:2013-08-12 12:48:44

标签: php

我需要获取远程文件的内容,但是发送了一些标题,其中一个是“Connection:keep-alive”标题...所以我尝试了一下简单的调用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标头会更快但这次我需要在连接保持活动状态时获取数据。我想这对于file_get_contents是不可能的,所以......

有没有办法用cURL或其他东西来做?

编辑:让我更准确一点,“连接:保持活动”标题必须发送到我试图访问的特定服务器,因为它检查该标头,如果它不发送,则没有数据发给我!知道了吗?

1 个答案:

答案 0 :(得分:3)

保持连接

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

如果您要求

Connection: keep-alive

服务器执行此操作:保持连接打开,即使回复已完全完成。因此,提到的行为就好了。 此外,例如feof()不会返回FALSE - 因为最终可能会有更多数据到达。

请注意,您可以在当前运行的PHP脚本中重复使用keep-alive连接。但是一旦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客户端。