O problema é que você quer que o php leia a entrada de um descritor de arquivo, mas você o força a ler como um arquivo normal.
Primeiro, tente isto:
$ echo <(ls)
/dev/fd/63
você pode processar ls output lendo /dev/fd/63 . A substituição do processo retornará o file descriptor , que é usado por outro comando para ler sua saída.
No seu caso, você usa $_SERVER["argv"][1] , significando que o php interpretará assim:
file_get_contents(/dev/fd/63)
A partir do manual do php, você pode ver o protótipo de file_get_contents function:
string file_get_contents ( string $filename [, bool $use_include_path =
false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
Ops, php irá considerar /dev/fd/63 como arquivo normal aqui, mas é realmente um file descriptor .
Para acessar o descritor de arquivo, você deve usar php://fd , php://fd/63 acessará o conteúdo do descritor de arquivo 63:
$ php -r 'var_dump(file_get_contents("php://".substr($_SERVER["argv"][1],-5)));' -- <(echo test.txt)
string(9) "test.txt
"
Você pode ver, agora o php pode processar o conteúdo em /dev/fd/63 . Mas o nosso propósito é ler o conteúdo do arquivo, que é fornecido via substituição de processo (no meu exemplo, é test.txt ). Eu não sei muito sobre php, então eu adiciono outro file_get_contents :
$ php -r 'var_dump(file_get_contents(file_get_contents("php://".substr($_SERVER["argv"][1],-5))));' -- <(echo -n test.txt)
string(13) "Hello world!
"
Eu uso echo -n para remover a nova linha da saída de eco, caso contrário, o php verá a saída "test.txt \ n".
Nota
Para mais informações sobre como acessar o descritor de arquivos em php, você pode ver aqui .