2010-06-12 2 views
0

J'ai quelques fichiers qui ressemblent à ceci:du même répertoire comprend le défaut sur un serveur Fedora avec PHP

index.php:

<?php 
include('includes/header.php'); 

... 

includes/header.php:

<?php 
include('config.php'); 

... 

L'erreur que je reçois est

Warning: require(config.php) [function.require]: failed to open stream: No such file or directory in [dir]/includes/header.php on line 2
Fatal error: require() [function.require]: Failed opening required 'config.php' (include_path='.:/usr/share/pear:/usr/share/php') in [dir]/includes/header.php on line 2

J'ai fait quelques plus débogage: quand j'ajoute l'appel

system('pwd'); 

à includes/header.php, il montre [dir], où il doit dire [dir]/includes. L'ajout de 'includes /' au chemin d'inclusion fonctionne, mais n'est pas souhaitable car cela échouerait sur le serveur de production. Le code ci-dessus fonctionne sur un serveur de production et a fonctionné correctement sur mon serveur Fedora de développement, jusqu'à ce que j'essaie de changer mon environnement de développement pour que la racine de document du serveur Fedora soit un partage CIFS monté.

Des idées? Merci.

Répondre

0

worked fine ... until I tried to change my development environment so that the Fedora server's document root is a mounted CIFS share.

Est-ce que SELinux est activé?

Vérifier /var/log/audit/audit.log

Je vais parier que SELinux est activé et en mode application et interfère.

+0

Oui, ils sont tous les deux dans le même répertoire. Et ../config.php ne fonctionnait pas, comme je l'ai dit, c'est comme si c'était dans le répertoire parent, car inclure 'includes/config.php' fonctionne. –

+0

J'ai réécrit ma réponse parce que j'ai réalisé que je me trompais quelques instants après avoir posté. S'il vous plaît vérifier ma mise à jour pour quelque chose qui pourrait effectivement être cette fois-ci. ;) – Charles

+0

Il est actuellement en mode permissif, SELinux a été l'une des premières choses que j'ai vérifiées (c'est à peu près le fléau de mon existence) et j'ai éliminé quelques problèmes de cette façon. audit.log ne montre rien qui ressemble à un déni. –

0

Je déteste le dire, mais le comportement avec pwd que vous décrivez est 100% de comportement attendu (et a été depuis au moins PHP4 ... probablement plus tôt).

PHP définit automatiquement le répertoire de travail actuel (utilisé par pwd) UNE FOIS. PHP ne le change pas. Ainsi, . se référera au répertoire de travail en cours d'origine sauf si vous le modifiez manuellement avec chdir().

Différentes solutions à ce problème sont utilisées; la plupart de ce que vous pouvez voir au PHP include file strategy needed. Si cela fonctionnait avant, il y avait probablement une mise à jour du include_path quelque part, du code qui changeait le répertoire de travail ne le change plus, ou la version php que vous avez utilisée qui implémentait ce comportement bizarre (mais plus attendu) ne le fait plus alors.

Quoi qu'il en soit, je vérifierais les chemins d'inclusion: les fichiers ini, ou les scripts qui modifient le chemin d'inclusion. Je devine quelque chose utilisé pour mettre à jour le include_path, mais ne le fait plus. Je ne suis pas sûr des détails de la façon dont vous l'avez déplacé, mais j'ai rencontré des scripts ennuyeux où un fichier .htaccess définit un auto_prepend_file à un chemin d'accès codé à un fichier complètement en dehors de la structure du site, qui définit le chemin d'inclusion (entre autres) à quelque part à l'intérieur de la structure Web.

0

Montage du partage CIFS avec l'option « noserverino » devrait résoudre le problème, par exemple:

mount -t cifs -o noserverino //host/share /mnt 

Une explication complète des raisons pour lesquelles cela fonctionne peut être trouvé ici: http://www.php.net//manual/en/function.is-dir.php#98338

Questions connexes