楠哥给了个程序,不知道为什么用fsocket链接,然后用fread或fgets读数据,每一步都是跟手册一致,但是feof总是没有办法正确判断已经到文件尾部,必须要等到超时才推出……所以速度超级慢……
构造头部部分及链接部分手册有很多例子,不再赘述……
解决办法如下:
$sock = fsockopen($host_url,80,$errno,$errstr,5);
stream_set_timeout($sock, 1);//设置流超时,如果对方服务器缓慢的话你可以设的值大一些~~
$temp='';
while (($temp=fread($sock,8096))) {//每次读取8096字节,如果对方的网速偏慢的话也适当减小
$body.=$temp;
}
echo $body;
ok,很简单吧~~~
设置流超时为1秒,然后每次判断fread获取的是否为空,若为空的话则说明已经读取结束,若不设置流超时,默认可能要等待60秒吧……
终于知道为什么之前没办法判断结束了……
在构造头部的时候没有加入Connection: Closernrn这一句做结束,所以feof就总是无法判断结束,貌似是持久链接的问题,具体rfc描述如下:
一些客户机和服务器可能希望和一些对以前实现HTTP/1.0持续连接的客户机和服务器兼容。单个持续连接不是缺省的行为的时候,它就被明确的越过。HTTP/1.0持续连接的实验性实现是有缺陷的,在HTTP/1.1中设计新的简单的来纠正这些问题。问题是一些现有的1.0客户机可能发送Keep-Alive给一个不明白这种连接的代理服务器,那么就错误地将它传向下一个接收服务器,它将建立一个Keep-Alive连接并导致一个挂着的HTTP/1.0代理等待关闭的应答。结果是HTTP/1.0客户机必须禁止使用Keep-Alive和代理交谈。 然而,和代理交谈是持续连接最重要的用处,所以禁止很明显是无法接受的。因此,我们需要一些其它的机制来表明渴望持续连接,甚至当和一个忽略Connection的老代理交谈这样使用也是安全的。对HTTP/1. 0消息持续连接是缺省的;我们引入一个新的关键字(Connection:close)来申明非持续。
最新测试发现只要传递Connection: 任意字符甚至可以为空rnrn都feof都能正常获取结束标志……看来是头部构造的不完整……
不知道,我也不知道,哪位大仙知道为啥跟我说一下吧~~~~
发个正确的函数(不是我写~~~)
function get_content($url){
$urlparts = parse_url($url);
$script_name = $urlparts['path'];
$host_url = $urlparts['host'];
$fp = fsockopen($host_url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
n";
} else {
$out = "GET / HTTP/1.1rn";
$out .= "Host: www.ea3w.comrn";
//$out .= "添加头部的其他部分";
$out .= "Connection: Closernrn";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 1028);
}
fclose($fp);
}
}
分享到:
相关推荐
php fread函数用于读取文件(可安全用于二进制文件),其语法是fread(file,length),参数file必需,指规定要读取打开文件,length 必需,指规定要读取的最大字节数。 php fread函数怎么用? 定义和用法 fread() 函数...
C语言文件读写函数,fread,fwrite函数的使用。 简单实例,仅供参考。
c++ 读文件 fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
C语言fread函数和fwrite函数的用法及其实例
为什么fwrite写文件后,用fread读出来文件长度是0,即fread读不出数据
下面先简单说一下本文的主要内容: 一、 PHP抓取页面的主要方法: 1. file()函数 2. file_get_contents()函数 3. fopen()->fread()->fclose()模式 4.curl方式 5. fsockopen()函数 ...
资源中包含了5个文件,其中两个为read函数和fread函数c语言实例的源码,以及编译后的两个代码的可执行文件,还包含了测试用的文件。
fread,fwrite的参数2,3顺序 为什么fread读出来的文件大小不对
php fread函数用于从文件中读取一定长度的字符,本文章向大家介绍fread读取文件的实例以及使用该函数读取文件需要注意的几个地方,需要的朋友可以参考一下。
/* 从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去 */ #include #define SIZE 4 struct student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; ...……
为什么fread(),fwrite()的返回值总是为0,但是文件读写正常 初学C语言文件操作的新人,总会犯这个错误,明明文件读 写成功 ,但是返回值总是为0,而不是读写成功的字节数,原因是因为...
Matlab 文件操作及读txt文件(fopen、fseek、fread、fclose) Matlab 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB 提供了一系列低层输入输出函数,专门用于文件操作。 ...
fread函数的用法
fread_fwrite.cpp
1、本文详细描述了c语言fread函数的用法。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。
C语言fread函数和fwrite函数的用法及其实例[收集].pdf
采用Matlab下fread函数读取高光谱BIL文件数据
在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接输出,往往需要对内容...