Connection保持时获取文件内容

我需要获取远程文件的内容,但是发送一些头文件,其中一个头文件是“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或其他东西来做到这一点?

编辑:让我更加准确,“连接:保持活动”头必须发送到我试图访问的特定服务器,因为它检查该头,如果它没有发送,那么没有数据发送到我! 得到它了?


保持连接

通常情况下,如果连接未设置为keep-alive ,则一旦PHP终止当前脚本,剩余的输出缓冲区将被转发到Web服务器,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手册中查找基于套接字I / O的简单HTTP客户端。

链接地址: http://www.djcxy.com/p/15297.html

上一篇: Get file contents when Connection is keep

下一篇: How to set .Net 4.0 as the default framework in MonoDevelop (Unity 3D)