[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / charger_php_extension.php
1 <?php
2
3 /**
4 * Chargement d'une extension PHP
5 *
6 * @package SPIP\Core\Outils
7 **/
8
9 if (!defined('_ECRIRE_INC_VERSION')) {
10 return;
11 }
12
13 /**
14 * Permet de charger un module PHP dont le nom est donné en argument
15 *
16 * Fonction adaptée de phpMyAdmin.
17 *
18 * Trois étapes :
19 *
20 * 1) si le module est deja charge, on sort vainqueur
21 * 2) on teste si l'on a la possibilité de charger un module
22 * via la meta `dl_allowed`. Si elle n'est pas renseignée,
23 * elle sera crée en fonction des paramètres de php
24 * 3) si l'on peut, on charge le module par la fonction `dl()`
25 *
26 * @note
27 * La fonction `dl()` n'est plus présente à partir de PHP 5.3.
28 *
29 * @param string $module
30 * Nom du module à charger (tel que 'mysql')
31 * @return bool
32 * true en cas de succes
33 **/
34 function inc_charger_php_extension_dist($module) {
35 if (extension_loaded($module)) {
36 return true;
37 }
38
39 // A-t-on le droit de faire un dl() ; si on peut, on memorise la reponse,
40 // lourde a calculer, dans les meta
41 if (!isset($GLOBALS['meta']['dl_allowed'])) {
42 if (!@ini_get('safe_mode')
43 && @ini_get('enable_dl')
44 && @function_exists('dl')
45 ) {
46 ob_start();
47 phpinfo(INFO_GENERAL); /* Only general info */
48 $a = strip_tags(ob_get_contents());
49 ob_end_clean();
50 if (preg_match('@Thread Safety[[:space:]]*enabled@', $a)) {
51 if (preg_match('@Server API[[:space:]]*\(CGI\|CLI\)@', $a)) {
52 $GLOBALS['meta']['dl_allowed'] = true;
53 } else {
54 $GLOBALS['meta']['dl_allowed'] = false;
55 }
56 } else {
57 $GLOBALS['meta']['dl_allowed'] = true;
58 }
59 } else {
60 $GLOBALS['meta']['dl_allowed'] = false;
61 }
62
63 // Attention, le ecrire_meta() echouera si on le tente ici ;
64 // donc on ne fait rien, et on attend qu'un prochain ecrire_meta()
65 // se produisant apres cette sequence enregistre sa valeur.
66 #include_spip('inc/meta');
67 #ecrire_meta('dl_allowed', $GLOBALS['meta']['dl_allowed'], 'non');
68 }
69
70 if (!$GLOBALS['meta']['dl_allowed']) {
71 return false;
72 }
73
74 $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
75
76 return @dl($prefix . $module_file . PHP_SHLIB_SUFFIX);
77 }