ftell 在 php 函数中的输出

2022-08-30 22:14:20

这是我的代码:

<?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

内容长度可能与我的--518264不同,当您执行代码时,它将动态更改,无论讨论如何。为什么结果不是以下?

518264
1024
201024
202048
402048
403072

请解释文件指针在 fgets 和 ftell 和 fseek 函数上的操作。


答案 1

fgets 的长度参数指示最大长度。PHP 文档指出:

当读取长度 - 1 个字节、换行符(包含在返回值中)或 EOF(以先到者为准)时,读取结束。如果未指定长度,它将一直从流中读取,直到到达行的末尾。

在你的例子中,第一行包含 ,这解释了 由 给出的 16 的结果。<!DOCTYPE html>ftell


答案 2

根据 fgets() 的 PHP 文档,

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

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

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

因此,在您的情况下,当读取第一行时,它在读取16个字节后到达第一行的末尾,这将是文件指针在旁边调用时的位置。ftell() 返回文件指针在文件中的当前位置。fgets()ftell()

当您在下一行调用 again(由循环迭代)时,您在文件中的起始位置现在是 16(特别是不是 1024),您可以读取最多 (16 + 1024) 1040 字节(而不是 2048)。同样,如果下一行只有 42 个字节,则读取将以 58 个字节结束,这将是再次调用时文件指针的位置。fgets()whilefgets()ftell()

同样,您将从58字节开始,读取到(58 + 1024 =)1082字节。它将以这种方式继续下去。fgets()

fseek()
的效果用于将文件指针移动到文件中由$offset(第二个参数)设置的特定位置。根据 fseek() 的 PHP 文档,第 3 个参数值可以是 -fseek()

SEEK_SET - 将位置设置为等于偏移字节。
- 将位置设置为当前位置加上偏移量。
- 将位置设置为文件末尾加上偏移量。SEEK_CURSEEK_END

因此,您将文件指针设置为200000 +当前位置。例如,它将在 16 岁时移动到 200016。fseek($handle,200000,SEEK_CUR);


推荐