2016-09-22 88 views
1

我正在試驗一些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()'使用不同的偏移時會發生什麼? –

回答

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); 
相關問題