php函数中ftell的输出

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函数的操作.

小智 10

fgets的长度参数表示最大长度.该PHP文件中指出:

读取长度 - 读取1个字节,或换行(包含在返回值中)或EOF(以先到者为准)时读取结束.如果没有指定长度,它将继续从流中读取,直到它到达行尾.

在你的情况下,第一行包含<!DOCTYPE html>,它解释了由16给出的结果ftell.


Tᴀʀ*_*ᴏᴏᴅ 7

根据fgets()的PHP文档,

读取长度 - 读取1个字节,或换行(包含在返回值中)或EOF(以先到者为准)时读取结束.

这里length是调用时使用的第二个参数fgets(),即1024.因此,fgets()当发生以下任何情况时,您的呼叫将结束阅读:

  1. 它从同一行读取了1023个字节.
  2. 它已达到当前行的末尾.
  3. 它已经到了文件的末尾.

因此,在您的情况下,当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.