require_once et chemin relatif...

Statut
N'est pas ouverte pour d'autres réponses.

k o D

Elite
Bonsoir à tous.

Bon mon titre n'est pas vraiment clair je le reconnais... je vais donc tâcher d'être le plus compréhensible :oops: .

Je finalise un site que j'ai réalisé en PHP5 en utilisant un maximum l'objet.
Il se trouve maintenant que j'ai lorsque je veux afficher ma page d'index j'obtiens cette erreur:

Warning: require_once(db/DBInterface.php) [function.require-once]: failed to open stream: No such file or directory in C:\wamp\www\visaexpress\admin\db\DBFactory.php on line 2

Fatal error: require_once() [function.require]: Failed opening required 'db/DBInterface.php' (include_path='.;C:\php5\pear') in C:\wamp\www\visaexpress\admin\db\DBFactory.php on line 2
Bon clairement un problème de path... parce que j'ai dans ma classe DBFactory ceci:
PHP:
require_once("db/DBInterface.php");
require_once("db/DBException.php");
require_once("db/MySQL.php");
Voici l'architecture de mes dossiers:

[www]
> [ admin ]
>> [ db ]
>>> DBFactory.php
>>> DBInterface.php
>>> DBMySQL.php
>> Toutes mes classes "Bizness" qui appellent sans difficultés ma DBFactory.
> index.php

Ma page qui utilise des objets défini dans [admin] qui eux-même appellent DBFactory mais là c'est le drame j'obtiens l'erreur plus haut...

Alors comment pourrais-je faire pour gérer ses chemins?
Merci d'avance!

PS: Je suis certain que c'est tout con mais comme je n'en sais rien je risque de chercher longtemps pour rien... :]
 

ozilrit

Elite
Utilise un chemin absolu parce que :
  • c'est plus simp',
  • un chemin relatif oblige le ZE à se situer à chaque appel,
  • le répertoire actuel dépend du script qui a inclus le script qui a inclus le script qui a inclus, etc.
 

ozilrit

Elite
Vire le require_once également, c'est un boulet.

if (! class_exist ('Classe')) {
require '/ma/classe.php';​
}​

Require (tout comme include, return et echo) n'est pas une fonction et ne prend donc pas de parenthèses.
 
1er
OP
k o D

k o D

Elite
Vire le require_once également, c'est un boulet.

if (! class_exist ('Classe')) {
require '/ma/classe.php';​
}​

Require (tout comme include, return et echo) n'est pas une fonction et ne prend donc pas de parenthèses.
C'est ce qu'il me semblait également mais je le vois dans quasiment tous les documents existants donc je me demandais quoi :-'

Merci bien je vais tester avec des chemins absolus.
 

ozilrit

Elite
Errata : ce serait plutôt class_exists().

De rien.
 

Calvin80

Respect is key
Require (tout comme include, return et echo) n'est pas une fonction et ne prend donc pas de parenthèses.
ne serait-ce pas :
Require (tout comme include, return et echo) n'est pas une fonction et peut donc ne pas prendre de parenthèses ?
 

ozilrit

Elite
La fonction redirige simplement vers la structure de language :
function require ($path) {
require $path;​
}​


Une condition class_exists va vérifier si la classe est déjà incluse. Oui ? fin. Non ? require.

Un require_once va lire le fichier, l'interpréter, le hasher, comparer le hash aux autres hashs et enfin décider. Trouvé ? fin. Sinon ? renvoyer le code.
 

Calvin80

Respect is key
Un require_once va lire le fichier, l'interpréter, le hasher, comparer le hash aux autres hashs et enfin décider. Trouvé ? fin. Sinon ? renvoyer le code.
OK merci pour ces infos !:]
je vais faire un test de performances pour voir un peu.
 

Calvin80

Respect is key
Effectivement, la différence est flagrante
//test 1

$t1 = microtime(true);
$nbloops = 3000;
$file = './rss_parse.inc';
for ($i=0;$i<$nbloops;$i++){
if(!class_exists('MagpieRSS'))
require($file);
}

echo 'script executed in '.(microtime(true)-$t1).' s';
donne, à peu près,
script executed in 0.0196461677551 s
par contre
$t1 = microtime(true);
$nbloops = 3000;
$file = './rss_parse.inc';
for ($i=0;$i<$nbloops;$i++){
require_once($file);
}

echo 'script executed in '.(microtime(true)-$t1).' s';
donne, à peu près,
script executed in 5.74044299126 s
 
