php第一个fseek在流然后fread?

时间:2016-09-22 20:52:48

标签: php position fread fseek

我正在尝试一些php文件/流功能。而且我遇到了麻烦。

此数据发送到php脚本:

    baz=bomb&foo=bar&baz=bomb&foo=bar&foo=bar&baz=bomb

该脚本运行此代码:

    <php
    $fp = fopen("php://input", "rb");
    fseek($fp, 3, SEEK_SET);
    echo "<br>ftell: ".ftell($fp)."<br>";
    echo "<br>fread(resource, 4): ".fread($fp, 4)."<br>";
    fclose($fp);

输出显示:

    ftell: 3
    fread(resource, 4): baz=

我所期待的是:

    =bom

为什么fread首先将指针设置为流的开头然后读取?寻求通过流而不能从某个位置读取的重点是什么?

我正在使用的php版本是: 在Windows机器上的7.0.8。

1 个答案:

答案 0 :(得分:1)

这是问题的答案,我希望很多人能从中获益:

使用fseek时,ftell似乎会告诉你指针在流中的位置。但事实并非如此。流中的指针不能被fseek函数移动得足够奇怪。正如Starson Hochschild所指出的那样,因为底层流没有实现搜索处理程序。

所以替代方案可能是阅读$ _POST。但是大内容呢?

有一个名为php:// temp的流。你放入它的前两个MB将进入你的电脑的内存。更多数据将进入您电脑上的临时文件。

所以你可以使用这样的东西:

    $tempStream = fopen("php://input", "rb");
    $stream = fopen("php://temp", "w+b");
    $size = 0;
    while (!feof($in)) $size += fwrite($stream,fread($tempStream,8192)); //Copy the php://input stream to the seekable php://temp stream. $size will contain the size in bytes of the $stream resource.
    fclose($tempStream);

    //Do your next fread's, fseek's, ftell's etc here on the $stream resource.

    fclose($stream);