Что происходит, когда php: // temp открывается более одного раза? - PullRequest
7 голосов
/ 11 октября 2011

Если файл php://temp (или php://memory) открывается более одного раза, будут ли маркеры указывать на один и тот же файл? Или каждая ручка будет уникальной?

Я не смог найти ответ в документации по php, поэтому я собираюсь написать тестовый скрипт, чтобы узнать . Я подумал, что стоит спросить здесь, чтобы кто-то еще мог легко найти ответ.

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

Каждый дескриптор указывает на независимый поток. Пример:

$a = fopen('php://memory', 'w+');
$b = fopen('php://memory', 'w+');

fwrite($a, 'foo');
fwrite($b, 'bar');

rewind($a);
rewind($b);

$a_text = stream_get_contents($a);  //=> "foo"
$b_text = stream_get_contents($b);  //=> "bar"

fclose($a);
fclose($b);

Это не явно документировано где-либо, но это подразумевается в документации для потоков и упаковщиков.

Из официальной документации php о потоках в целом ясно, что для стандартного случая потоков каждый дескриптор файла связан со своим собственным независимым потоком.

А в документации об оболочках потоков ввода-вывода перечислены возможные оболочки, отмечающие исключения по мере их возникновения. Для первых трех перечислено исключение (stdin, stdout, stderr):

php: // stdin, php: // stdout и php: // stderr позволяют прямой доступ к соответствующий входной или выходной поток процесса PHP. Поток ссылается на дубликат файлового дескриптора, поэтому, если вы откроете php: // stdin и затем закройте его, вы закроете только свою копию дескриптора поток, на который ссылается STDIN, не затрагивается.

Но такого исключения нет для php://temp или php://memory. Отсюда следует, что они будут работать как обычные независимые потоки.

Кроме того, на этих страницах есть некоторые комментарии, которые дополнительно подразумевают независимость этих потоков.

1 голос
/ 11 октября 2011

Мой тестовый код:

$f1 = fopen('php://temp', 'rw');
$f2 = fopen('php://temp', 'rw');

fputs($f1, "File One");
fputs($f2, "File Two");

rewind($f1);
echo "First line from F1: ";
echo fgets($f1) . PHP_EOL;
echo "Second line from F1: ";
echo fgets($f1) . PHP_EOL;
fclose($f1);

rewind($f2);
echo "First line from F2: ";
echo fgets($f2) . PHP_EOL;
echo "Second line from F2: ";
echo fgets($f2) . PHP_EOL;
fclose($f2);

И результаты:

First line from F1: File One
Second line from F1: 
First line from F2: File Two
Second line from F2: 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...