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 .