web-dev-qa-db-fra.com

PHP - Échec d'ouverture du flux: aucun fichier ou répertoire de ce type

Dans les scripts PHP, que vous appeliez include(), require(), fopen() ou leurs dérivés tels que include_once, require_once ou même, move_uploaded_file(), on rencontre souvent une erreur ou un avertissement: 

Échec d'ouverture du flux: Aucun fichier ou répertoire de ce type.

Quel est le bon processus pour trouver rapidement la cause du problème?

119
Vic Seedoubleyew

Pour ajouter à la (très bonne) réponse existante

Logiciel d'hébergement partagé

open_basedir peut vous bloquer, car il peut être spécifié dans une configuration de serveur Web. Bien que ce problème soit facilement résolu si vous exécutez votre propre serveur dédié, il existe des packages de logiciels d'hébergement partagé (tels que Plesk, cPanel, etc.) qui configurent une directive de configuration domaine par domaine. Étant donné que le logiciel crée le fichier de configuration (c'est-à-dire httpd.conf), vous ne pouvez pas modifier ce fichier directement, car le logiciel d'hébergement l'écrase simplement à son redémarrage.

Avec Plesk, ils fournissent un emplacement pour remplacer le httpd.conf fourni appelé vhost.conf. Seul l'administrateur du serveur peut écrire ce fichier. La configuration pour Apache ressemble à ceci

<Directory /var/www/vhosts/domain.com>
    <IfModule mod_php5.c>
        php_admin_flag engine on
        php_admin_flag safe_mode off
        php_admin_value open_basedir "/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR"
    </IfModule>
</Directory>

Demandez à votre administrateur de serveur de consulter le manuel du logiciel d’hébergement et de serveur Web qu’il utilise.

Autorisations de fichier

Il est important de noter que l’exécution d’un fichier sur votre serveur Web est très différente de l’exécution d’une tâche en ligne de commande ou cron. La grande différence est que votre serveur Web a ses propres utilisateurs et autorisations. Pour des raisons de sécurité, cet utilisateur est assez restreint. Apache, par exemple, est souvent Apache, www-data ou httpd (en fonction de votre serveur). Une tâche cron ou une exécution CLI dispose des autorisations que l'utilisateur qui l'exécute (c'est-à-dire que l'exécution d'un script PHP en tant que root sera exécutée avec les autorisations correspondantes).

Souvent, les gens vont résoudre un problème de permissions en procédant comme suit (exemple Linux)

chmod 777 /path/to/file

Ce n’est pas une bonne idée, car le fichier ou le répertoire est maintenant accessible en écriture. Si vous possédez le serveur et que vous êtes le seul utilisateur, ce n'est pas si grave, mais si vous êtes sur un environnement d'hébergement partagé, vous venez d'accorder l'accès à tous les utilisateurs de votre serveur.

Ce que vous devez faire, c'est déterminer le ou les utilisateurs qui ont besoin d'un accès et leur donner uniquement accès. Une fois que vous savez quels utilisateurs ont besoin d’accès, vous devez vous assurer que 

  1. Cet utilisateur possède le fichier et éventuellement le répertoire parent (en particulier le répertoire parent si vous souhaitez écrire des fichiers). Dans la plupart des environnements d'hébergement partagé, cela ne pose pas de problème, car votre utilisateur doit posséder tous les fichiers situés sous votre racine. Un exemple Linux est présenté ci-dessous

    chown Apache:apache /path/to/file
    
  2. L'utilisateur, et seul cet utilisateur, a accès. Sous Linux, une bonne pratique serait chmod 600 (seul le propriétaire peut lire et écrire) ou chmod 644 (le propriétaire peut écrire mais tout le monde peut lire).

Vous pouvez lisez une discussion plus détaillée sur les autorisations Linux/Unix et les utilisateurs ici

11
Machavity

Ajouter un script avec des paramètres de requête

C'était mon cas. Il s'agit en fait de liens vers question # 4485874 , mais je vais l'expliquer ici sous peu.
Lorsque vous essayez d'exiger path/to/script.php?parameter=value, PHP recherche le fichier nommé script.php?parameter=value, car UNIX vous permet d'avoir des chemins comme celui-ci.
Si vous avez vraiment besoin de transmettre des données au script inclus, déclarez-les simplement en tant que $variable=... ou $GLOBALS[]=... ou de toute autre manière qui vous convient.

1
Paul Lynn
  1. Regardez le exact error

Mon code a bien fonctionné sur toutes les machines, mais seulement sur celle-ci a commencé à donner problème (qui fonctionnait trouver, je suppose). Utilisé echo "document_root" chemin de débogage et a également examiné de près l'erreur, a trouvé ceci

Attention: include ( D: /MyProjects/testproject//functions/connections.php ): Impossible d'ouvrir le flux:

Vous pouvez facilement voir où sont les problèmes. Les problèmes sont // avant les fonctions

$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');

Donc, retirez simplement le chargement/de include et cela devrait fonctionner correctement. Ce qui est intéressant, c’est que ces comportements diffèrent d’une version à l’autre. Je lance le même code sur ordinateur portable, Macbook Pro et ce PC, tout a bien fonctionné jusqu'à ce que. J'espère que ça aide quelqu'un.

  1. Copiez l’emplacement du fichier dans le navigateur pour vous assurer que le fichier existe. Parfois, des fichiers sont supprimés de manière inattendue (c'est arrivé avec moi) et c'était aussi le problème dans mon cas.
1
Hammad Khan

Une autre cause possible: renommer et/ou déplacer des fichiers dans un éditeur de texte. J'ai parcouru toutes les étapes ci-dessus sans succès jusqu'à ce que je supprime le fichier qui renvoyait cette erreur et en créais un nouveau qui corrigeait le problème.

0
zMeadz