18

これが私のコードです:

<?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 関数でのファイル ポインタの動作について説明してください。

4

4 に答える 4

10

fgets の length パラメータは、最大長を示します。PHPのドキュメントには次のように記載されています。

length - 1 バイトが読み取られるか、改行 (戻り値に含まれる)、または EOF (いずれか早い方) が読み取られると、読み取りは終了します。長さが指定されていない場合、行の終わりに達するまでストリームから読み取り続けます。

あなたの場合、最初の行には が含まれており<!DOCTYPE html>、 によって与えられた 16 の結果を説明していftellます。

于 2015-12-24T03:28:50.707 に答える
3

PHP 関数stream_get_meta_data()を使用して、開いたストリームがシーク可能かどうかを確認します。

$url="http://www.sina.com.cn";
$handle = @fopen($url, "r");

$meta_data = stream_get_meta_data($handle);
var_dump($meta_data['seekable']);

// It prints `bool(false)`

ストリームはシークできません。これは、関数fseek()が予期しない (そしておそらく一貫性のない) 動作をftell()することを意味します。rewind()

于 2015-12-31T08:44:16.503 に答える