web-dev-qa-db-ja.com

php:// tempストリームの読み取り/書き込みに問題がある

PHP 5.3.2)の_php://temp_ストリームの読み取りと書き込みに問題があります

私は基本的に持っています:

_file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));
_

私が得る唯一の出力はstring(0) ""です

「テスト」を取り戻すべきではありませんか?

24
HorusKol

php://tempファイルパスではなく、使用時に常に新しいランダムな一時ファイルを作成する疑似プロトコルです。 /testは実際には完全に無視されています。唯一の余分な「議論」はphp://tempラッパーが受け入れるのは/maxmemory:n。開いている一時ストリームへのファイルハンドルを保持する必要があります。そうしないと、破棄されます。

$tmp = fopen('php://temp', 'r+');
fwrite($tmp, 'test');
rewind($tmp);
fpassthru($tmp);
fclose($tmp);

http://php.net/manual/en/wrappers.php.php#refsect1-wrappers.php-examples を参照してください。

22
deceze

毎回、fopenを使用してハンドラーを取得すると、php:// tempのコンテンツがフラッシュされます。 rewind()とstream_get_contents()を使用してコンテンツを取得します。または、APCやmemcacheなどの通常のキャッシャーを使用します:)

10
OZ_

これが遅いことは知っていますが、@ OZ_の答えに加えて、巻き戻した後、「fread」も機能することを発見しました。

$handle = fopen('php://temp', 'w+');

fwrite($handle, 'I am freaking awesome');

fread($handle); // returns '';

rewind($handle); // resets the position of pointer

fread($handle, fstat($handle)['size']); // I am freaking awesome
1
Mazino S Ukah

最後に、文書化された小さなメモを見つけました。それが理由を説明しています

PHP Manual の例5は、ほぼ同じコードサンプルを使用し、

php:// memoryとphp:// tempは再利用できません。つまり、ストリームが閉じられた後は、それらを再度参照する方法はありません。

_file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing
_

これは、file_put_contents()がストリームを内部的に閉じることを意味していると思います。これにより、file_get_contents()はストリーム内のデータを再度回復できなくなります。

1
Accountant م