Em scripts PHP, se chamando include()
, require()
, fopen()
, ou seus derivados, tais como include_once
, require_once
ou até mesmo, move_uploaded_file()
, um muitas vezes é executado em um erro ou aviso:
Falha ao abrir o fluxo: esse arquivo ou diretório não existe.
Qual é um bom processo para encontrar rapidamente a causa raiz do problema?
php
require
fopen
include-path
Vic Seedoubleyew
fonte
fonte
Respostas:
Há muitas razões pelas quais se pode encontrar esse erro e, portanto, uma boa lista de verificação do que verificar primeiro ajuda consideravelmente.
Vamos considerar que estamos solucionando problemas da seguinte linha:
Lista de controle
1. Verifique o caminho do arquivo para erros de digitação
ou mova o que for chamado por
require*
ouinclude*
para sua própria variável, faça eco, copie-o e tente acessá-lo a partir de um terminal:Então, em um terminal:
2. Verifique se o caminho do arquivo está correto em relação às considerações sobre o caminho relativo versus o absoluto
/users/tony/htdocs
Melhores Práticas :
Para tornar seu script robusto, caso você mova as coisas, enquanto ainda gera um caminho absoluto em tempo de execução, você tem 2 opções:
require __DIR__ . "/relative/path/from/current/file"
. A__DIR__
constante mágica retorna o diretório do arquivo atual.defina uma
SITE_ROOT
constante você mesmo:config.php
em
config.php
, writeem todos os arquivos nos quais você deseja referenciar a pasta raiz do site, inclua
config.php
e use aSITE_ROOT
constante onde quiser:Essas 2 práticas também tornam seu aplicativo mais portátil porque não depende de configurações ini, como o caminho de inclusão.
3. Verifique seu caminho de inclusão
Outra maneira de incluir arquivos, nem de maneira relativamente nem puramente absoluta, é confiar no caminho de inclusão . Geralmente é o caso de bibliotecas ou estruturas, como a estrutura Zend.
Essa inclusão terá a seguinte aparência:
Nesse caso, você deve certificar-se de que a pasta onde está o "Zend" faça parte do caminho de inclusão.
Você pode verificar o caminho de inclusão com:
Você pode adicionar uma pasta a ela com:
4. Verifique se o seu servidor tem acesso a esse arquivo
Pode ser que, juntos, o usuário executando o processo do servidor (Apache ou PHP) simplesmente não tenha permissão para ler ou gravar nesse arquivo.
Para verificar em qual usuário o servidor está executando, você pode usar posix_getpwuid :
Para descobrir as permissões no arquivo, digite o seguinte comando no terminal:
e veja a notação simbólica de permissão
5. Verifique as configurações do PHP
Se nenhuma das opções acima funcionou, provavelmente o problema é que algumas configurações do PHP proíbem o acesso a esse arquivo.
Três configurações podem ser relevantes:
phpinfo()
ou usandoini_get("open_basedir")
ini_get("allow_url_include")
e definido comini_set("allow_url_include", "1")
Caixas de canto
Se nenhuma das opções acima estiver ativada para diagnosticar o problema, aqui estão algumas situações especiais que podem ocorrer:
1. A inclusão de biblioteca que se baseia no caminho de inclusão
Pode acontecer que você inclua uma biblioteca, por exemplo, a estrutura do Zend, usando um caminho relativo ou absoluto. Por exemplo :
Mas você ainda recebe o mesmo tipo de erro.
Isso pode acontecer porque o arquivo que você incluiu (com êxito), possui uma instrução de inclusão para outro arquivo, e a segunda instrução de inclusão assume que você adicionou o caminho dessa biblioteca ao caminho de inclusão.
Por exemplo, o arquivo de estrutura do Zend mencionado anteriormente pode ter o seguinte:
que não é uma inclusão por caminho relativo, nem por caminho absoluto. Supõe-se que o diretório da estrutura do Zend tenha sido adicionado ao caminho de inclusão.
Nesse caso, a única solução prática é adicionar o diretório ao seu caminho de inclusão.
2. SELinux
Se você estiver executando o Linux com segurança avançada, pode ser o motivo do problema, negando o acesso ao arquivo do servidor.
Para verificar se o SELinux está ativado no seu sistema, execute o
sestatus
comando em um terminal. Se o comando não existir, o SELinux não estará no seu sistema. Se existir, deve informar se é aplicado ou não.Para verificar se as políticas do SELinux são o motivo do problema, tente desativá-lo temporariamente. No entanto, tenha cuidado, pois isso desativará completamente a proteção. Não faça isso no seu servidor de produção.
Se você não tiver mais o problema com o SELinux desativado, essa é a causa raiz.
Para resolvê-lo , você precisará configurar o SELinux de acordo.
Os seguintes tipos de contexto serão necessários:
httpd_sys_content_t
para arquivos que você deseja que seu servidor possa lerhttpd_sys_rw_content_t
para arquivos nos quais você deseja acesso de leitura e gravaçãohttpd_log_t
para arquivos de loghttpd_cache_t
para o diretório de cachePor exemplo, para atribuir o
httpd_sys_content_t
tipo de contexto ao diretório raiz do site, execute:Se o seu arquivo estiver em um diretório inicial, você também precisará ativar o
httpd_enable_homedirs
booleano:De qualquer forma, pode haver vários motivos pelos quais o SELinux negaria o acesso a um arquivo, dependendo de suas políticas. Então, você precisará investigar isso. Aqui está um tutorial especificamente sobre a configuração do SELinux para um servidor da web.
3. Symfony
Se você estiver usando o Symfony e tiver esse erro ao fazer o upload para um servidor, pode ser que o cache do aplicativo não tenha sido redefinido, porque
app/cache
foi feito o upload ou esse cache não foi limpo.Você pode testar e corrigir isso executando o seguinte comando do console:
4. Caracteres não ACSII dentro do arquivo Zip
Aparentemente, esse erro pode ocorrer também ao chamar
zip->close()
quando alguns arquivos dentro do zip têm caracteres não ASCII em seus nomes de arquivo, como "é".Uma solução potencial é envolver o nome do arquivo
utf8_decode()
antes de criar o arquivo de destino.Créditos a Fran Cano por identificar e sugerir uma solução para esse problema
fonte
selinux
pode ser uma boa idéia aqui. você precisará pelo menoshttpd_sys_content_t
(diretórios e arquivos somente leitura usados pelo Apache) nos arquivos incluídos.chcon
é temporário e não sobreviverá arestorecon
uma reinicialização. pode ser necessário usarsemanage
para alterar o contexto do arquivo. Aqui está um bom tutorial simples para web sitePara adicionar à (realmente boa) resposta existente
Software de hospedagem compartilhada
open_basedir
é aquele que pode te surpreender porque pode ser especificado em uma configuração de servidor da web. Embora isso seja facilmente remediado se você executar seu próprio servidor dedicado, existem alguns pacotes de software de hospedagem compartilhados por aí (como Plesk, cPanel, etc) que configuram uma diretiva de configuração por domínio. Como o software cria o arquivo de configuração (ou sejahttpd.conf
), você não pode alterá-lo diretamente, porque o software de hospedagem o substituirá apenas quando reiniciar.Com o Plesk, eles fornecem um lugar para substituir o
httpd.conf
chamado chamadovhost.conf
. Somente o administrador do servidor pode gravar este arquivo. A configuração do Apache se parece com issoPeça ao administrador do servidor que consulte o manual do software de hospedagem e servidor da Web que eles usam.
Permissões de arquivo
É importante observar que a execução de um arquivo por meio do servidor da Web é muito diferente de uma linha de comando ou execução de tarefa cron. A grande diferença é que seu servidor da web tem seu próprio usuário e permissões. Por razões de segurança, esse usuário é bastante restrito. O Apache, por exemplo, é frequentemente
apache
,www-data
ouhttpd
(dependendo do seu servidor). Um trabalho cron ou a execução da CLI possui as permissões que o usuário que o executa (por exemplo, executar um script PHP como root, executa com permissões de root).Muitas vezes as pessoas resolvem um problema de permissões fazendo o seguinte (exemplo do Linux)
Esta não é uma idéia inteligente, porque o arquivo ou diretório agora é gravável em todo o mundo. Se você possui o servidor e é o único usuário, isso não é tão importante, mas se você estiver em um ambiente de hospedagem compartilhada, você acabou de dar acesso a todos no servidor.
O que você precisa fazer é determinar o (s) usuário (s) que precisam acessar e conceder somente a eles. Depois de saber quais usuários precisam acessar, verifique se
Esse usuário possui o arquivo e, possivelmente, o diretório pai (especialmente o diretório pai, se você deseja gravar arquivos). Na maioria dos ambientes de hospedagem compartilhada, isso não será um problema, pois o usuário deve possuir todos os arquivos abaixo da raiz. Um exemplo do Linux é mostrado abaixo
O usuário, e somente esse usuário, tem acesso. No Linux, uma boa prática seria
chmod 600
(apenas o proprietário pode ler e escrever) ouchmod 644
(o proprietário pode escrever, mas todos podem ler)Você pode ler uma discussão mais extensa sobre permissões e usuários do Linux / Unix aqui
fonte
Meu código funcionou bem em todas as máquinas, mas apenas nessa começou a dar problema (que costumava funcionar, acho que eu acho). Utilizado o caminho "document_root" de eco para depuração e também olhou atentamente para o erro, encontrou este
Você pode ver facilmente onde estão os problemas. Os problemas são // antes das funções
Portanto, basta remover o lading / de include e ele deve funcionar bem. O interessante é que esses comportamentos são diferentes em versões diferentes. Eu corro o mesmo código no laptop, Macbook Pro e neste PC, tudo funcionou bem até. Espero que isso ajude alguém.
fonte
Adicionar script com parâmetros de consulta
Esse foi o meu caso. Na verdade, ele vincula à pergunta # 4485874 , mas vou explicá-la aqui em breve.
Quando você tenta exigir
path/to/script.php?parameter=value
, o PHP procura pelo arquivo nomeadoscript.php?parameter=value
, porque o UNIX permite que você tenha caminhos como este.Se você realmente precisar passar alguns dados para o script incluído, apenas declare-o como
$variable=...
ou$GLOBALS[]=...
ou da maneira que desejar.fonte
Ações de Samba
Se você possui um servidor de teste Linux e trabalha em um cliente Windows, o compartilhamento Samba interfere no comando chmod . Então, mesmo se você usar:
no lado do Linux, é perfeitamente possível que o grupo Unix \ www-data ainda não tenha acesso de gravação. Uma solução funcional se o seu compartilhamento estiver configurado para que os administradores do Windows sejam mapeados para raiz: no Windows, abra as Permissões, desative Herança da sua pasta com cópia e conceda acesso total a www-data.
fonte
Outra causa possível: Renomear e / ou mover arquivos enquanto estiver em um editor de texto. Eu segui todas as etapas acima sem êxito até excluir o arquivo que continuava lançando esse erro e criar um novo, que corrigia o problema.
fonte