O script php não pode acessar a pasta / tmp

16

Não tenho open_basedir, o php pode acessar / etc / usr / proc / home etc ... mas não / tmp.

O tmpfs é montado em / tmp (/ tipo tmpfs (rw)) Esse também é o motivo pelo qual desejo usar a pasta / tmp.

Meus arquivos são de propriedade de http (usuário para nginx e php) e legíveis por todos.

sudo -u http cat /tmp/file está funcionando, mas qualquer coisa dentro de um script php não funciona (como file_exist () ou file ()).

edit: o erro é exibido no log:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267

edit2: testei o problema de outra maneira. Eu fiz

touch("/tmp/boo");
file_exist("/tmp/boo");

e file_exist retornam true para que o arquivo seja criado. Então eu assisti dentro / tmp e nenhum arquivo "boo" pode ser encontrado lá. Isso é o que eu estava com medo, o php não "vê" o ponto de montagem. Por que isso e como posso corrigir isso?

eephyne
fonte
Qual é o erro retornado por essas funções PHP? O que mostra o log de erros do PHP?
Tero Kilkanen
Eu adicionei o log de erros
eephyne
Este arquivo /tmp/ydlw/pidexiste em /tmp? Caso contrário, esse é o motivo da mensagem de erro.
Tero Kilkanen
-rw-r - r-- 1 http http 343 23 de julho. 10:12 / tmp / ydlw / pid
eephyne
Qual é a sua distribuição Linux e versão PHP e de onde você adquiriu o PHP?
Michael Hampton

Respostas:

31

Eu descobri por que, bem, alguém me deu a dica global.

Não é culpa do php ou tmpfs. O culpado era o systemd e seu sistema de segurança PrivateTmp.

Para quem entra no mesmo problema que eu, o php de serviço (e provavelmente alguns outros) tem a PrivateTmpopção de trueno script systemd ( /usr/lib/systemd/system).

Nesse caso, um novo /tmpé criado e isolado do outro. Todos os dados salvos no interior são excluídos quando o serviço é interrompido.

É uma medida de segurança, pois /tmppode conter muitas informações confidenciais e o script php nem sempre é seguro.

Para desativar isso, simplesmente copie o script dentro /etc/systemd/system(para evitar a substituição de suas alterações após uma atualização) e defina PrivateTmpcomo false.

Você também pode definir dois ou mais serviços para compartilhar o mesmo / tmp usando JoinsNamespaceOf.

Para mais informações> man systemd.exec

eephyne
fonte
4
Obrigado por isso! Passei o dia inteiro tentando descobrir isso. Meu cérebro está derretendo pelo nariz por tentar tanto descobrir isso.
Marcelo