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)