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?
/tmp/ydlw/pid
existe em/tmp
? Caso contrário, esse é o motivo da mensagem de erro.Respostas:
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
PrivateTmp
opção detrue
no 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
/tmp
pode 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 definaPrivateTmp
comofalse
.Você também pode definir dois ou mais serviços para compartilhar o mesmo / tmp usando
JoinsNamespaceOf
.Para mais informações>
man systemd.exec
fonte