1er
OP
k o D

k o D

Elite
Ouche oui mechant!
Je vais modifier ça demain.
 
1er
OP
k o D

k o D

Elite
Bon et bien je ne m'en sors pas... :pfiou:

Le chemin absolu m'est interdit, je ne sais en effet pas du tout le futur nom de domaine utilisé ni quoi que ce soit (serveur windows ou linux?).
Donc je dois le faire avec un chemin relatif.

Mais j'avoue que je ne comprend pas du tout comment set_include_path(""); fonctionne...
Je fais des tests depuis tout à l'heure mais je n'y parviens pas :pfiou:
Un bon petit exemple pour m'aider?

Voici les cas auquel je suis confronté:

> fichier index qui va chercher des fichiers dans le dossier admin, nusoap etc...
> [admin]
>> page allant chercher une autre page du même répertoire.
>> page allant chercher mon fichier config.php à la racine.
>> page allant chercher 1 fichier dans le dossier ../nusoap/lib.
>> page allant chercher une autre page dans le dossier /db
>> [db]
>>> page devant aller chercher le fichier config.php à la racine
> [nusoap]
>>[lib]
 

ozilrit

Elite
Pourquoi ne stockes-tu pas le chemin vers l'application dans une variable ou une constante tout simplement ?
 
1er
OP
k o D

k o D

Elite
Pourquoi ne stockes-tu pas le chemin vers l'application dans une variable ou une constante tout simplement ?
Oui d'accord mais j'avoue ne pas comprendre du tout le mécanisme...

D'après ce que je comprend, quand je prend ma page index (en racine) et que j'appelle ma page "Objet" dans le dossier admin qui elle-même fait appel à ma page "DB" dans le dossier admin/db le require présent dans ma page "Objet" ira chercher à partir de la racine de mon site étant donné que c'est dans ma page index que j'effectue le require vers ma page "Objet".

index -> admin/Object.php -> admin/db/DB.php

Le problème est que j'ai également des pages dans d'autres dossiers qui font appel à Objet (et donc forcément à DB). Par exemple:

admin/indexAdmin -> admin/Object.php -> admin/db/DB.php

Et là et bien le chemin à la base de l'appel n'est plus la racine mais /admin.

J'avoue ne pas saisir comment je peux arranger ce problème... ou alors si, dans admin je place $chemin = "admin/" et dans admin/indexAdmin je place $chemin=""
Bien entendu ce n'est pas aussi simple vu que par exemple admin/db/DB.php inclus config.php qui est à la racine du site...

index -> admin/Object.php -> admin/db/DB.php -> config.php
admin/indexAdmin -> admin/Object.php -> admin/db/DB.php -> config.php

Une fois que j'aurai compris le mécanisme çà ira mieux mais là je suis perdu :-'
 

ozilrit

Elite
Mais pourquoi te forces-tu à utiliser des chemins relatifs ?
 

ozilrit

Elite
echo dirname(__FILE__);
 
1er
OP
k o D

k o D

Elite
echo dirname(__FILE__);
Ok bon j'utilise ce système et çà fonctionne nickel... sauf pour mon fichier de configuration qui se trouve à la racine.

J'ai fais un exemple simpliste pour montrer ce à quoi je veux arriver.

Page testpath à la racine de mon serveur:
PHP:
require dirname(__FILE__).'/admin/include.php';
echo '<br/>A partir de la racine du serveur';
Page include dans le dossier admin:
PHP:
echo '1 - ',dirname(__FILE__).'/db/DBInterface.php<br/>';
echo '2 - ',dirname(__FILE__).'../config.php<br/>';
echo '3 - ',dirname(__FILE__.'../config.php'),'<br/>';
echo '4 - ',realpath('../config.php'),'<br/>';
echo '5 - ',__FILE__,'<br/>';
Page testpath2 dans le dossier admin comme include:
PHP:
require dirname(__FILE__).'/include.php';
echo '<br/>A partir du même dossier que include';
Bien entendu, la ligne 2 et 3 sont "folkloriques" mais c'est vraiment pour montrer ce que j'aimerai obtenir...
Parce que la difficulté vient que cette page include se fera appeler par des pages provenant de la racine mais aussi par des pages étant dans le même répertoire... le tout pour 1 fichier de configuration qui lui se trouvera d'office à la racine!

PS: j'ai même d'autres dossiers dans admin avec des pages qui appelleront également config.php :]
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut