it_*_*ure 18 php fseek ftell fgets
这是我的代码:
<?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);
}
?>
Run Code Online (Sandbox Code Playgroud)
结果如下:
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
Run Code Online (Sandbox Code Playgroud)
Content-Length可能与我的不同 - 518264,它会在您执行代码时动态更改,无论讨论如何都是如此.为什么结果不是以下?
518264
1024
201024
202048
402048
403072
Run Code Online (Sandbox Code Playgroud)
请解释文件指针对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文档,第3个参数值可以是 -
SEEK_SET- 设置位置等于偏移字节.
SEEK_CUR- 将位置设置为当前位置加偏移量.
SEEK_END- 将位置设置为文件结束加偏移量.
因此,fseek($handle,200000,SEEK_CUR);您将文件指针设置为200000 +当前位置.例如,它将在16岁时移至200016.
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |