Problema
Eu construí o PHP8.4 manualmente no Ubuntu 14.04, pois o sistema operacional não tem suporte e nenhum pacote ppa disponível. Testei se a phpinfo()
página da web mostrou informações corretas ao adicionar session_start()
no início do script, ocorreu um erro fatal:
Fatal error: Uncaught Random\RandomException: Cannot open /dev/urandom: No such file or directory in /xxx.php
Então eu executo o script head /dev/urandom
no terminal, posso obter uma saída aleatória, portanto o arquivo existe. Ao digitar ls -l /dev/urandom
a permissão, crw-rw-rw-
ela deve ser acessível por outros usuários, eu acho.
Ambiente
- Hardware do servidor:RK3288 armv7l cortex-A17 x4 núcleos com 2 GB de RAM DDR3
- Sistema operacional:Ubuntu 14.04 lts com kernel versão 3.10.0
- Servidor web:Apache 2.4.7 com php-fpm fastcgi
- Versão PHP:8.4.0-desenvolvimento
- Configure o comando ao construir o php:
'./configure' '--prefix=/usr/local/php/' '--enable-debug' \
'--enable-fpm' '--with-config-file-path=/usr/local/php/etc/' \
'--enable-json' '--enable-mbregex' '--enable-mbregex-backtrack' \
'--disable-opcache' '--with-curl' '--with-freetype' \
'--enable-gd' '--with-jpeg' '--with-gettext' '--with-kerberos' \
'--with-libdir=lib64' '--with-libxml' '--with-mysqli' \
'--with-openssl' '--with-pdo-mysql' '--with-pdo-sqlite' \
'--with-pear' '--with-mhash' '--with-ldap-sasl' '--with-xsl' \
'--with-zlib' '--with-zip' '-with-bz2' '--with-iconv' \
'--enable-pdo' '--enable-ftp' '--enable-bcmath' '--enable-mbstring' \
'--disable-pcntl' '--enable-shmop' '--enable-soap' \
'--enable-sockets' '--enable-xml' '--enable-sysvsem' '--enable-cli' \
'--enable-intl' '--enable-calendar' '--enable-static' \
'--enable-mysqlnd' 'OPENSSL_CFLAGS=-I/usr/local/openssl/include' \
'OPENSSL_LIBS=-L/usr/local/openssl/lib -lssl -lcrypto' \
'JPEG_CFLAGS=-I/usr/lib/arm-linux-gnueabihf/' \
'JPEG_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -ljpeg' \
'FREETYPE2_CFLAGS=-I/usr/include/freetype2' \
'FREETYPE2_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -lfreetype' \
'ICU_CFLAGS=-I/usr/include/arm-linux-gnueabihf/' \
'ICU_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -licui18n \
-licuuc -licudata -licuio -licule -liculx -licutu' \
'ONIG_CFLAGS=-I/usr/include' 'ONIG_LIBS=-L/usr/lib -lonig' \
'LIBZIP_CFLAGS=-I/usr/local/include/' \
'LIBZIP_LIBS=-L/usr/local/lib/ -lzip'
Todos os erros gerados pelo configure foram resolvidos antes de compilar o PHP, compilando manualmente todas as dependências ausentes.
Não sei por onde começar a verificar, por favor, dê algumas dicas como qual arquivo de configuração pode não estar configurado corretamente, quais informações do sistema vale a pena verificar, como fazer com que ele imprima mais informações de diagnóstico sobre /dev/urandom etc. informações necessárias para resolver o problema, comente e melhorarei a descrição da minha pergunta.
Solução
Obrigado por @symcbean, ele mencionou:
Seu código PHP está executando chroot, ou dentro de um perfil apparmor ou em um namespace do sistema de arquivos systemd.
Ao verificar o arquivo conf do php-fpm, descobri chroot
que estava configurado. Ao desabilitar o parâmetro, os scripts php de acesso com o navegador da web mostraram No input file specified
.
Então verifiquei minha configuração do apache, tentei adicionar
ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=..."
mas minha versão instalada do Apache parece não reconhecer 'ProxyFCGISetEnvIf' com o erro 'Comando inválido' gerado.
Finalmente eu substituí
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/
com
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1
agora todos os problemas estão resolvidos.
Em um mundo, caso ocorra algum No such file or directory
erro no PHP, vale verificar se você configurou chroot
para PHP.
Responder1
Eu construí o PHP8.4 manualmente no Ubuntu 14.04 porque o sistema operacional está sem suporte
Esta é uma enorme bandeira vermelha. Manter um sistema operacional sem suporte em execução requer muita habilidade e tempo. OapenasO momento em que isso é remotamente justificável é continuar executando software de missão crítica que não pode ser atualizado. Alterar a pilha de software em um sistema operacional sem suporte é uma receita para o desastre, mesmo para um especialista, e refuta o predicado de justificativa.
Então eu executo o script head /dev/urandom no terminal
Isso me diz que você não é um especialista.
O primeiro lugar a procurar ao diagnosticar um erro são os arquivos de log. E não apenas os logs do seu servidor web.
/dev/urandom produz uma saída binária que pode atrapalhar as configurações do seu terminal - é mais seguro executar head /dev/urandom | cat -v
.
Você verificou as permissões - e como elas são x666, a propriedade não importa (a menos que você tenha permissões estranhas em/dev). Mas o próximo passo para depurar o problema seria tentar acessar o arquivo diretamente de um script PHP. Seu código PHP está executando chroot, ou dentro de um perfil apparmor ou em um namespace do sistema de arquivos systemd.
Atualize a plataforma.