Каждый дескриптор указывает на независимый поток. Пример:
$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
. Отсюда следует, что они будут работать как обычные независимые потоки.
Кроме того, на этих страницах есть некоторые комментарии, которые дополнительно подразумевают независимость этих потоков.