meta données pour cette page
  •  

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
dokuwiki:php-chez-free [2011/11/26 08:34]
ztrulphcs [fonction umask()]
— (Version actuelle)
Ligne 1: Ligne 1:
-====== php chez free ====== 
  
-J'avais cherché des infos sur PHP chez free, mais je m'étais arrêté sur un [[http://wiki.free.fr/wiki/index.php/Configuration_php_free|wiki de free]], devenu vide depuis. Maintenant j'ai trouvé <del>tout</del> certains renseignements [[http://www.free.fr/assistance/958-php.html|ici]]. Mais pas tout, non. On y trouve une partie 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 <del>mutilation</del> modification de PHP par free est que [[doku>|Dokuwiki]] ne peut pas s'installer sans modifications, pas plus, d'ailleurs, qu'aucune application PHP dont la taille dépasse «[[http://helloworldsite.he.funpic.de/hello.htm#PHP|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/958-php.html 
-  * http://www.free.fr/assistance/960-options.html (utilisez les liens à gauche, si ceux de la page ne fonctionnent pas) 
-  * http://www.aduf.org/viewtopic.php?t=211258 
-  * http://les.pages.perso.chez.free.fr/index.php?post/2007/06/23/Le-htaccess-des-pages-perso3 
- 
-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 ''[[http://php.net/fr/rename_function|rename_function]]'' et ''[[http://php.net/fr/override_function|override_function]]'' ne sont pas disponibles chez free. 
- 
-En ce qui concerne [[doku>Dokuwiki]], J'ai écrit [[dokuwiki-chez-free|cette autre page]] qui explique comment mettre en œuvre manuellement les contournements indiqués ici. D'autre part l'outil [[:schplurtziel: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é. [[http://wiki.free.fr/wiki/index.php/Php5|Le wiki de free]]((page devenue vide...)) précise qu'il suffit, pour activer php 5, de créer un fichier ''.htaccess'' contenant au moins cette ligne là 
-<code .htaccess> 
-php 1 
-</code> 
- 
-Remarquez que [[http://wiki.free.fr/wiki/index.php?title=D%C3%A9buter_avec_PHP&oldid=372|cette page]]((page devenue vide...)) 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 ''[[http://php.net/fr/set_include_path|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 fonctions ''include'', ''include_once'', ''require'' et ''require_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 erreur ''500 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 [[http://wiki.fre.fre/wiki/index.php/.htaccess|cette syntaxe]]((page devenue vide...)). Vous pouvez aussi utiliser ce [[dokuwiki-chez-free|mini gestionnaire de fichier]] adapté à free. 
-===== fonction glob() ===== 
- 
-Pour une raison mystérieuse(( en fait, comme indiqué [[http://fr.php.net/manual/en/function.glob.php#97444|ici]], c'est probablement pour cette raison [[http://seclists.org/fulldisclosure/2005/Sep/1|là]])), la fonction php ''glob()'' ne fonctionne **pas** !! 
- 
-==== 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 ((les fichiers dont le nom commence par un point (''.''%%)%%)), 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 myglob()| 
-<code php> 
-function myglob( $patt, $drp=0 ) { 
-        $dir=dirname( $patt ); 
-        $pat=basename( $patt ); 
-        $md=($drp & GLOB_MARK)==GLOB_MARK; 
-        $reponse=array(); 
-        if (is_dir($dir) && ($d = @opendir($dir))) { 
-                $gl = array( ',/,', '/\./', '/\*/', '/\?/', '/^/', '/$/', ',/\.\*,', ',^/\^\.\*,'  ); 
-                $re = array( '\\/', '\.',   '.*',   '.',    '/^',  '\$/', '/[^.].*',  '/^[^.].*' ); 
-                $newpat=preg_replace( $gl, $re, $pat ); 
-                        while (($filename = @readdir($d)) !== false) { 
-                                if( $filename == '.' || $filename == '..' ) 
-                                        continue; 
-                                if( preg_match( $newpat, $filename )) { 
-                                        $reponse[]= $dir . '/' . $filename . (($md && is_dir($dir.'/'.$filename)) ? '/' : ''); 
-                                } 
-                } 
-        } 
-        if(($drp & GLOB_NOCHECK)&&count($reponse)==0) 
-                return array($patt); 
-        if($drp & GLOB_NOSORT) 
-                return $reponse; 
-        sort( $reponse ); 
-        return $reponse; 
-} 
-</code> 
-++++ 
- 
-===== 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. 
- 
-==== 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 myrmdir()| 
- 
-Cette fonction a le même comportement que la fonction ''rmdir()'' : 
-  * Si on tente de l'utliser sur un bidule qui n'est pas un dossier, elle renvoie ''false'', 
-  * si le dossier n'est pas vide, elle renvoie ''false'' 
-<code php> 
-$freefrdirtrash=$_SERVER['DOCUMENT_ROOT'].'/poubelle'; 
-function myrmdir( $d ) { 
-        global $freefrdirtrash; 
-        if(!is_dir($d)) 
-                return false; 
-        $h=opendir($d); 
-        while(false!==($s=readdir($h))) { 
-                if( $s != '.' && $s != '..' ) { 
-                        closedir($h); 
-                        return false; 
-                } 
-        } 
-        closedir($h); 
-        return rename($d, $freefrdirtrash); 
-} 
-</code> 
-++++ 
-===== fonction umask() ===== 
- 
-umask fait partie de la terrible //[[http://www.free.fr/assistance/947-fonctions-php-interdites.html|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 [[http://extplorer.sourceforge.net/|eXtexplorer]] ne peut tout simplement plus fonctionner, car alors ''~ & 0111'' n'est pas une expression PHP valide. 
- 
-<code php> 
-// make file executable, obey umask 
-$mode = fileperms($v_header['filename']) | (~umask() & 0111); 
-</code> 
- 
-==== 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 : 
- 
- 
-<code php> 
-// make file executable, obey umask 
-$mode = fileperms($v_header['filename']) | (~022 & 0111); 
-</code> 
- 
-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 ''myumask()''|<code php myumask.php> 
-function myumask( $x=null ) { 
-    return 022; 
-} 
-</code> 
-++++ 
- 
-===== 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 myopendir| 
-<code php> 
-function myopendir($x, $y=null) { 
- if(!is_dir($x)) return false; 
- return is_null($y) ? @opendir($x) : @opendir($x,$y); 
-} 
-</code> 
-++++ 
- 
-===== 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 //[[http://www.free.fr/assistance/947-fonctions-php-interdites.html|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 environ((date vraiment variable apparemment, ça pourrait remonter à janvier 2010 d'après ce que j'ai trouvé sur le web\\ Voir à ce propos les dates de la première référence et de la troisième.)), 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 == 
- 
-http://forum.sfgame.fr/showthread.php?t=5711&page=5 
-++++Texte reproduit ici| 
-> 23/08/2011, 21h27 
->test1942 
->Beau parleur 
->    
->J'ai compris pourquoi ça ne fonctionne plus.. 
->Free a du changer quelques choses dans le paramétrage de leur serveur web, j'ai ce message là: 
-> 
->Citation: 
->> En essayant de charger l'URL : http://s3.sfgame.fr/request.php? 
->>  
->> L'erreur suivante a été rencontrée : 
->>  
->> Accès interdit. 
->>  
->> 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. 
->>  
->>  
->> Generated Tue, 23 Aug 2011 20:26:01 GMT by pageperso.priv.free.fr (squid/3.0.STABLE21) 
-> 
-> 
-> Et j'ai trouvé ça comme explication: 
-> Citation: 
->> Bonjour, 
->>  
->> Il y a un filtrage sur l'accès externe depuis les pages persos. Il a été mis en place récemment pour se débarrasser définitivement des boulets qui mettaient en place des proxy web et qui surchargeaient les serveurs. 
->>  
->> Pour accéder à une page, il faut qu'elle soit whitelistée par l'administrateur. Tu peux en faire la demande en donnant les url complètes sur le newsgroup proxad.free.services.pagesperso. 
->>  
->> A+ 
->>  
->> Xavier 
->Dernière modification de test1942, 23/08/2011 à 21h29 Raison: Complément d'information 
->Répondre en citant 
-++++ 
- 
- 
-== Référence 2 == 
- 
-http://www.aduf.org/viewtopic.php?t=211258 
- 
-== 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@my-isp.com|schplurtz le déboulonné]] 2011/01/24 21:10//