meta données pour cette page
Ceci est une ancienne révision du document !
php chez free
J'avais cherché des infos sur PHP chez free, mais je m'étais arrêté sur un wiki de free, devenu vide depuis. Maintenant j'ai trouvé tout certains renseignements ici. Mais pas tout, non. On y trouve une partie de ce qui ne fonctionne pas, mais pas la manière de contourner les problèmes que cela engendre. L'une des conséquences de la mutilation modification de PHP par free est que Dokuwiki ne peut pas s'installer sans modifications, pas plus, d'ailleurs, qu'aucune application PHP dont la taille dépasse «Hello-World.php». D'autre part, on ne peut pas tout mettre dans un fichier .htaccess
chez free, ou ce qu'il faut y mettre est plutôt inattendu. Je recense ici les problèmes rencontrés lors de l'installation d'un dokuwiki chez free, ainsi que les contournements trouvés. Mais les conseils donnés ici ne sont pas spécifiques à dokuwiki; les limitations de php s'appliquent à toutes les applications écrites en PHP.
Références :
- http://www.free.fr/assistance/960-options.html (utilisez les liens à gauche, si ceux de la page ne fonctionnent pas)
Cette page indique comment modifier en général les applications PHP pour qu'elles puissent fonctionner. les informations données ici devraient vous aider à résoudre les problèmes que vous pourriez rencontrer. Je suis loin d'être un spécialiste de PHP, il est donc possible que je n'ai pas envisagé les bonnes solutions aux problèmes rencontrés. Cela dit, je ne vois pas vraiment comment faire autrement que de modifier les applications qui ne fonctionnent pas, vu que les fonctions rename_function
et override_function
ne sont pas disponibles chez free.
En ce qui concerne Dokuwiki, J'ai écrit cette autre page qui explique comment mettre en œuvre manuellement les contournements indiqués ici. D'autre part l'outil liberatator effectue les modifications indiquées automatiquement; il est valable pour toutes les versions de DokuWiki.
Une dernière chose, globalement, je ne peux pas trop me plaindre, vu que je ne verse pas un centime à free et qu'en retour j'ai un hébergement sans la moindre publicité…
Bonne lecture
version de PHP
Par défaut, php 4 est activé. Le wiki de free1) précise qu'il suffit, pour activer php 5, de créer un fichier .htaccess
contenant au moins cette ligne là
php 1
Remarquez que cette page2) du wiki de free préconise d'utiliser php 5
. J'ai pas essayé, mais ça marche avec php 1
.
On peut créer ce fichier à la racine du site, pour activer globalement php 5, ou dans le répertoire de l'application PHP pour n'activer php 5 que pour cette application si on l'a installé dans un sous répertoire.
solution
Le mieux est d'activer php 5 pour tout le site, et donc de créer un fichier .htaccess
à la base de son espace web.
sessions
Pour que les sessions PHP fonctionnent – et c'est indispensable pour les «grosses» applications, il faut un répertoire sessions
à la racine du site web. quelque soit le sous répertoire où l'application est déployée.
solution
Créer un répertoire sessions
à la racine du site web.
include_path
On ne peut pas changer l'include_path
, sans doute pour ne pas pouvoir inclure de fichiers d'un autre internaute, ou lire des fichiers système.
La fonction set_include_path
ne fait rien du tout, mais ne retourne pas d'erreur.
L'include_path
disponible est
votre_foyer/include:.:/usr/php5/lib/php
Soit, par exemple, pour un utilisateur toto :
/mnt/342/sda/2/z/toto/include:.:/usr/php5/lib/php
Solutions
Plusieurs solutions sont possible dans ce cas,
- Dans les fichiers
.php
, toujours indiquer un chemin aux fonctionsinclude
,include_once
,require
etrequire_once
- Créer un répertoire
include
à la racine du site web et y installer tous les fichiers devant être inclus. - installer les fichiers devant être inclus dans le même répertoire que le fichier utilisant les fonctions
include
,include_once
etc…
.htaccess
- On ne peut pas utiliser la directive
php_value
qui permet de configurer php. Si on utilise cette directive, le serveur web renvoie immédiatement une erreur500 internal error
. C'est tout de même un peu embettant car on ne peut pas configurer php;.
Personnellement, je me répète, je ne paye pas un centime et j'ai tout de même un hébergement sans aucune pub. On va pas se plaindre, quand même.
- La syntaxe pour protéger un dossier par mot de passe est peu courante. La plupart des utilitaires PHP ne la connaisse pas et ne peuvent pas la générer. Si vous devez protéger certains dossiers par mot de passe, faite le à la main en respectant
cette syntaxe3)cette syntaxe. Vous pouvez aussi utiliser ce mini gestionnaire de fichier adapté à free.
fonction glob()
Pour une raison mystérieuse4), la fonction php glob()
ne fonctionne pas !!
glob ne fait pas partie de la terrible liste des fonctions interdites.
contournement
Il faudra modifier tous les fichiers PHP qui contiennent un appel à glob
en remplaçant ces appels par des appels à une autre fonction équivalente. J'utilise la fonction myglob()
. Cette fonction ne réagit pas tout à fait comme la vraie fonction glob
mais elle est suffisante dans la plupart des cas. En particulier, elle ne prend pas en compte les variantes GLOB_NOESCAPE
, GLOB_BRACE
, GLOB_ONLYDIR
et GLOB_ERR
. De plus, son comportement diffère légèrement en ce qui concerne les liens symboliques pointant vers des fichiers cachés 5), mais cela n'a par contre strictement aucune importance car on ne peut pas créer de liens symboliques chez free. Au besoin, google sera votre ami. Enfin, myglob( '*' )
ou autre modèle sans chemin reverra des choses comme ./nom-fichiers
, alors que la vraie glob
, renvoie simplement nom-fichiers
. Là encore cela n'a aucune importance puisque ./nom-fichier
est équivallent à nom-fichier
en ce qui concerne la désignation des fichiers; au pire un logiciel pourrait afficher un truc un peu moche comme /a/b/./fichier
, mais cela reste équivallent à /a/b/fichier
. Le risque est très faible
fonction rmdir()
Pour une raison mystérieuse, la fonction php rmdir()
ne fonctionne pas ! Autrement dit, aucune application PHP ne peut détruire un quelconque dossier.
rmdir fait partie de la terrible liste des fonctions interdites.
contournement
En fouillant un peu le web, on trouve que la fonction rename( $a, $b )
peut parfaitement renommer le dossier $a
en $b
. Jusque là rien d'incroyable. Mais si $b
existe déjà, rename
va quand même réussir. Et donc d'autres avant moi ont déjà trouvé qu'on peut facilement écrire une fonction myrmdir()
qui après avoir vérifié la vacuité d'un dossier va le renommer en un nom fixe et convenu à l'avance, tel que poubelle
par exemple. Le résultat tout net est qu'on a un dossier appelé poubelle
à la racine du site, qu'on en aura jamais qu'un seul et qu'on peut “détruire” ainsi des dossiers avec PHP et cette fonction.
fonction umask()
umask fait partie de la terrible liste des fonctions interdites.
La fonction umask
qui rentourne et fixe la valeur des autorisations à enlever par défaut lors de la création de fichiers et dossiers retourne une chaine vide et est sans effet. du code standard comme cet exemple tiré de eXtexplorer ne peut tout simplement plus fonctionner, car alors ~ & 0111
n'est pas une expression PHP valide.
// make file executable, obey umask $mode = fileperms($v_header['filename']) | (~umask() & 0111);
contournement
Pour les appels à umask($nouvelle_valeur)
il n'y a aucun contournement possible. la fonctionnalité n'est pas disponible. Point. De toute manière elle ne présente pas grand intérêt chez free où chaque site web a son système de fichiers isolé des autres, est mono-utilisateur avec un seul utilisateur possible : l'utilisateur web.
Ce qu'on peut faire pour rendre les expressions valide, et faire en sorte que le programme n'ait plus d'erreur de syntaxe, est remplacer tous les appels à umask()
et les appels à umask( blablabla )
par une valeur habituelle d'umask, comme 022
par exemple. Le code ci dessus devient alors :
// make file executable, obey umask $mode = fileperms($v_header['filename']) | (~022 & 0111);
La fonction umask()
, par nature, sera appelée seulement quelques fois dans tout un programme. Le plus simple est de rechercher toutes les occurrences de cette fonction et faire systématiquement ces remplacements.
On peut également écrire une fonction myumask()
et remplacer tous les appels à umask()
par des appels à myumask()
. La fonction myumask()
n'a aucun effet sinon de toujours retourner une valeur convenable pour un tel masque.
fonction opendir()
Pour une raison mystérieuse, la fonction php opendir()
échoue avec un warning si un répertoire n'existe pas, et ce, même lorsqu'elle est appelée comme ceci @opendir(…)
.
contournement
On peut utiliser une fonction myopendir()
et modifier tous les fichiers php pour qu'ils utilisent cette nouvelle fonction. C'est un peu overkill, car la plupart du temps, opendir porte sur un répertoire qui existe.
Plutôt que de faire un remplacement systématique, on peut ne faire le remplacement que pour les cas qui produisent une erreur. On est alors averti par un message de PHP du fichier et de la ligne qui a posé un problème.
fonction usleep()
Cette fonction qui permet d'attendre le nombre spécifié de microsecondes n'aucun effet. Elle ne retourne pas d'erreur, c'est déjà ça, mais ne sert absolument à rien. NB elle fait partie de la terrible liste des fonctions interdites
Pas de contournement trouvé pour le moment…
Absence de connexion vers l'extérieur
Pour, moi, depuis quelque chose comme fin août 2011 environ6), PHP ne peut plus effectuer de connexion à des sites externes. Les outils du genre “mise à jour automatique”, “installation de greffons” ou “agrégateur de flux” ne fonctionnent plus. La raison en serait que free tente de faire disparaitre ainsi les redirecteurs et autres serveur mandataires installés par de petits malins…
Si vos script se connectent toujours à la même adresse, vous pouvez demander sur le forum usenet de free idoine la mise en liste blanche de certaine adresse.
NB
Le problème semble se déclencher de manière plus où moins aléatoire chez certains internautes. J'ai pu pendant presqu'un an télécharger depuis le serveur de free des greffons pour mon site web. Je ne peux plus…
NB2
Avant cela, lorque PHP pouvait se connecter à des sites externes, de toute façons, il existait une petite restriction concernant les connexions. Comme openssl et TLS ne sont pas inclus dans PHP chez free, PHP ne peut pas ouvrir de flux https. Demander à PHP de télécharger des fichiers depuis des sites en https, comme github par exemple est donc impossible.
Référence 1
Référence 2
Référence 3
L'un des derniers conseils de la page http://les.pages.perso.chez.free.fr/index.php?post/2010/01/22/FAQ
Temps d'exécution et mémoire ?
D'autre problèmes surviennent sans qu'il soit possible de vraiment savoir… Est-ce que le temps d'exécution d'un script est dépassé, ou bien s'agit-il d'un dépassement de mémoire, ou encore a-t-il atteint une sorte de quota réseau ?
contournement/solution
rien
— schplurtz le déboulonné 2011/01/24 21:10