php第一次fseek在流然后fread?

问题描述:

我正在试验一些php文件/流功能。而且我遇到了fread的麻烦。php第一次fseek在流然后fread?

该数据发送到一个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版本是: 7.0.8在Windows机器上。

+0

只是想知道为什么不'$ _POST'或'parse_str()'? – AbraCadaver

+0

我正在准备自己实现php-fig psr-7 streaminterface。这是学习构建现代php框架的一部分。 – ITGuy1990

+0

你确定无论什么流数据到PHP是不是在开始添加数据?当你对'fseek()'使用不同的偏移时会发生什么? –

这是这个问题的答案,我希望很多人会从这个利润:

当使用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);