这是我的代码:
<?php
$url="http://www.sina.com.cn";
$handle = @fopen($url, "r");
$len=get_headers($url,true);
print_r($len);
echo $len['Content-Length']."\n";
if ($handle) {
while (($buffer = fgets($handle,1024)) !== false) {
echo ftell($handle)."\n";
fseek($handle,200000,SEEK_CUR);
echo ftell($handle)."\n";
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
?>
结果如下:
Array
(
[0] => HTTP/1.1 200 OK
[Content-Type] => text/html
[Vary] => Accept-Encoding
[X-Powered-By] => shci_v1.03
[Server] => nginx
[Date] => Thu, 24 Dec 2015 04:03:39 GMT
[Last-Modified] => Thu, 24 Dec 2015 04:01:28 GMT
[Expires] => Thu, 24 Dec 2015 04:04:39 GMT
[Cache-Control] => max-age=60
[Age] => 32
[Content-Length] => 518264
[X-Cache] => HIT from xidan33-99.sina.com.cn
[Connection] => close
)
518264
16
200016
200058
400058
400065
518264
Content-Length可能与我的--518264不同,执行代码时它会动态更改,对于讨论而言,它无关紧要。为什么结果不是以下?
518264
1024
201024
202048
402048
403072
请说明文件指针对fgets和ftell和fseek函数的作用。
根据fgets()的PHP文档,
当读取了长度-1个字节,换行符(包含在返回值中)或EOF(以先到者为准)时,读取结束。
这里的length是您在调用时使用的第二个参数fgets()
,即1024。因此,fgets()
当发生以下任何一种情况时,您对的呼叫将结束阅读:
因此,在您的情况下,当fgets()
读取第一行时,它将在读取16个字节后到达第一行的末尾,这将成为文件指针在ftell()
旁边被调用时的位置。ftell() 返回文件指针在文件中的当前位置。
当您在下一行fgets()
再次调用时(while
循环迭代),文件中的起始位置现在为16(尤其不是1024),并且您最多可以读取(16 + 1024)1040字节(不超过2048)。同样,如果您的下一行只有42个字节,则fgets()
它将以58个字节结束读取,这将是ftell()
再次被调用时文件指针的位置。
再次,您fgets()
将从58个字节开始,读取最多(58 + 1024 =)1082个字节。它将继续这种方式。
效果fseek()
fseek()
用于将文件指针移动到$ offset(第二个参数)设置的文件中的特定位置。根据fseek()的PHP文档,第三个参数值可以是-
SEEK_SET
-设置位置等于偏移字节。
SEEK_CUR
-将位置设置为当前位置加上偏移量。
SEEK_END
-将位置设置为文件末尾加上偏移量。
因此,通过fseek($handle,200000,SEEK_CUR);
将文件指针设置为200000 +当前位置。例如,它将在16时移动到200016。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句