====== Dokuwiki chez free ======
DokuWiki fraichement déployé chez free donne l'**illusion** qu'il fonctionne bien. Et puis, au fur et à mesure qu'on s'en sert, on tombe sur plein de problèmes bizarres et étranges qui font renoncer et passer à un autre produit. **NON**, c'est pas la faute à DokuWiki, et **OUI** on peut **facilement** rendre [[doku>dokuwiki|DokuWiki]] compatible avec les spécificités de PHP chez free grâce à [[:schplurtziel:liberatator|liberatator]].
En essayant de charger l'URL :
http://bloink.homelinux.net/cli.tar.gz
L'erreur suivante a été rencontrée :
La configuration du contrôle d'accès interdit à votre requête d'être
acceptée à cette heure-ci. Veuillez contacter votre
prestataire de service si vous pensez que ceci n'a pas lieu d'être.
++++
===== sessions =====
La solution consiste à créer un dossier ''sessions'' à la racine de votre espace web chez free.
===== Versions de php =====
Les versions de dokuwiki actuelles (2010-11-07 <
php 1
===== Modules PHP manquant =====
Sans openssl, on ne peut pas utiliser le module [[doku>plugin:securelogin]], seulement à moitié gênant. Le gestionnaire de greffon ne peut pas télécharger les greffons depuis certains sites comme github qui sont en HTTPS. De toutes façons, free a bridé un peu plus PHP, qui ne peut plus rien télécharger du tout. Voir [[#Absence de connexion vers l'extérieur]] plus bas dans la page.
Sans TLS, on est contraint d'utiliser seulement la fonction ''mail'' de PHP. pas très gênant en fait. Le module bureaucracy peut tout de même fonctionner presque normalement (sauf qu'il m'envoie des messages tout pourris à moitié en HTML mais sans y mettre les en-têtes nécessaires)
==== solution ====
Décider que c'est un faux problème. On peut toujours installer à la main les greffons dans le répertoire ''lib/plugins'' de DokuWiki. En tout cas ce n'est certainement pas vital, sinon :
* pour le greffon [[doku>plugin:securelogin]], utiliser une bibliothèque SSL pure php (si cela existe) et l'incorporer au greffon [[doku>plugin:securelogin]].
* pour le gestionnaire de greffon : le modifier vous même, faire parvenir la solution.
===== glob() =====
Si on regarde le type de ''glob()'' effectué dans dokuwiki, on se rend compte qu'il est très basique. par exemple pour la version <
$ grep -r rmdir * | grep -v -e inc/geshi -e install.php -e inc/preload.php
bin/indexer.php: @rmdir($lock);
bin/indexer.php: @rmdir($lock);
inc/io.php: if(@rmdir($dir)) {
inc/subscription.php: @rmdir($lock);
inc/subscription.php: return @rmdir($lockf);
lib/exe/indexer.php: @rmdir($lock);
lib/exe/indexer.php: @rmdir($lock);
lib/exe/xmlrpc.php: @rmdir($lock);
lib/exe/xmlrpc.php: @rmdir($lock);
lib/plugins/plugin/classes/ap_manage.class.php: return @rmdir($path);
Comme on ne peut pas faire fonctionner ce qui est dans ''bin''((pas de shell disponible pour lancer ça et ''``'' ne fonctionne pas chez free)), on ne s'occupe même pas de ''bin/indexer.php''
==== Contournements ====
Le plus simple consiste à remplacer tous les ''rmdir()'' par des ''myrmdir()'' dans tous les fichiers ''.php'' de [[doku>dokuwiki|DokuWiki]] en utilisant [[php-chez-free#fonction_rmdir|cette définition]] de ''myrmdir()''.
Sinon, on peut faire des trucs plus fins, ou bêtement plus compliqués, c'est comme on veut.
- Pour le fichier ''inc/io.php''
- fonction ''io_lock''\\ remplacer ''mkdir(lockDir)'' par ''fopen($lockDir, 'x')''. L'option ''"x"'' de fopen équivaut à ''open( ... O_EXCL|O_CREAT)''; ça devrait faire l'affaire.
- fonction ''io_unlock''\\ remplacer ''rmdir($lodkDir)'' par ''if(is_file($lockDir)) @unlink($lockDir)'';
- fonction ''io_sweepNS''\\ qui enlève les répertoire des catégories vides. Remplacer ''rmdir'' par ''myrmdir''. à définir dans ''preload.php'' et qui utilise la technique [[php-chez-free#fonction_rmdir|précédemment]] décrite:
- pour les fichiers ''inc/subscription.php'',\\ ''lib/exe/indexer.php'',\\ ''lib/exe/xmlrpc.php'',\\ il s'agit encore une fois de verrous. On fonctionne comme pour ''io.php'' : verrous basé sur un fichier; modification du code de ces fichiers.
- ''lib/plugins/plugin/classes/ap_manage.class.php''\\ on dirait bien un vrai ''rmdir'', pas un verrou. Technique du rename vers répertoire poubelle grâce à la fonction ''myrmdir''.
J'ai créé et détruit des catégories, installé et retiré des [[doku>plugins|greffons]], sans rencontrer aucun problème en utilisant les deux techniques. Le plus simple reste le remplacement systématique.
===== opendir() =====
''opendir()'' échoue même avec l'opérateur ''@''. La classe de gestion des greffons (entre autre) tente d'ouvrir des répertoires avec ''@opendir(....)'', et le script foire. Dans certaines situations, dokuwiki ne fonctionne carrément plus. L'interface de gestion de [[doku>|dokuwiki]], entre autre et à tous les coups, ne fonctionne pas.
==== contournement ====
Le plus simple est de remplacer tous les appels à ''opendir'' par un appell à ''myopendir'' dans tous les fichiers ''.php''.
Sinon, comme précédemment, on peut faire au coup par coup. mais c'est plus compliqué. PHP indique avec un beau message d'erreur le nom du fichier qui contient l'erreur et la ligne ou l'erreur s'est produite. Reste alors à modifier le fichier en question...
===== fonction usleep() =====
Cette fonction ne fonctionne absolument pas.Je ne m'en étais même pas rendu compte. Il y a quelques fichiers qui l'utilisent, mais le fait que ça ne fonctionne pas ne semble pas gêner.
===== fonction array_fill_keys() =====
Cette fonction est absente de PHP chez free. Voir [[dokuwiki:php-chez-free#fonction_array_fill_keys|php chez free]] pour les détails. Le greffon [[doku>plugin:translation]] l'utilise, mais c'est l'un des rares. Cette fonction n'est pas utilisée par dokuwiki de base.
La solution est d'inscrire dans le fichier ''preload.php'' la version en pur PHP que je donne sur [[dokuwiki:php-chez-free#fonction_array_fill_keys|cette page]].
Merci à Damien Gaignon d'avoir signalé le problème et testé la solution.
===== Absence de connexion vers l'extérieur =====
Symptôme :
* Le gestionnaire de greffons ne peut pas télécharger les modules complémentaires depuis d'autre sites.
* L'agrégateur interne de flux ATOM et RSS ne peut pas fonctionner : Les syntaxes du genre ''%%{{rss>http://slashdot.org/index.rss 5 author date 1h }}%%'' produisent ce message, pas le flux : \\ Une erreur s'est produite en récupérant ce flux : http://slashdot.org/index.rss
* Dokuwiki ne peut pas vérifier s'il existe une version plus récente de lui même.
{{:dokuwiki:doku-chez-free-pas-connexion.png?nolink& |Pas de connexion vers l'extérieur}}
ERREUR
L'URL demandée n'a pu être chargée