Plusieurs fichiers de ecrire/ ont, au début,
«
// Ce fichier ne sera execute qu'une fois
if (defined("_ECRIRE_INC_VERSION")) return;
define("_ECRIRE_INC_VERSION", "1");
» (avec « ECRIRE_INC_VERSION » qui varie)
Les fonctions php include_once ou require_once
http://www.php.net/manual/fr/function.include-once.php
http://www.php.net/manual/fr/function.require-once.php
remplissent elles tous les besoins du code précédant ?
Si oui, on pourrait faire le remplacement.
Il y a plusieurs "niveaux" en fait : dans spip, les fonctions
include_ecrire et include_spip gèrent elles mêmes la liste des
fichiers déjà inclus.
Le define est donc une "sécurité" supplémentaire pour les
cas d'inclusion directe notamment depuis certains codes extérieurs
comme spikini par exemple.
Selon moi, effectivement, utiliser include_once partout
simplifierait les choses d'autant plus que le if/define/return
déconne en php5.
Faut juste se taper le patch et les tests massifs, y compris
sur un tas de contribs qui profitent de ça.
Il faut savoir que ces define servent également parfois ailleurs,
par exemple pour savoir si on inclus inc-public depuis une page ou
depuis un inclure (auquel cas il faut bien refaire l'inclusion donc
ne pas utiliser include_once ...).
Bref, je pense que tout ça fait partie du nettoyage "qu'il serait bien
de faire" mais qui reste pour l'instant fidèle au célèbre "if it works
don't fix it".
Un test réalisé il y a un an ou deux constatait qu'include_once était
très lent par rapport à l'équivalent écrit en PHP (pour des raisons
inconnues). Je ne sais pas si c'est encore le cas.
a+
include_ecrire a aussi un autre avantage : il permet de faire une surcharge en douceur :
je peux inclure le fichier toto.php3 au lieu d'un des fichiers de spip et aller alimenter la liste des fichiers deja inclus.
C'est un peu sauvage, mais c'est pas negligeable pour aller en douceur vers la modularisation (bon, il faudrait ajouter une methode clean genre inclure_avant en passant le nom logique de la "librairie" et l'emplacement physique de la "surcharge").
Bref, s'appuyer sur le include_once dans ces methodes, pourquoi pas, mais il me semble que les methodes internes sont bien et offrent des fonctionnalités qu'il serait dommage de supprimer.
Mes 2 cents.
@++
Antoine a écrit :
Sur php 5.0.3, avec les scripts ci-joints :
Avec monInclude :
ab -c 10 -n 1000 http://…/tst/includes.php
Document Path: /tst/includes.php
Document Length: 106 bytes
Concurrency Level: 10
Requests per second: 15.37 [#/sec] (mean)
Time per request: 650.531 [ms] (mean)
Time per request: 65.053 [ms] (mean, across all concurrent requests)
Transfer rate: 5.10 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 3
Processing: 61 646 194.7 642 1510
Waiting: 59 638 196.2 635 1510
Total: 61 646 194.7 642 1510
Avec include_once :
ab -c 10 -n 1000 http://…/tst/includes2.php
Document Path: /tst/includes2.php
Document Length: 106 bytes
Concurrency Level: 10
Requests per second: 15.62 [#/sec] (mean)
Time per request: 640.247 [ms] (mean)
Time per request: 64.025 [ms] (mean, across all concurrent requests)
Transfer rate: 5.19 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 19.4 0 235
Processing: 63 634 199.4 631 1365
Waiting: 0 624 201.4 619 1365
Total: 114 635 197.3 632 1365
En clair, pour moi, la différence est non mesurable.
Reste à voir si ça se confirme sur des cas plus tordus
d'imbrications d'appels
tstIncludes.tgz (533 Bytes)
Il faut un mix des deux.
include_ecrire reste nécessaire puisqu'il bricole pour déterminer ou
est le répertoire ecrire/ selon le contexte appelant par exemple.
Dans une distrib organisée comme le lab ça deviendrait encore plus
nécessaire puisqu'il faut une version maison de l'include_path.
Moui, mais c'est pas très réaliste, il faut inclure, depuis l'intérieur
d'une fonction appelée en boucle, de vrais gros fichiers.
C'est possible que PHP5 ait résolu le pb, ceci dit.
home d'un Spip 1.8pre1 (faudrait que je l'upgrade celui là!) avec
delai mis à 0, 10 hits, 1 à la fois :
min mean[+/-sd] median max
Processing: 449 457 6.3 459 465
après avoir dégagé le if (@$GLOBALS['included_files'][$file]++) return;
et mis un include_once dans include_local, include_ecrire, include_lang
et include_plug :
min mean[+/-sd] median max
Processing: 469 480 7.7 484 492
On va effectivement un peu moins vite, mais c'est pas la mort.
(toujours php 5.0.3 mais en mode fastcgi celui là, sorry, j'ai pas
de php4 sous le coude).