php require_once différence de chemin entre windows et linux

J’ai un fichier situé dans mon dossier racine CakePHP placé dans un dossier nommé cron. Le chemin est:

c:/wamp/www/project/cron/daily.php 

Ce fichier nécessite un autre fichier placé dans le dossier fournisseur de la structure du gâteau, comme ceci:

 require("/../vendors/phpMailer/class.phpmailer.php"); 

Et je lance ce daily.php à partir du planificateur de tâches. Voici le scénario de mon site de développement (système Windows). Cela fonctionne bien comme prévu. Lorsque j’ai migré le projet vers Ubuntu (site de production), la déclaration de besoin a provoqué des problèmes. il ne peut pas trouver le fichier requirejs. J’ai fait un petit changement là-bas, comme ceci:

 require("../vendors/phpMailer/class.phpmailer.php"); <= removed the preceding slash 

Et ça a marché. Donc, mon doute est le suivant: existe-t-il une différence dans la manière dont la notation des répertoires parents fonctionne pour les veuves et Linux? Si oui, comment puis-je surmonter cela? Il n’est pas possible de supprimer une barre oblique chaque fois que je déplace le projet de mon site de développement (Windows) vers le site de production (Linux).


J’ai essayé ceci:

  require("./../vendors/phpMailer/class.phpmailer.php"); 

Cela a fonctionné sous Linux. Mais a donné “pas un tel fichier répertoire” erreur dans Windows. Il semble que Windows ne fonctionne qu’avec:

  require("/../vendors/phpMailer/class.phpmailer.php"); 

Solution

Le problème d’aide de @ TWCrap a été résolu comme suit:

 require(dirname(__FILE__)."/../vendors/phpMailer/class.phpmailer.php"); 

Cela fonctionne à la fois dans Windows et Linux (* larmes de joie *). Mais dans les fenêtres, il produit un chemin comme:

 C:\wamp\www\project\cron/../vendors/phpMailer/class.phpmailer.php 

Ce chemin est moche et j’espère qu’il ne causera pas de problèmes à l’avenir!

-Merci les gars!

Si je me souviens bien, lorsque vous mettez 1 sharepointvant la ligne, vous commencez au répertoire que vous êtes. Alors, la ligne doit ressembler à ceci:

 require("./../vendors/phpMailer/class.phpmailer.php"); 

Et cela devrait fonctionner chez windows et linux ….

N’utilisez pas de chemins absolus si vous n’en avez pas vraiment besoin. Il est plus sûr et préférable de définir correctement include_path donc en cas de déplacement, il vous suffit d’ajuster un paramètre au lieu de creuser tout le projet et tous ses fichiers.

Donc, mon doute est le suivant: existe-t-il une différence dans la manière dont la notation des répertoires parents fonctionne pour les veuves et Linux?

Les chemins commençant par / (c.-à /foo/bar d. /foo/bar ) sont des chemins absolus en tant que début / indique le dossier racine. Sous Windows, vous avez reçu une lettre de lecteur.

Je suggère également d’utiliser require_once pour éviter les require_once en double (ce qui est correct si vous mélangez du code HTML avec du code, mais “spaghetti code” n’est pas recommandé de toute façon), mais peut causer des problèmes avec le code

Le problème est que, au moins sur un système UNIX, lorsque vous commencez par une barre oblique précédente sur un chemin de fichier, vous commencez à la racine.

Vous devriez écrire soit ./../ * ou simplement ../ deux des deux systèmes. Cela devrait fonctionner les deux.