source: spip-zone/_plugins_/xray/trunk/xray_apc.php @ 112536

Last change on this file since 112536 was 112536, checked in by jluc@…, 2 years ago

filtrage des caches non sessionnés + des 'talons' de squelettes sessionnés

File size: 59.2 KB
Line 
1<?php
2
3/*
4+----------------------------------------------------------------------+
5| APC                                                                  |
6+----------------------------------------------------------------------+
7| Copyright (c) 2006-2011 The PHP Group                                |
8+----------------------------------------------------------------------+
9| This source file is subject to version 3.01 of the PHP license,      |
10| that is bundled with this package in the file LICENSE, and is        |
11| available through the world-wide-web at the following url:           |
12| http://www.php.net/license/3_01.txt                                  |
13| If you did not receive a copy of the PHP license and are unable to   |
14| obtain it through the world-wide-web, please send a note to          |
15| license@php.net so we can mail you a copy immediately.               |
16+----------------------------------------------------------------------+
17| Authors du apcu.php d'origine :                                      |
18|          Ralf Becker <beckerr@php.net>                               |
19|          Rasmus Lerdorf <rasmus@php.net>                             |
20|          Ilia Alshanetsky <ilia@prohost.org>                         |
21| Auteur des adaptations et du plugin SPIP :                           |
22|          JLuc http://contrib.spip.net/JLuc                           |
23+----------------------------------------------------------------------+
24
25All other licensing and usage conditions are those of the PHP Group.
26
27*/
28if (!defined('_ECRIRE_INC_VERSION')) {
29        return;
30}
31include_spip ('inc/autoriser');
32if (!autoriser('webmestre'))
33        die("Autorisation non accordée : devenez webmestre d'abord.");
34include_spip('inc/filtres');
35
36$VERSION = '$Id$';
37
38////////// READ OPTIONAL CONFIGURATION FILE ////////////
39if (file_exists("apc.conf.php"))
40        include("apc.conf.php");
41////////////////////////////////////////////////////////
42
43////////// BEGIN OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////
44
45defaults('USE_AUTHENTICATION', 0); // Use (internal) authentication - best choice if
46// no other authentication is available
47// If set to 0:
48//  There will be no further authentication. You
49//  will have to handle this by yourself!
50// If set to 1:
51//  You need to change ADMIN_PASSWORD to make
52//  this work!
53defaults('ADMIN_USERNAME', 'admin'); // Admin Username
54defaults('ADMIN_PASSWORD', 'password'); // Admin Password - CHANGE THIS TO ENABLE!!!
55
56// (beckerr) I'm using a clear text password here, because I've no good idea how to let
57//           users generate a md5 or crypt password in a easy way to fill it in above
58
59// defaults('DATE_FORMAT', "d.m.Y H:i:s");      // German
60defaults('DATE_FORMAT', 'Y/m/d H:i:s'); // US
61
62defaults('GRAPH_SIZE', 400); // Image size
63
64//defaults('PROXY', 'tcp://127.0.0.1:8080');
65
66// _CACHE_NAMESPACE est défini par memoization et préfixe chaque nom de cache SPIP
67// On ne souhaite pas que cette partie du nom s'affiche sur chaque ligne
68define('XRAY_NEPASAFFICHER_DEBUTNOMCACHE', _CACHE_NAMESPACE.'cache:');
69
70////////// END OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////////
71
72include_spip ('inc/xray_apc');
73
74// copie un peu modifiée de la fonction définie dans public/cacher.php
75if (!function_exists('gunzip_page')) {
76        function gunzip_page(&$page) {
77                if (isset ($page['gz']) and $page['gz']) {
78                        $page['texte'] = gzuncompress($page['texte']);
79                        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
80                }
81        }
82}
83else
84        die("La fonction gunzip_page ne devrait pas être déjà définie"); // à défaut de disposer de la lib nobug
85
86// Strings utils
87
88function is_serialized($str) {
89        return ($str == serialize(false) || @unserialize($str) !== false);
90}
91
92function get_serial_class($serial) {
93        $types = array(
94                's' => 'string',
95                'a' => 'array',
96                'b' => 'bool',
97                'i' => 'int',
98                'd' => 'float',
99                'N;' => 'NULL'
100        );
101       
102        $parts = explode(':', $serial, 4);
103        return isset($types[$parts[0]]) ? $types[$parts[0]] : trim($parts[2], '"');
104}
105
106function get_apc_data($info, &$data_success) {
107        if (apcu_exists($info)
108                and ($data = apcu_fetch($info, $data_success)) 
109                and $data_success 
110                and is_array($data) and (count($data) == 1) 
111                and is_serialized($data[0])
112                ) {
113                $page = unserialize($data[0]);
114                if (is_array($page))
115                        gunzip_page($page);
116                return $page;
117        };
118
119        $data_success = false;
120        return null;
121}
122
123function spipsafe_unserialize($str) {
124        if (strpos($str, "SPIPTextWheelRuleset") !== false) {
125                if (isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT'))
126                        return "Début : " . substr(trim($str), 0, 80) . '...';
127                else
128                        return "Brut : $str";
129        }
130        $unser = unserialize($str);
131        if (is_array($unser) and isset($unser['texte'])) {
132                gunzip_page($unser); // si 'texte' est trop grand il est gzcompress par gzip_page
133                if (isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT')) {
134                        $unser['texte'] = trim(preg_replace('/\s+/', ' ', $unser['texte']));
135                        if (mb_strlen($unser['texte']) > 80)
136                                $unser['texte'] = mb_substr($unser['texte'], 0, 80) . '...';
137                        elseif (!$unser['texte'])
138                                $unser['texte'] = '(vide)';
139                }
140        }
141        return print_contexte($unser, 1);
142}
143
144function print_contexte($extra, $tostring) {
145        $print = print_r($extra, 1);
146        if (stripos($print, 'Array') === 0) {
147                // On enlève 'Array( ' au début et ')' à la fin
148                $print = trim(substr($print, 5), " (\n\r\t");
149                $print = substr ($print, 0, -1);
150                $print = preg_replace_callback("/\[id_([a-z\-_]+)\]\s*=>\s*(\d+)$/im", function($match) use ($extra)
151                        {
152                                return $match[0] . '</xmp>' . bouton_objet($match[1], $match[2], $extra) . '<xmp>';
153                        }, $print);
154                // [squelette] => html_5731a2e40776724746309c16569cac40
155                $print = preg_replace_callback("/\[(squelette|source)\]\s*=>\s*(html_[a-f0-9]+|[a-z0-9_\.\/\-]+\.html)$/im", function($match)
156                        {
157                                if (!defined('_SPIP_ECRIRE_SCRIPT'))
158                                        spip_initialisation_suite();
159                                switch ($match[1]) {
160                                case 'squelette' : // cache squelette intermédiaire, en php
161                                        $source = trim(_DIR_CACHE, '/').'/skel/'.$match[2].'.php';
162                                        $title = "Squelette compilé : cache intermédiaire en php";
163                                        break;
164                                case 'source' :
165                                        $source = '../'.$match[2];
166                                        $title = "Source du squelette SPIP, avec boucles, balises etc";
167                                        break;
168                                }
169                                return "[{$match[1]}] => </xmp><a title='{$title}'
170                                                        href='".generer_url_ecrire('xray', "SOURCE=$source")."'
171                                                        target='blank'><xmp>{$match[2]}</xmp></a><xmp>";
172                        }, $print);
173        }
174        $print=preg_replace('/^    /m', '', $print);
175        if ($tostring)
176                return $print;
177        echo $print;
178}
179
180function bouton_objet($objet, $id_objet, $extra) {
181        $objet_visible = $objet;
182        if ($objet == 'secteur')
183                $objet = 'rubrique';
184        elseif (($objet == 'objet')     and isset ($extra['objet']))
185        {
186                $objet_visible = $objet = $extra['objet'];
187        };
188        return "<a href='/ecrire/?exec=$objet&id_$objet=$id_objet' target='blank'
189                        style='position:absolute; right:1em'
190                        title=\"" . attribut_html(generer_info_entite($id_objet, $objet, 'titre', 'etoile')) . "\">[voir $objet_visible]</a>";
191}
192
193if (!function_exists('plugin_est_actif')) {
194        function plugin_est_actif($prefixe) {
195                $f = chercher_filtre('info_plugin');
196                return $f($prefixe, 'est_actif');
197        }
198}
199
200function antislash ($str) {
201        return str_replace('/', '\/', $str);
202}
203
204define ('XRAY_PATTERN_SESSION', '/_([a-f0-9]{8}|)$/i');
205define ('XRAY_PATTERN_SESSION_AUTH', '/_([a-f0-9]{8})$/i');
206define ('XRAY_PATTERN_SESSION_ANON', '/_$/i');
207define ('XRAY_PATTERN_NON_SESSION', '/[^_](?<!_[a-f0-9]{8})$/i');
208define ('XRAY_PATTERN_TALON', '/^(.*)(?<!_[a-f0-9]{8})(?<!_)(_([a-f0-9]{8})?|)$/i');
209
210if (!function_exists('cache_est_sessionne')) {
211        function cache_est_sessionne ($nomcache) {
212                if (preg_match (XRAY_PATTERN_SESSION_AUTH, $nomcache))
213                        return 'session_auth';
214                elseif (preg_match (XRAY_PATTERN_SESSION_ANON, $nomcache))
215                        return 'session_anon';
216                else 
217                        return false;
218        }
219
220        function cache_est_talon ($nomcache,&$data='') {
221                if (preg_match(XRAY_PATTERN_SESSION, $nomcache))
222                        return false;
223                spip_log (print_r($data,1)."\n\n\n", "DEBUG_cache_est_talon");
224                if (!is_array($data)) // textwheels par exemple
225                        return false;
226                return !isset($data['contexte']);
227        }
228}
229
230////////////////////////////////////////////////////////////////////////
231
232// "define if not defined"
233function defaults($d, $v) {
234        if (!defined($d))
235                define($d, $v); // or just @define(...)
236}
237
238// rewrite $PHP_SELF to block XSS attacks
239//
240$PHP_SELF = isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'], ''), ENT_QUOTES, 'UTF-8') : '';
241
242$time     = time();
243$host     = php_uname('n');
244if ($host) {
245        $host = '(' . $host . ')';
246}
247if (isset($_SERVER['SERVER_ADDR'])) {
248        $host .= ' (' . $_SERVER['SERVER_ADDR'] . ')';
249}
250
251// operation constants
252define('OB_HOST_STATS', 1);
253define('OB_USER_CACHE', 2);
254define('OB_VERSION_CHECK', 3);
255define('OB_CACHELAB', 4);
256
257// check validity of input variables
258$vardom = array(
259        'exec' => '/^[a-zA-Z_\-0-9]+$/', // pour #URL_ECRIRE{xray}
260        'OB' => '/^\d+$/', // operational mode switch
261        'CC' => '/^[01]$/', // clear cache requested
262        'PP' => '/^[01]$/', // Purger Précache de compilation des squelettes en plus de vider le cache APC user
263        'DU' => '/^.*$/', // Delete User Key
264        'SH' => '/^[a-z0-9]*$/', // shared object description
265       
266        'IMG' => '/^[123]$/', // image to generate
267        'SOURCE' => '/^[a-z0-9\-_\/\.]+$/', // file source to display
268        'LO' => '/^1$/', // login requested
269       
270        'COUNT' => '/^\d+$/', // number of line displayed in list
271        'SCOPE' => '/^[AD]$/', // list view scope
272        'S_KEY' => '/^[AHSMCDTZ]$/', // first sort key
273        'SORT' => '/^[DA]$/', // second sort key
274        'AGGR' => '/^\d+$/', // aggregation by dir level
275        'SEARCH' => '~.*~',
276        'TYPECACHE' => '/^(|ALL|NON_SESSIONS|SESSIONS|SESSIONS_AUTH|SESSIONS_NONAUTH|SESSIONS_TALON|FORMULAIRES)$/', //
277        'ZOOM' => '/^(|TEXTECOURT|TEXTELONG)$/', //
278        'WHERE' => '/^(|ALL|HTML|META)$/', // recherche dans le contenu
279        'EXTRA' => '/^(|CONTEXTE|CONTEXTES_SPECIAUX|INFO_AUTEUR|INFO_OBJET_SPECIAL|INVALIDEURS|INVALIDEURS_SPECIAUX|INCLUSIONS'
280                .(plugin_est_actif('macrosession') ? '|MACROSESSIONS|MACROAUTORISER' : '')
281                .')$/'          // Affichage pour chaque élément de la liste
282);
283
284// cache scope
285$scope_list = array(
286        'A' => 'cache_list',
287        'D' => 'deleted_list'
288);
289
290global $MYREQUEST; // fix apcu
291// handle POST and GET requests
292if (empty($_REQUEST)) {
293        if (!empty($_GET) && !empty($_POST)) {
294                $_REQUEST = array_merge($_GET, $_POST);
295        } else if (!empty($_GET)) {
296                $_REQUEST = $_GET;
297        } else if (!empty($_POST)) {
298                $_REQUEST = $_POST;
299        } else {
300                $_REQUEST = array();
301        }
302}
303
304// check parameter syntax
305foreach ($vardom as $var => $dom) {
306        if (!isset($_REQUEST[$var]))
307                $MYREQUEST[$var] = NULL;
308        else if (!is_array($_REQUEST[$var]) && preg_match($dom . 'D', $_REQUEST[$var]))
309                $MYREQUEST[$var] = $_REQUEST[$var];
310        else {
311                echo "<xmp>ERREUR avec parametre d'url « $var » qui vaut « {$_REQUEST[$var]} »</xmp>";
312                $MYREQUEST[$var] = $_REQUEST[$var] = NULL;
313        }
314}
315
316// check parameter sematics
317if (empty($MYREQUEST['SCOPE']))
318        $MYREQUEST['SCOPE'] = "A";
319if (empty($MYREQUEST['S_KEY']))
320        $MYREQUEST['S_KEY'] = "H";
321if (empty($MYREQUEST['SORT']))
322        $MYREQUEST['SORT'] = "D";
323if (empty($MYREQUEST['OB']))
324        $MYREQUEST['OB'] = OB_HOST_STATS;
325if (!isset($MYREQUEST['COUNT']))
326        $MYREQUEST['COUNT'] = 20;
327if (!isset($scope_list[$MYREQUEST['SCOPE']]))
328        $MYREQUEST['SCOPE'] = 'A';
329
330global $MY_SELF; // fix apcu
331global $MY_SELF_WO_SORT; // fix apcu
332$MY_SELF_WO_SORT = "$PHP_SELF" . "?SCOPE=" . $MYREQUEST['SCOPE'] . "&COUNT=" . $MYREQUEST['COUNT'] . "&SEARCH=" . $MYREQUEST['SEARCH'] . "&TYPECACHE=" . $MYREQUEST['TYPECACHE'] . "&ZOOM=" . $MYREQUEST['ZOOM'] . "&EXTRA=" . $MYREQUEST['EXTRA'] . "&WHERE=" . $MYREQUEST['WHERE'] . "&exec=" . $MYREQUEST['exec'] . "&OB=" . $MYREQUEST['OB'];
333$MY_SELF         = $MY_SELF_WO_SORT . "&S_KEY=" . $MYREQUEST['S_KEY'] . "&SORT=" . $MYREQUEST['SORT'];
334$self            = "http" . (!empty($_SERVER['HTTPS']) ? "s" : "") . "://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
335
336global $IMG_BASE;
337$IMG_BASE = "$PHP_SELF" . "?exec=" . $MYREQUEST['exec'];
338
339// authentication needed?
340//
341if (!USE_AUTHENTICATION) {
342        $AUTHENTICATED = 1;
343} else {
344        $AUTHENTICATED = 0;
345        if (ADMIN_PASSWORD != 'password' && ($MYREQUEST['LO'] == 1 || isset($_SERVER['PHP_AUTH_USER']))) {
346               
347                if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME || $_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
348                        Header("WWW-Authenticate: Basic realm=\"APC Login\"");
349                        Header("HTTP/1.0 401 Unauthorized");
350                       
351                        echo <<<EOB
352                                <html><body>
353                                <h1>Rejected!</h1>
354                                <big>Wrong Username or Password!</big><br/>&nbsp;<br/>&nbsp;
355                                <big><a href='$PHP_SELF?OB={$MYREQUEST['OB']}'>Continue...</a></big>
356                                </body></html>
357EOB;
358                        exit;
359                       
360                } else {
361                        $AUTHENTICATED = 1;
362                }
363        }
364}
365
366// clear cache
367if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) {
368        apcu_clear_cache();
369}
370
371// clear cache
372if ($AUTHENTICATED && isset($MYREQUEST['PP']) && $MYREQUEST['PP']) {
373        include_spip('inc/invalideur');
374        purger_repertoire(_DIR_SKELS);
375        apcu_clear_cache();
376        ecrire_meta('cache_mark', time());
377}
378
379if ($AUTHENTICATED && !empty($MYREQUEST['DU'])) {
380        apcu_delete($MYREQUEST['DU']);
381}
382
383if (!function_exists('apcu_cache_info')) {
384        echo "No cache info available.  APC does not appear to be running.";
385        exit;
386}
387
388$cache = apcu_cache_info();
389
390$mem = apcu_sma_info();
391
392// don't cache this page
393//
394header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
395header("Cache-Control: post-check=0, pre-check=0", false);
396header("Pragma: no-cache"); // HTTP/1.0
397
398function duration($ts)
399{
400        global $time;
401        $years = (int) ((($time - $ts) / (7 * 86400)) / 52.177457);
402        $rem   = (int) (($time - $ts) - ($years * 52.177457 * 7 * 86400));
403        $weeks = (int) (($rem) / (7 * 86400));
404        $days  = (int) (($rem) / 86400) - $weeks * 7;
405        $hours = (int) (($rem) / 3600) - $days * 24 - $weeks * 7 * 24;
406        $mins  = (int) (($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60;
407        $str   = '';
408        if ($years == 1)
409                $str .= "$years year, ";
410        if ($years > 1)
411                $str .= "$years years, ";
412        if ($weeks == 1)
413                $str .= "$weeks week, ";
414        if ($weeks > 1)
415                $str .= "$weeks weeks, ";
416        if ($days == 1)
417                $str .= "$days day,";
418        if ($days > 1)
419                $str .= "$days days,";
420        if ($hours == 1)
421                $str .= " $hours hour and";
422        if ($hours > 1)
423                $str .= " $hours hours and";
424        if ($mins == 1)
425                $str .= " 1 minute";
426        else
427                $str .= " $mins minutes";
428        return $str;
429}
430
431// create graphics
432//
433function graphics_avail()
434{
435        return extension_loaded('gd');
436}
437if (isset($MYREQUEST['IMG'])) {
438        if (!graphics_avail()) {
439                exit(0);
440        }
441       
442        function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $color2, $text = '', $placeindex = 0)
443        {
444                $r = $diameter / 2;
445                $w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
446               
447               
448                if (function_exists("imagefilledarc")) {
449                        // exists only if GD 2.0.1 is avaliable
450                        imagefilledarc($im, $centerX + 1, $centerY + 1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE);
451                        imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE);
452                        imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL | IMG_ARC_EDGED);
453                } else {
454                        imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2);
455                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
456                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start + 1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
457                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end - 1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
458                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
459                        imagefill($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $color2);
460                }
461                if ($text) {
462                        if ($placeindex > 0) {
463                                imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
464                                imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
465                               
466                        } else {
467                                imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
468                        }
469                }
470        }
471       
472        function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $text, $placeindex = 0)
473        {
474                $r = $diameter / 2;
475                $w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
476               
477                if ($placeindex > 0) {
478                        imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
479                        imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
480                       
481                } else {
482                        imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
483                }
484        }
485       
486        function fill_box($im, $x, $y, $w, $h, $color1, $color2, $text = '', $placeindex = '')
487        {
488                global $col_black;
489                $x1 = $x + $w - 1;
490                $y1 = $y + $h - 1;
491               
492                imagerectangle($im, $x, $y1, $x1 + 1, $y + 1, $col_black);
493                if ($y1 > $y)
494                        imagefilledrectangle($im, $x, $y, $x1, $y1, $color2);
495                else
496                        imagefilledrectangle($im, $x, $y1, $x1, $y, $color2);
497                imagerectangle($im, $x, $y1, $x1, $y, $color1);
498                if ($text) {
499                        if ($placeindex > 0) {
500                               
501                                if ($placeindex < 16) {
502                                        $px = 5;
503                                        $py = $placeindex * 12 + 6;
504                                        imagefilledrectangle($im, $px + 90, $py + 3, $px + 90 - 4, $py - 3, $color2);
505                                        imageline($im, $x, $y + $h / 2, $px + 90, $py, $color2);
506                                        imagestring($im, 2, $px, $py - 6, $text, $color1);
507                                       
508                                } else {
509                                        if ($placeindex < 31) {
510                                                $px = $x + 40 * 2;
511                                                $py = ($placeindex - 15) * 12 + 6;
512                                        } else {
513                                                $px = $x + 40 * 2 + 100 * intval(($placeindex - 15) / 15);
514                                                $py = ($placeindex % 15) * 12 + 6;
515                                        }
516                                        imagefilledrectangle($im, $px, $py + 3, $px - 4, $py - 3, $color2);
517                                        imageline($im, $x + $w, $y + $h / 2, $px, $py, $color2);
518                                        imagestring($im, 2, $px + 2, $py - 6, $text, $color1);
519                                }
520                        } else {
521                                imagestring($im, 4, $x + 5, $y1 - 16, $text, $color1);
522                        }
523                }
524        }
525       
526       
527        $size = GRAPH_SIZE / 3; // image size
528        if ($MYREQUEST['IMG'] == 3)
529                $image = imagecreate(3 * $size + 200, 2 * $size + 150);
530        else
531                $image = imagecreate($size + 50, $size + 10);
532       
533        $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
534        $col_red   = imagecolorallocate($image, 0xD0, 0x60, 0x30);
535        $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60);
536        $col_black = imagecolorallocate($image, 0, 0, 0);
537        imagecolortransparent($image, $col_white);
538       
539        switch ($MYREQUEST['IMG']) {
540               
541                case 1:
542                        $s    = $mem['num_seg'] * $mem['seg_size'];
543                        $a    = $mem['avail_mem'];
544                        $x    = $y = $size / 2;
545                        $fuzz = 0.000001;
546                       
547                        // This block of code creates the pie chart.  It is a lot more complex than you
548                        // would expect because we try to visualize any memory fragmentation as well.
549                        $angle_from       = 0;
550                        $string_placement = array();
551                        for ($i = 0; $i < $mem['num_seg']; $i++) {
552                                $ptr  = 0;
553                                $free = $mem['block_lists'][$i];
554                                uasort($free, 'block_sort');
555                                foreach ($free as $block) {
556                                        if ($block['offset'] != $ptr) { // Used block
557                                                $angle_to = $angle_from + ($block['offset'] - $ptr) / $s;
558                                                if (($angle_to + $fuzz) > 1)
559                                                        $angle_to = 1;
560                                                if (($angle_to * 360) - ($angle_from * 360) >= 1) {
561                                                        fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
562                                                        if (($angle_to - $angle_from) > 0.05) {
563                                                                array_push($string_placement, array(
564                                                                        $angle_from,
565                                                                        $angle_to
566                                                                ));
567                                                        }
568                                                }
569                                                $angle_from = $angle_to;
570                                        }
571                                        $angle_to = $angle_from + ($block['size']) / $s;
572                                        if (($angle_to + $fuzz) > 1)
573                                                $angle_to = 1;
574                                        if (($angle_to * 360) - ($angle_from * 360) >= 1) {
575                                                fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_green);
576                                                if (($angle_to - $angle_from) > 0.05) {
577                                                        array_push($string_placement, array(
578                                                                $angle_from,
579                                                                $angle_to
580                                                        ));
581                                                }
582                                        }
583                                        $angle_from = $angle_to;
584                                        $ptr        = $block['offset'] + $block['size'];
585                                }
586                                if ($ptr < $mem['seg_size']) { // memory at the end
587                                        $angle_to = $angle_from + ($mem['seg_size'] - $ptr) / $s;
588                                        if (($angle_to + $fuzz) > 1)
589                                                $angle_to = 1;
590                                        fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
591                                        if (($angle_to - $angle_from) > 0.05) {
592                                                array_push($string_placement, array(
593                                                        $angle_from,
594                                                        $angle_to
595                                                ));
596                                        }
597                                }
598                        }
599                        foreach ($string_placement as $angle) {
600                                text_arc($image, $x, $y, $size, $angle[0] * 360, $angle[1] * 360, $col_black, bsize($s * ($angle[1] - $angle[0])));
601                        }
602                        break;
603               
604                case 2:
605                        $s = $cache['num_hits'] + $cache['num_misses'];
606                        $a = $cache['num_hits'];
607                       
608                        fill_box($image, 30, $size, 50, $s ? (-$a * ($size - 21) / $s) : 0, $col_black, $col_green, sprintf("%.1f%%", $s ? $cache['num_hits'] * 100 / $s : 0));
609                        fill_box($image, 130, $size, 50, $s ? -max(4, ($s - $a) * ($size - 21) / $s) : 0, $col_black, $col_red, sprintf("%.1f%%", $s ? $cache['num_misses'] * 100 / $s : 0));
610                        break;
611               
612                case 3:
613                        $s = $mem['num_seg'] * $mem['seg_size'];
614                        $a = $mem['avail_mem'];
615                        $x = 130;
616                        $y = 1;
617                        $j = 1;
618                       
619                        // This block of code creates the bar chart.  It is a lot more complex than you
620                        // would expect because we try to visualize any memory fragmentation as well.
621                        for ($i = 0; $i < $mem['num_seg']; $i++) {
622                                $ptr  = 0;
623                                $free = $mem['block_lists'][$i];
624                                uasort($free, 'block_sort');
625                                foreach ($free as $block) {
626                                        if ($block['offset'] != $ptr) { // Used block
627                                                $h = (GRAPH_SIZE - 5) * ($block['offset'] - $ptr) / $s;
628                                                if ($h > 0) {
629                                                        $j++;
630                                                        if ($j < 75)
631                                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red, bsize($block['offset'] - $ptr), $j);
632                                                        else
633                                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red);
634                                                }
635                                                $y += $h;
636                                        }
637                                        $h = (GRAPH_SIZE - 5) * ($block['size']) / $s;
638                                        if ($h > 0) {
639                                                $j++;
640                                                if ($j < 75)
641                                                        fill_box($image, $x, $y, 50, $h, $col_black, $col_green, bsize($block['size']), $j);
642                                                else
643                                                        fill_box($image, $x, $y, 50, $h, $col_black, $col_green);
644                                        }
645                                        $y += $h;
646                                        $ptr = $block['offset'] + $block['size'];
647                                }
648                                if ($ptr < $mem['seg_size']) { // memory at the end
649                                        $h = (GRAPH_SIZE - 5) * ($mem['seg_size'] - $ptr) / $s;
650                                        if ($h > 0) {
651                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red, bsize($mem['seg_size'] - $ptr), $j++);
652                                        }
653                                }
654                        }
655                        break;
656               
657                case 4:
658                        $s = $cache['num_hits'] + $cache['num_misses'];
659                        $a = $cache['num_hits'];
660                       
661                        fill_box($image, 30, $size, 50, $s ? -$a * ($size - 21) / $s : 0, $col_black, $col_green, sprintf("%.1f%%", $s ? $cache['num_hits'] * 100 / $s : 0));
662                        fill_box($image, 130, $size, 50, $s ? -max(4, ($s - $a) * ($size - 21) / $s) : 0, $col_black, $col_red, sprintf("%.1f%%", $s ? $cache['num_misses'] * 100 / $s : 0));
663                        break;
664        }
665       
666        header("Content-type: image/png");
667        imagepng($image);
668        exit;
669}
670
671if (isset($MYREQUEST['SOURCE']) and $MYREQUEST['SOURCE']) {
672        echo "<pre>".substr($MYREQUEST['SOURCE'], 3)."</pre><hr><br>";
673        echo "<xmp>".file_get_contents ($MYREQUEST['SOURCE'])."</xmp>";
674        exit;
675}
676
677// pretty printer for byte values
678//
679function bsize($s)
680{
681        foreach (array(
682                '',
683                'K',
684                'M',
685                'G'
686        ) as $i => $k) {
687                if ($s < 1024)
688                        break;
689                $s /= 1024;
690        }
691        return sprintf("%5.1f %sBytes", $s, $k);
692}
693
694// sortable table header in "scripts for this host" view
695function sortheader($key, $name, $extra = '')
696{
697        global $MYREQUEST;
698        global $MY_SELF_WO_SORT; // fix apcu : il faut global ici aussi
699       
700        // fix apcu l'affichage des headers ne doit pas changer $MYREQUEST
701        $SORT = $MYREQUEST['SORT'];
702        if (!$SORT)
703                $SORT = 'D';
704        if ($MYREQUEST['S_KEY'] == $key)
705                $SORT = (($SORT == 'A') ? 'D' : 'A');
706        $url = "$MY_SELF_WO_SORT$extra&S_KEY=$key&SORT=$SORT";
707        return "<a class=sortable href='$url'>$name</a>";
708}
709
710// create menu entry
711function menu_entry($ob, $title)
712{
713        global $MYREQUEST;
714        global $MY_SELF; // fix apcu
715        if ($MYREQUEST['OB'] != $ob) {
716                return "<li><a href='" . parametre_url($MY_SELF, 'OB', $ob) . "'>$title</a></li>";
717        } else if (empty($MYREQUEST['SH'])) {
718                return "<li><span class=active>$title</span></li>";
719        } else {
720                return "<li><a class=\"child_active\" href='$MY_SELF'>$title</a></li>";
721        }
722}
723
724function put_login_link($s = "Login")
725{
726        global $MY_SELF, $MYREQUEST, $AUTHENTICATED;
727        // needs ADMIN_PASSWORD to be changed!
728        //
729        if (!USE_AUTHENTICATION) {
730                return;
731        } else if (ADMIN_PASSWORD == 'password') {
732                print <<<EOB
733                        <a href="#" onClick="javascript:alert('You need to set a password at the top of apc.php before this will work!');return false";>$s</a>
734EOB;
735        } else if ($AUTHENTICATED) {
736                print <<<EOB
737                        '{$_SERVER['PHP_AUTH_USER']}'&nbsp;logged&nbsp;in!
738EOB;
739        } else {
740                print <<<EOB
741                        <a href="$MY_SELF&LO=1">$s</a>
742EOB;
743        }
744}
745
746function block_sort($array1, $array2)
747{
748        if ($array1['offset'] > $array2['offset']) {
749                return 1;
750        } else {
751                return -1;
752        }
753}
754
755
756?>
757<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
758<html>
759<head><title>APCu INFO <?php
760echo $host;
761?></title>
762<style><!--
763body { background:white; font-size:100.01%; margin:0; padding:0; }
764body,p,td,th,input,submit { font-size:0.8em;font-family:arial,helvetica,sans-serif; }
765* html body   {font-size:0.8em}
766* html p      {font-size:0.8em}
767* html td     {font-size:0.8em}
768* html th     {font-size:0.8em}
769* html input  {font-size:0.8em}
770* html submit {font-size:0.8em}
771td { vertical-align:top }
772a { color:black; font-weight:none; text-decoration:none; }
773a:hover { text-decoration:underline; }
774div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; }
775
776
777div.head div.login {
778        position:absolute;
779        right: 1em;
780        top: 1.2em;
781        color:white;
782        width:6em;
783        }
784div.head div.login a {
785        position:absolute;
786        right: 0em;
787        background:rgb(119,123,180);
788        border:solid rgb(102,102,153) 2px;
789        color:white;
790        font-weight:bold;
791        padding:0.1em 0.5em 0.1em 0.5em;
792        text-decoration:none;
793        }
794div.head div.login a:hover {
795        background:rgb(193,193,244);
796        }
797
798h1.apc { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; }
799* html h1.apc { margin-bottom:-7px; }
800h1.apc a:hover { text-decoration:none; color:rgb(90,90,90); }
801h1.apc div.logo {display: inline}
802h1.apc div.logo span.logo {
803        background:rgb(119,123,180);
804        color:black;
805        border-right: solid black 1px;
806        border-bottom: solid black 1px;
807        font-style:italic;
808        font-size:1em;
809        padding-left:1.2em;
810        padding-right:1.2em;
811        text-align:right;
812        }
813h1.apc div.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; }
814h1.apc div.nameinfo { color:white; display:inline; font-size:0.6em; margin-left: 1em; }
815h1.apc div.nameinfo a { color:white; margin-left: 3em; }
816h1.apc div.nameinfo img {margin-bottom: -10px; margin-right : 1em;}
817h1.apc div.copy { color:black; font-size:0.4em; position:absolute; right:1em; }
818hr.apc { display: none; }
819
820ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;}
821ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%}
822ol.menu a {
823        background:rgb(153,153,204);
824        border:solid rgb(102,102,153) 2px;
825        color:white;
826        font-weight:bold;
827        margin-right:0em;
828        padding:0.1em 0.5em 0.1em 0.5em;
829        text-decoration:none;
830        margin-left: 5px;
831        }
832ol.menu a.child_active {
833        background:rgb(153,153,204);
834        border:solid rgb(102,102,153) 2px;
835        color:white;
836        font-weight:bold;
837        margin-right:0em;
838        padding:0.1em 0.5em 0.1em 0.5em;
839        text-decoration:none;
840        border-left: solid black 5px;
841        margin-left: 0px;
842        }
843ol.menu span.active {
844        background:rgb(153,153,204);
845        border:solid rgb(102,102,153) 2px;
846        color:black;
847        font-weight:bold;
848        margin-right:0em;
849        padding:0.1em 0.5em 0.1em 0.5em;
850        text-decoration:none;
851        border-left: solid black 5px;
852        }
853ol.menu span.inactive {
854        background:rgb(193,193,244);
855        border:solid rgb(182,182,233) 2px;
856        color:white;
857        font-weight:bold;
858        margin-right:0em;
859        padding:0.1em 0.5em 0.1em 0.5em;
860        text-decoration:none;
861        margin-left: 5px;
862        }
863ol.menu a:hover {
864        background:rgb(193,193,244);
865        text-decoration:none;
866        }
867
868
869div.info {
870        background:rgb(204,204,204);
871        border:solid rgb(204,204,204) 1px;
872        margin-bottom:1em;
873        }
874div.info h2 {
875        background:rgb(204,204,204);
876        color:black;
877        font-size:1em;
878        margin:0;
879        padding:0.1em 1em 0.1em 1em;
880        }
881div.info table {
882        border:solid rgb(204,204,204) 1px;
883        border-spacing:0;
884        width:100%;
885        }
886div.info table th {
887        background:rgb(204,204,204);
888        color:white;
889        margin:0;
890        padding:0.1em 1em 0.1em 1em;
891        }
892div.info table th a.sortable { color:black; }
893div.info table tr.tr-0 { background:rgb(238,238,238); }
894div.info table tr.tr-1 { background:rgb(221,221,221); }
895div.info table td { padding:0.3em 1em 0.3em 1em; }
896div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; }
897div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; }
898div.info table td h3 {
899        color:black;
900        font-size:1.1em;
901        margin-left:-0.3em;
902        }
903
904div.graph { margin-bottom:1em }
905div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; }
906div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; }
907div.graph table td.td-0 { background:rgb(238,238,238); }
908div.graph table td.td-1 { background:rgb(221,221,221); }
909div.graph table td { padding:0.2em 1em 0.4em 1em; }
910
911div.div1,div.div2 { margin-bottom:1em; width:35em; }
912div.div3 { position:absolute; left:40em; top:1em; width:580px; }
913//div.div3 { position:absolute; left:37em; top:1em; right:1em; }
914
915div.sorting { margin:1.5em 0em 1.5em 2em }
916.center { text-align:center }
917.aright { float: right; }
918.right { text-align:right }
919.ok { color:rgb(0,200,0); font-weight:bold}
920.failed { color:rgb(200,0,0); font-weight:bold}
921
922span.box {
923        border: black solid 1px;
924        border-right:solid black 2px;
925        border-bottom:solid black 2px;
926        padding:0 0.5em 0 0.5em;
927        margin-right:1em;
928}
929span.green { background:#60F060; padding:0 0.5em 0 0.5em}
930span.red { background:#D06030; padding:0 0.5em 0 0.5em }
931
932div.authneeded {
933        background:rgb(238,238,238);
934        border:solid rgb(204,204,204) 1px;
935        color:rgb(200,0,0);
936        font-size:1.2em;
937        font-weight:bold;
938        padding:2em;
939        text-align:center;
940        }
941
942input {
943        background:rgb(153,153,204);
944        border:solid rgb(102,102,153) 2px;
945        color:white;
946        font-weight:bold;
947        margin-right:1em;
948        padding:0.1em 0.5em 0.1em 0.5em;
949        }
950
951/* xray styles */
952xmp { display: inline }
953.menuzoom {
954        border :  1px solid grey;
955        border-radius: 3px;
956        padding : 0px 5px 0px 5px;
957}
958
959//-->
960</style>
961</head>
962<body>
963<div class="head">
964        <h1 class="apc">
965                <div class="logo"><span class="logo"><a href="http://pecl.php.net/package/APCu">APCu</a></span></div>
966                <div class="nameinfo" style="display: inline">
967                        User Cache
968                        <a href='https://contrib.spip.net/4946'>
969                        <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAEwAAABMBDsgnAwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARiSURBVFiFxVdNSBtbFP5m8pqpRmw2EhAU/6JtQAStG5VEiC5cCkLBhcQuXIi2i0ppSZ+laGmxghJFwU1cZCe6cFFXKlYENybSQqMENa1SGLUEQ6iZ5CXfW/S9YEwm0YLtgUuY852f7557z5mJIAjCmSiKIgABPyXplyTS6a9rp4YLABLInxDxtyQRRQwMDKCioiItzpteDoeDiqKwpKQkHY74TSavra0lSb569UrNJjMBm83Guro6VVyj0fDt27fUarVp8cnJSX779o2SJKXF/8p0dgCg0+mwtLSEhoYGaLVa1NXVQa/Xw+12w+Px4N27d+jo6MCLFy/S+peXl2NzcxOKoqjmyFiBwsJCqkksFiNJjo2Nqfp//vyZQ0NDqrgoCAIySWtrKwDgx48fF3sZABAOhwEA9+/fV/XPz89HQUGBKp61De/duwcAePjwISorK7G7uwtFUdDU1ASLxQIAKC0tVfX3+Xyq7QcAEAQh4xHcvXuXiqLw69evXFtb4/n5OePxOBcXF/np0yeS5JMnT1T9p6eneXBwoN4p2QgA4PDwsOo9WF9fpyiKqr6PHj1iLBbj7du3VQnELipycnJSjCRJYktLC3t6eri/v0+SHB8fp81mY2FhYYr9xRj19fUkSYvFkp2ATqej3+9nW1sbATA/P58GgyFpbWxskCStVmsKJggCAdDr9bKrq+vnLRdFBgIBvnz5MjsBg8FAknz8+DGLiop4dnamWvp08vz5cwIgSb558yaRZGFhgaurq9cbRIeHh+ju7kZ9fX2SvrOzE8XFxXA6nZBlOaEPBAJwOp1pYy0vL2N0dBSSJKUOJFEU01YAAO12+5V3v7e3lxjHlytQVVVFkjSbzdcbxVNTUzg6OkJZWRm0Wq1qBQ4PD+F2uxGJRNLG2d3dxdHREZqbm/Hhw4erVwAArVZr1t3Pz88n7epyBQBwdnaWKysrmSsQDAaxvb0Nj8eT0K2srKC9vR2SJAEABgcHYTKZ8OzZM/j9fgDA5uZmyo53dnaSdMvLy5iZmUm9B6Io/nORUaahAoCrq6skyZqaGlWbvLy8FJ3JZCJJlpeXJ2OXCVxeBoOB79+/pyzL/P79O6PRKEkyGAwyEAjw4OCAnZ2dGUkDYFNTE0mmDq5sBPr6+rLegY8fP1Kv17O3t5d37txJG+fBgweMRCLMzc29HgGj0UhZllWTx+Nx9vf3U6fTcW9vjycnJ+zv7+etW7cSMfR6Pb1eLxcXF1NzaDSajAT+vxfhcJgTExOJsVtdXU2S7OvrS3pnPH36lMFgkF++fKHD4eDr16/p8Xjo9/tpNBpTY+MKEo/HQRKhUAiyLEOWZRwfHwMAotFowk5RFIyMjMBoNMLlcqG6uhpmsxlbW1tobGyEz+dLiZ31m/BXRJZl2O32K9n+lj8mmUQjiuLfZPajCIfDmJubw+npKYCf34iCIMDlciEUCv0yAUGj0URjsdiNHMVV5I8fgQDgHID03/PFFvktz/8C/6xwoasnBYAAAAAASUVORK5CYII=' >
970                        XRay pour SPIP
971                        </a>
972                </div>
973                </a>
974        </h1>
975        <div class="login">
976        <?php
977put_login_link();
978?>
979        </div>
980        <hr class="apc">
981</div>
982
983<?php
984// Display main Menu
985echo <<<EOB
986        <ol class=menu>
987        <li><a href="$MY_SELF&SH={$MYREQUEST['SH']}">Refresh Data</a></li>
988EOB;
989echo menu_entry(OB_HOST_STATS, 'View Host Stats'), menu_entry(OB_USER_CACHE, 'User Cache Entries'), menu_entry(OB_VERSION_CHECK, 'Version Check');
990
991if (plugin_est_actif('cachelab'))
992        echo menu_entry(OB_CACHELAB, 'CacheLab');
993
994if ($AUTHENTICATED) {
995        echo <<<EOB
996                <li><a class="aright" href="$MY_SELF&CC=1" onClick="javascript:return confirm('Are you sure?');"
997                        title="Vider le cache APC user">Vider APC</a></li>
998                <li><a class="aright" href="$MY_SELF&PP=1"
999                                onClick="javascript:return confirm('Êtes-vous certain de vouloir vider le cache APC user et le dossier skel/ des squelettes compilés ?');"
1000                                title="Vider le cache APC user ET effacer les caches de compilation des squelettes ?">
1001                                Purger SPIP</a></li>
1002               
1003EOB;
1004}
1005echo <<<EOB
1006        </ol>
1007EOB;
1008
1009
1010// CONTENT
1011echo <<<EOB
1012        <div class=content>
1013EOB;
1014
1015// MAIN SWITCH STATEMENT
1016
1017switch ($MYREQUEST['OB']) {
1018        // -----------------------------------------------
1019        // Host Stats
1020        // -----------------------------------------------
1021        case OB_HOST_STATS:
1022                $mem_size         = $mem['num_seg'] * $mem['seg_size'];
1023                $mem_avail        = $mem['avail_mem'];
1024                $mem_used         = $mem_size - $mem_avail;
1025                $seg_size         = bsize($mem['seg_size']);
1026                $req_rate_user    = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits'] + $cache['num_misses']) / ($time - $cache['start_time'])) : 0);
1027                $hit_rate_user    = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits']) / ($time - $cache['start_time'])) : 0);
1028                $miss_rate_user   = sprintf("%.2f", $cache['num_misses'] ? (($cache['num_misses']) / ($time - $cache['start_time'])) : 0);
1029                $insert_rate_user = sprintf("%.2f", $cache['num_inserts'] ? (($cache['num_inserts']) / ($time - $cache['start_time'])) : 0);
1030                $apcversion       = phpversion('apcu');
1031                $phpversion       = phpversion();
1032                $number_vars      = $cache['num_entries'];
1033                $size_vars        = bsize($cache['mem_size']);
1034                $i                = 0;
1035                $_namespace       = _CACHE_NAMESPACE;
1036
1037                $meta_derniere_modif = lire_meta('derniere_modif');
1038
1039                echo "<div class='info div1'><h2>Mémoization SPIP - Le ".date(JOLI_DATE_FORMAT,time())."</h2>
1040                        <table cellspacing=0><tbody>
1041                        <tr class=tr-0><td class=td-0>_CACHE_NAMESPACE</td><td>"._CACHE_NAMESPACE."</td></tr>
1042                        <tr class=tr-0><td class=td-0 title='meta SPIP : derniere_modif'>Dernière invalidation</td><td>".date(JOLI_DATE_FORMAT, $meta_derniere_modif)."</td></tr>
1043                        <tr class=tr-0><td class=td-0 title='meta spip'>Invalidation de '".XRAY_OBJET_SPECIAL."'</td><td>".date(JOLI_DATE_FORMAT, lire_meta('derniere_modif_'.XRAY_OBJET_SPECIAL))."</td></tr>
1044                        <tr class=tr-0><td class=td-0 title='meta SPIP : cache_mark'>Dernière purge</td><td>".date(JOLI_DATE_FORMAT, $GLOBALS['meta']['cache_mark'])."</td></tr> ";
1045
1046                $stats = xray_stats($cache);
1047                echo xray_stats_print($stats, 'generaux', 'Valides '.XRAY_LABEL_STATS_SPECIALES_EXCLUES);
1048                echo xray_stats_print($stats, 'speciaux', '+ Valides '.XRAY_LABEL_STATS_SPECIALES);
1049                echo xray_stats_print($stats, 'invalides', '+ Invalidés par SPIP');
1050                echo xray_stats_print($stats, 'existent', '= Total caches APC OK');
1051                echo xray_stats_print($stats, 'fantomes', '+ Caches périmés par APC');
1052                $nb_cache = count($cache['cache_list']);
1053                echo "<tr class=tr-0>
1054                        <td class=td-0><b>= Nb total caches APC</b></td><td>$nb_cache</td>
1055                        </tr>";
1056
1057                echo "</table></div>";
1058
1059                echo <<< EOB
1060                <div class="info div1"><h2>General Cache Information</h2>
1061                <table cellspacing=0><tbody>
1062                <tr class=tr-0><td class=td-0>APCu Version</td><td>$apcversion</td></tr>
1063                <tr class=tr-1><td class=td-0>PHP Version</td><td>$phpversion</td></tr>
1064EOB;
1065
1066                if (!empty($_SERVER['SERVER_NAME']))
1067                        echo "<tr class=tr-0><td class=td-0>APCu Host</td><td>{$_SERVER['SERVER_NAME']} $host</td></tr>\n";
1068                if (!empty($_SERVER['SERVER_SOFTWARE']))
1069                        echo "<tr class=tr-1><td class=td-0>Server Software</td><td>{$_SERVER['SERVER_SOFTWARE']}</td></tr>\n";
1070               
1071                echo <<<EOB
1072                <tr class=tr-0><td class=td-0>Shared Memory</td><td>{$mem['num_seg']} Segment(s) with $seg_size
1073    <br/> ({$cache['memory_type']} memory)
1074    </td></tr>
1075EOB;
1076                echo '<tr class=tr-1><td class=td-0>Start Time</td><td>', date(DATE_FORMAT, $cache['start_time']), '</td></tr>';
1077                echo '<tr class=tr-0><td class=td-0>Uptime</td><td>', duration($cache['start_time']), '</td></tr>';
1078                echo <<<EOB
1079                </tbody></table>
1080                </div>
1081
1082                <div class="info div1"><h2>Cache Information</h2>
1083                <table cellspacing=0>
1084                <tbody>
1085                <tr class=tr-0><td class=td-0>Cached Variables</td><td>$number_vars ($size_vars)</td></tr>
1086                        <tr class=tr-1><td class=td-0>Hits</td><td>{$cache['num_hits']}</td></tr>
1087                        <tr class=tr-0><td class=td-0>Misses</td><td>{$cache['num_misses']}</td></tr>
1088                        <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate_user cache requests/second</td></tr>
1089                        <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate_user cache requests/second</td></tr>
1090                        <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate_user cache requests/second</td></tr>
1091                        <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate_user cache requests/second</td></tr>
1092                        <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache['expunges']}</td></tr>
1093                </tbody>
1094                </table>
1095                </div>
1096
1097                <div class="info div2"><h2>Runtime Settings</h2><table cellspacing=0><tbody>
1098EOB;
1099               
1100                $j = 0;
1101                foreach (ini_get_all('apcu') as $k => $v) {
1102                        echo "<tr class=tr-$j><td class=td-0>", $k, "</td><td>", str_replace(',', ',<br />', $v['local_value']), "</td></tr>\n";
1103                        $j = 1 - $j;
1104                }
1105               
1106                if ($mem['num_seg'] > 1 || $mem['num_seg'] == 1 && count($mem['block_lists'][0]) > 1)
1107                        $mem_note = "Memory Usage<br /><font size=-2>(multiple slices indicate fragments)</font>";
1108                else
1109                        $mem_note = "Memory Usage";
1110               
1111                echo <<< EOB
1112                </tbody></table>
1113                </div>
1114
1115                <div class="graph div3"><h2>Host Status Diagrams</h2>
1116                <table cellspacing=0><tbody>
1117EOB;
1118                $size = 'width=' . (GRAPH_SIZE * 2 / 3) . ' height=' . (GRAPH_SIZE / 2);
1119                echo <<<EOB
1120                <tr>
1121                <td class=td-0>$mem_note</td>
1122                <td class=td-1>Hits &amp; Misses</td>
1123                </tr>
1124EOB;
1125               
1126                echo graphics_avail() ? '<tr>' . "<td class=td-0><img alt='' $size src='{$IMG_BASE}&IMG=1&$time'></td>" . "<td class=td-1><img alt='' $size src='{$IMG_BASE}&IMG=2&$time'></td></tr>\n" : "", '<tr>', '<td class=td-0><span class="green box">&nbsp;</span>Free: ', bsize($mem_avail) . sprintf(" (%.1f%%)", $mem_avail * 100 / $mem_size), "</td>\n", '<td class=td-1><span class="green box">&nbsp;</span>Hits: ', $cache['num_hits'] . @sprintf(" (%.1f%%)", $cache['num_hits'] * 100 / ($cache['num_hits'] + $cache['num_misses'])), "</td>\n", '</tr>', '<tr>', '<td class=td-0><span class="red box">&nbsp;</span>Used: ', bsize($mem_used) . sprintf(" (%.1f%%)", $mem_used * 100 / $mem_size), "</td>\n", '<td class=td-1><span class="red box">&nbsp;</span>Misses: ', $cache['num_misses'] . @sprintf(" (%.1f%%)", $cache['num_misses'] * 100 / ($cache['num_hits'] + $cache['num_misses'])), "</td>\n";
1127                echo <<< EOB
1128                </tr>
1129                </tbody></table>
1130
1131                <br/>
1132                <h2>Detailed Memory Usage and Fragmentation</h2>
1133                <table cellspacing=0><tbody>
1134                <tr>
1135                <td class=td-0 colspan=2><br/>
1136EOB;
1137               
1138                // Fragementation: (freeseg - 1) / total_seg
1139                $nseg = $freeseg = $fragsize = $freetotal = 0;
1140                for ($i = 0; $i < $mem['num_seg']; $i++) {
1141                        $ptr = 0;
1142                        foreach ($mem['block_lists'][$i] as $block) {
1143                                if ($block['offset'] != $ptr) {
1144                                        ++$nseg;
1145                                }
1146                                $ptr = $block['offset'] + $block['size'];
1147                                /* Only consider blocks <5M for the fragmentation % */
1148                                if ($block['size'] < (5 * 1024 * 1024))
1149                                        $fragsize += $block['size'];
1150                                $freetotal += $block['size'];
1151                        }
1152                        $freeseg += count($mem['block_lists'][$i]);
1153                }
1154               
1155                if ($freeseg > 1) {
1156                        $frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize / $freetotal) * 100, bsize($fragsize), bsize($freetotal), $freeseg);
1157                } else {
1158                        $frag = "0%";
1159                }
1160               
1161                if (graphics_avail()) {
1162                        $size = 'width=' . (2 * GRAPH_SIZE + 150) . ' height=' . (GRAPH_SIZE + 10);
1163                        echo <<<EOB
1164                        <img alt="" $size src="{$IMG_BASE}&IMG=3&$time">
1165EOB;
1166                }
1167                echo <<<EOB
1168                </br>Fragmentation: $frag
1169                </td>
1170                </tr>
1171EOB;
1172                if (isset($mem['adist'])) {
1173                        foreach ($mem['adist'] as $i => $v) {
1174                                $cur = pow(2, $i);
1175                                $nxt = pow(2, $i + 1) - 1;
1176                                if ($i == 0)
1177                                        $range = "1";
1178                                else
1179                                        $range = "$cur - $nxt";
1180                                echo "<tr><th align=right>$range</th><td align=right>$v</td></tr>\n";
1181                        }
1182                }
1183                echo <<<EOB
1184                </tbody></table>
1185                </div>
1186EOB;
1187               
1188                break;
1189
1190        // -----------------------------------------------
1191        // User Cache Entries
1192        // -----------------------------------------------
1193        case OB_USER_CACHE:
1194                if (!$AUTHENTICATED) {
1195                        echo '<div class="error">You need to login to see the user values here!<br/>&nbsp;<br/>';
1196                        put_login_link("Login now!");
1197                        echo '</div>';
1198                        break;
1199                }
1200                $fieldname    = 'info';
1201                $fieldheading = 'User Entry Label';
1202                $fieldkey     = 'info';
1203               
1204                $cols = 6;
1205                echo <<<EOB
1206                <div class=sorting><form><p>Scope:
1207                <input type=hidden name=OB value={$MYREQUEST['OB']}>
1208                <input type=hidden name=exec value={$MYREQUEST['exec']}>
1209                <select name=SCOPE  onChange="form.submit()">
1210EOB;
1211                echo '<option value=A', $MYREQUEST['SCOPE'] == 'A' ? ' selected' : '', '>Active</option>
1212                        <option value=D', $MYREQUEST['SCOPE'] == 'D' ? ' selected' : '', '>Deleted</option>
1213                </select>
1214                 Sorting:
1215                <select name=S_KEY  onChange="form.submit()">
1216                        <option value=H', $MYREQUEST['S_KEY'] == 'H' ? ' selected' : '', '>Hits</option>
1217                        <option value=Z', $MYREQUEST['S_KEY'] == 'Z' ? ' selected' : '', '>Size</option>
1218                        <option value=S', $MYREQUEST['S_KEY'] == 'S' ? ' selected' : '', '>$fieldheading</option>
1219                        <option value=A', $MYREQUEST['S_KEY'] == 'A' ? ' selected' : '', '>Last accessed</option>
1220                        <option value=C', $MYREQUEST['S_KEY'] == 'C' ? ' selected' : '', '>Created at</option>
1221                        <option value=D', $MYREQUEST['S_KEY'] == 'D' ? ' selected' : '', '>Deleted at</option>';
1222                if ($fieldname == 'info')
1223                        echo '<option value=D', $MYREQUEST['S_KEY'] == 'T' ? ' selected' : '', '>Timeout</option>';
1224               
1225                echo '</select>
1226                <select name=SORT  onChange="form.submit()">', 
1227                        '<option value=D', $MYREQUEST['SORT'] == 'D' ? ' selected' : '', '>DESC</option>', 
1228                        '<option value=A', $MYREQUEST['SORT'] == 'A' ? ' selected' : '', '>ASC</option>', 
1229                '</select>
1230                &nbsp;&nbsp;<b>HTML:</b>
1231                <select name=ZOOM  onChange="form.submit()">
1232                        <option value=TEXTECOURT', $MYREQUEST['ZOOM'] == 'TEXTECOURT' ? ' selected' : '', '>Courts</option>
1233                        <option value=TEXTELONG', $MYREQUEST['ZOOM'] == 'TEXTELONG' ? ' selected' : '', '>Entiers</option>
1234                </select>
1235                &nbsp;&nbsp;<b>Affichage extra:</b>
1236                <select name=EXTRA  onChange="form.submit()">
1237                        <option value="" ', $MYREQUEST['EXTRA'] == '' ? ' selected' : '', '></option>
1238                        <option value=CONTEXTE ', $MYREQUEST['EXTRA'] == 'CONTEXTE' ? ' selected' : '', '>Contexte</option>
1239                        <option value=CONTEXTES_SPECIAUX ', $MYREQUEST['EXTRA'] == 'CONTEXTES_SPECIAUX' ? ' selected' : '', '>Contextes spécifiques</option>
1240                        <option value=INFO_AUTEUR ', $MYREQUEST['EXTRA'] == 'INFO_AUTEUR' ? ' selected' : '', '>Infos auteur</option>
1241                        <option value=INFO_OBJET_SPECIAL ', $MYREQUEST['EXTRA'] == 'INFO_OBJET_SPECIAL' ? ' selected' : '', '>Infos '.XRAY_OBJET_SPECIAL.'</option>
1242                        <option value=INVALIDEURS ', $MYREQUEST['EXTRA'] == 'INVALIDEURS' ? ' selected' : '', '>Invalideurs</option>
1243                        <option value=INVALIDEURS_SPECIAUX ', $MYREQUEST['EXTRA'] == 'INVALIDEURS_SPECIAUX' ? ' selected' : '', '>Invalideurs spécifiques</option>
1244                        <option value=INCLUSIONS ', $MYREQUEST['EXTRA'] == 'INCLUSIONS' ? ' selected' : '', '>&lt;INCLURE&gt;</option>
1245                        <option value=MACROSESSIONS ', $MYREQUEST['EXTRA'] == 'MACROSESSIONS' ? ' selected' : '', '>#_SESSION</option>
1246                        <option value=MACROAUTORISER ', $MYREQUEST['EXTRA'] == 'MACROAUTORISER' ? ' selected' : '', '>#_AUTORISER_SI</option>
1247                </select>
1248                <p><b>Types cache:</b>
1249                <select name=TYPECACHE  onChange="form.submit()">
1250                        <option value=ALL', $MYREQUEST['TYPECACHE'] == 'ALL' ? ' selected' : '', '>Tous</option>
1251                        <option value=NON_SESSIONS', $MYREQUEST['TYPECACHE'] == 'NON_SESSIONS' ? ' selected' : '', '>Non sessionnés</option>
1252                        <option value=SESSIONS', $MYREQUEST['TYPECACHE'] == 'SESSIONS' ? ' selected' : '', '>Sessionnés</option>
1253                        <option value=SESSIONS_AUTH', $MYREQUEST['TYPECACHE'] == 'SESSIONS_AUTH' ? ' selected' : '', '>Sessionnés identifiés</option>
1254                        <option value=SESSIONS_NONAUTH', $MYREQUEST['TYPECACHE'] == 'SESSIONS_NONAUTH' ? ' selected' : '', '>Sessionnés non identifiés</option>
1255                        <option value=SESSIONS_TALON', $MYREQUEST['TYPECACHE'] == 'SESSIONS_TALON' ? ' selected' : '', '>Talons de session</option>
1256                        <option value=FORMULAIRES', $MYREQUEST['TYPECACHE'] == 'FORMULAIRES' ? ' selected' : '', '>Formulaires</option>
1257                </select>
1258                <select name=COUNT onChange="form.submit()">
1259                        <option value=10 ', $MYREQUEST['COUNT'] == '10' ? ' selected' : '', '>Top 10</option>
1260                        <option value=20 ', $MYREQUEST['COUNT'] == '20' ? ' selected' : '', '>Top 20</option>
1261                        <option value=50 ', $MYREQUEST['COUNT'] == '50' ? ' selected' : '', '>Top 50</option>
1262                        <option value=100', $MYREQUEST['COUNT'] == '100' ? ' selected' : '', '>Top 100</option>
1263                        <option value=150', $MYREQUEST['COUNT'] == '150' ? ' selected' : '', '>Top 150</option>
1264                        <option value=200', $MYREQUEST['COUNT'] == '200' ? ' selected' : '', '>Top 200</option>
1265                        <option value=500', $MYREQUEST['COUNT'] == '500' ? ' selected' : '', '>Top 500</option>
1266                        <option value=0  ', $MYREQUEST['COUNT'] == '0' ? ' selected' : '', '>All</option>
1267                </select>
1268                &nbsp;&nbsp;&nbsp;
1269                <span title="REGEXP">Chercher:</span> <input name=SEARCH value="', $MYREQUEST['SEARCH'], '" type=text size=25/>
1270                <b>Dans:</b>
1271                <select name=WHERE onChange="form.submit()">
1272                        <option value="" ', $MYREQUEST['WHERE'] == '' ? ' selected' : '', '>Noms des caches</option>
1273                        <option value="ALL" ', $MYREQUEST['WHERE'] == 'ALL' ? ' selected' : '', '>Tout le contenu</option>
1274                        <option value="HTML" ', $MYREQUEST['WHERE'] == 'HTML' ? ' selected' : '', '>HTML</option>
1275                        <option value="META" ', $MYREQUEST['WHERE'] == 'META' ? ' selected' : '', '>Métadonnées</option>
1276                </select>
1277                &nbsp;&nbsp;&nbsp;
1278                <input type=submit value="GO!">
1279                </p></form></div>';
1280               
1281                if (isset($MYREQUEST['SEARCH'])) {
1282                        // Don't use preg_quote because we want the user to be able to specify a
1283                        // regular expression subpattern.
1284                        // Detection of a potential preg error :
1285                        if (@preg_match('/' . antislash($MYREQUEST['SEARCH']) . '/i', null) === false) {
1286                                echo '<div class="error">Error: search expression is not a valid regexp (it needs escaping parentheses etc)</div>';
1287                                $MYREQUEST['SEARCH'] = preg_quote($MYREQUEST['SEARCH'],'/');
1288                                echo "<div class='warning'>
1289                                                Warning : search expression has been preg_quoted :
1290                                                        <xmp>{$MYREQUEST['SEARCH']}</xmp>
1291                                        </div>";
1292                        }
1293                        $MYREQUEST['SEARCH'] = '~'.$MYREQUEST['SEARCH'].'~i';
1294                }
1295                echo '<div class="info"><table cellspacing=0><tbody>', '<tr>', '<th>', sortheader('S', $fieldheading), '</th>', '<th>', sortheader('H', 'Hits'), '</th>', '<th>', sortheader('Z', 'Size'), '</th>', '<th>', sortheader('A', 'Last accessed'), '</th>', '<th>', sortheader('C', 'Created at'), '</th>';
1296               
1297                if ($fieldname == 'info') {
1298                        $cols += 2;
1299                        echo '<th>', sortheader('T', 'Timeout'), '</th>';
1300                }
1301                echo '<th>', sortheader('D', 'Deleted at'), '</th></tr>';
1302               
1303                // builds list with alpha numeric sortable keys
1304                //
1305                $list = array();
1306
1307                foreach ($cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) {
1308                        switch ($MYREQUEST['S_KEY']) {
1309                                case 'A':
1310                                        $k = sprintf('%015d-', $entry['access_time']);
1311                                        break;
1312                                case 'H':
1313                                        $k = sprintf('%015d-', $entry['num_hits']);
1314                                        break;
1315                                case 'Z':
1316                                        $k = sprintf('%015d-', $entry['mem_size']);
1317                                        break;
1318                                case 'C':
1319                                        $k = sprintf('%015d-', $entry['creation_time']);
1320                                        break;
1321                                case 'T':
1322                                        $k = sprintf('%015d-', $entry['ttl']);
1323                                        break;
1324                                case 'D':
1325                                        $k = sprintf('%015d-', $entry['deletion_time']);
1326                                        break;
1327                                case 'S':
1328                                        $k = $entry["info"];
1329                                        break;
1330                        }
1331                        if (!$AUTHENTICATED) {
1332                                // hide all path entries if not logged in
1333                                $list[$k . $entry[$fieldname]] = preg_replace('/^.*(\\/|\\\\)/', '*hidden*/', $entry);
1334                        } else {
1335                                $list[$k . $entry[$fieldname]] = $entry;
1336                        }
1337                }
1338               
1339                if ($list) {
1340                        // sort list
1341                        //
1342                        switch ($MYREQUEST['SORT']) {
1343                                case "A":
1344                                        ksort($list);
1345                                        break;
1346                                case "D":
1347                                        krsort($list);
1348                                        break;
1349                                default:
1350                                        echo "...ah ben non pas de tri.";
1351                                        break;
1352                        }
1353                       
1354                        $TYPECACHE = (isset($MYREQUEST['TYPECACHE']) ? $MYREQUEST['TYPECACHE'] : 'ALL');
1355                        $also_required='';
1356                        $also_required_bool = true;
1357                        switch ($TYPECACHE) {
1358                                case 'ALL':
1359                                        $pattern_typecache = '';
1360                                        break;
1361                                case 'NON_SESSIONS':
1362                                        $pattern_typecache = XRAY_PATTERN_NON_SESSION;
1363                                        $also_required = 'cache_est_talon';
1364                                        $also_required_bool = false;
1365                                        break;
1366                                case 'SESSIONS':
1367                                        $pattern_typecache = XRAY_PATTERN_SESSION;
1368                                        break;
1369                                case 'SESSIONS_AUTH':
1370                                        $pattern_typecache = XRAY_PATTERN_SESSION_AUTH;
1371                                        break;
1372                                case 'SESSIONS_NONAUTH':
1373                                        $pattern_typecache = XRAY_PATTERN_SESSION_ANON;
1374                                        break;
1375                                case 'SESSIONS_TALON':
1376                                        $pattern_typecache = XRAY_PATTERN_NON_SESSION;
1377                                        $also_required = 'cache_est_talon';
1378                                        break;
1379                                case 'FORMULAIRES':
1380                                        $pattern_typecache = '~formulaires/~i';
1381                                        break;
1382                        }
1383                       
1384                        // output list
1385                        $i = 0;
1386                        foreach ($list as $k => $entry) {
1387                                $data=$searched=null;
1388                                $data_success = false;
1389// plus de restrictions, on cherche toujours data
1390                                $searched = $data = get_apc_data($entry['info'], $data_success);
1391
1392                                if ($MYREQUEST['SEARCH'] and $MYREQUEST['WHERE']) {
1393                                        switch ($MYREQUEST['WHERE']) {
1394                                        case 'ALL' :
1395                                                break;
1396                                        case 'HTML' :
1397                                                if (is_array($searched)) // !textwheel {
1398                                                        $searched = $data['texte'];
1399                                                break;
1400                                        case 'META' :
1401                                                if (is_array($searched)) // !textwheel
1402                                                        unset($searched['texte']);
1403                                                break;
1404                                        default :
1405                                                die("Mauvaise valeur pour where : " . $MYREQUEST['WHERE']);
1406                                        }
1407                                };
1408
1409                                if ((!$pattern_typecache or preg_match($pattern_typecache, $entry[$fieldname]))
1410                                        and (!$MYREQUEST['SEARCH']
1411                                                or (!$MYREQUEST['WHERE']
1412                                                        and preg_match($MYREQUEST['SEARCH'], $entry[$fieldname]))
1413                                                or ($MYREQUEST['WHERE']
1414                                                        and preg_match($MYREQUEST['SEARCH'].'m', print_r($searched,1))))
1415                                        and (!$also_required 
1416                                                or ($also_required($entry[$fieldname], $data)== $also_required_bool))) {
1417                                        $sh = md5($entry["info"]);
1418                                       
1419                                        $displayed_name = htmlentities(strip_tags($entry[$fieldname], ''), ENT_QUOTES, 'UTF-8');
1420                                        if (defined('XRAY_NEPASAFFICHER_DEBUTNOMCACHE'))
1421                                                $displayed_name = str_replace(XRAY_NEPASAFFICHER_DEBUTNOMCACHE, '', $displayed_name);
1422                                        echo '<tr id="key-' . $sh . '" class=tr-', $i % 2, '>', 
1423                                                        "<td class='td-0' style='position: relative'>
1424                                                                <a href='$MY_SELF&SH={$sh}#key-{$sh}'>
1425                                                                        $displayed_name
1426                                                                </a>";
1427
1428                                        if ($data and cache_est_talon($entry[$fieldname], $data))
1429                                                echo "<span style='margin-left:2em' title='Talon des caches sessionnés avec ce squelette et le même contexte'>[talon]</span>";
1430                                       
1431                                        $boutons_liens = '';
1432                                        if ($p = preg_match(XRAY_PATTERN_SESSION_AUTH, $displayed_name, $match) 
1433                                                and $MYREQUEST['SEARCH'] != "/{$match[1]}/i") {
1434                                                $url_session = parametre_url($MY_SELF, 'SEARCH', $match[1]);
1435                                                $boutons_liens .= "<a href='$url_session' title='Caches sessionnés pour le même internaute'>[session]</a>";
1436                                        }
1437                                        if (is_array($data)
1438                                                and isset($data['invalideurs']['session'])) {
1439                                                $p = preg_match(XRAY_PATTERN_TALON, $displayed_name, $match);
1440                                                $url_mm_talon = '';
1441                                                $bouton_mm_talon='[mm talon]';
1442                                                if ($p and $match[1] and ($MYREQUEST['SEARCH']!=$match[1])) {
1443                                                        $url_mm_talon = parametre_url($MY_SELF, 'TYPECACHE', 'ALL');
1444                                                        $url_mm_talon = parametre_url($url_mm_talon, 'SEARCH', $match[1]);
1445                                                }
1446                                                else 
1447                                                        $bouton_mm_talon='(! Err get talon !)';
1448                                                $boutons_liens .= "<a href='$url_mm_talon' title='Caches du même squelette et avec le même contexte'>$bouton_mm_talon</a>";
1449                                        }
1450                                        echo '<span style="float: right">'.$boutons_liens.'</span>';
1451
1452                                       
1453                                        if ($MYREQUEST['EXTRA'] and ($sh != $MYREQUEST["SH"]) // sinon yaura un zoom après et c'est inutile de répéter ici
1454                                                and $data_success) {
1455                                                $extra = null;
1456                                                $liens = '';
1457                                                if (is_array($data)) {
1458                                                        switch ($MYREQUEST['EXTRA']) {
1459                                                        case 'CONTEXTE':
1460                                                                if (isset($data['contexte']))
1461                                                                        $extra = $data['contexte'];
1462                                                                else
1463                                                                        $extra = '(non défini)';
1464                                                                break;
1465                                                        case 'CONTEXTES_SPECIAUX':
1466                                                                if (isset($data['contexte'])) {
1467                                                                        $extra = $data['contexte'];
1468                                                                        foreach (array(
1469                                                                                'lang',
1470                                                                                'date',
1471                                                                                'date_default',
1472                                                                                'date_redac',
1473                                                                                'date_redac_default'
1474                                                                        ) as $ki)
1475                                                                                unset($extra[$ki]);
1476                                                                } else
1477                                                                        $extra = '(non défini)';
1478                                                                break;
1479                                                        case 'INFO_AUTEUR':
1480                                                                if (isset($data['contexte'])) {
1481                                                                        foreach (array(
1482                                                                                'id_auteur',
1483                                                                                'email',
1484                                                                                'nom',
1485                                                                                'statut',
1486                                                                                'login'
1487                                                                        ) as $ki)
1488                                                                                if (isset($data['contexte'][$ki]))
1489                                                                                        $extra[$ki] = $extra[$ki] = $data['contexte'][$ki];
1490                                                                };
1491                                                                break;
1492                                                        case 'INFO_OBJET_SPECIAL':
1493                                                                if (isset($data['contexte'])) {
1494                                                                        $ki = 'id_'.XRAY_OBJET_SPECIAL;
1495                                                                        if (isset($data['contexte'][$ki]))
1496                                                                                $extra[$ki] = $extra[$ki] = $data['contexte'][$ki];
1497                                                                };
1498                                                                break;
1499                                                        case 'INVALIDEURS':
1500                                                                if (isset ($data['invalideurs']))
1501                                                                        $extra = $data['invalideurs'];
1502                                                                break;
1503                                                        case 'INVALIDEURS_SPECIAUX': 
1504                                                                if (isset ($data['invalideurs'])) {
1505                                                                        $extra = $data['invalideurs'];
1506                                                                        foreach (array(
1507                                                                                'cache',
1508                                                                                'session'
1509                                                                        ) as $ki)
1510                                                                                unset($extra[$ki]);
1511                                                                }
1512                                                                break;
1513                                                        case 'INCLUSIONS' :
1514                                                                if (!isset ($data['texte']))
1515                                                                        $extra = '(html non défini)';
1516                                                                elseif (preg_match_all("/<\?php\s+echo\s+recuperer_fond\s*\(\s*'([a-z0-9_\-\.\/]+)'/", $data['texte'], $matches))
1517                                                                        $extra = $matches[1];
1518                                                                else
1519                                                                        $extra = '(aucune <INCLUSION>)';
1520                                                                break;
1521                                                        case 'MACROSESSIONS' :
1522                                                                if (!isset ($data['texte']))
1523                                                                        $extra = '(html non défini)';
1524                                                                elseif (preg_match_all("/\bpipelined_session_get\s*\((['\"a-z0-9\s_\-\.\/,]+)\)/", $data['texte'], $matches))
1525                                                                        $extra = $matches[1];
1526                                                                else
1527                                                                        $extra = '(aucune balise #_SESSION ou #_SESSION_SI)';
1528                                                                break;
1529                                                        case 'MACROAUTORISER' :
1530                                                                if (!isset ($data['texte']))
1531                                                                        $extra = '(html non défini)';
1532                                                                elseif (preg_match_all("/if\s+\(autoriser\s*\((.+)\)\s*\)\s*{\s*\?>/", $data['texte'], $matches))
1533                                                                        $extra = $matches[1];
1534                                                                        // $extra = $matches;
1535                                                                else
1536                                                                        $extra = '(aucune balise #_AUTORISER_SI)';
1537                                                                break;
1538                                                        }
1539                                                }
1540                                                if ($extra = print_contexte($extra, 1))
1541                                                        echo "<br><xmp>$extra</xmp>";
1542                                                if ($liens)     // inutilisé désormais en fait
1543                                                        echo "<small style='float:right'>$liens</small>";
1544                                        }
1545                                        echo '</td>
1546                                        <td class="td-n center">', $entry['num_hits'], '</td>
1547                                        <td class="td-n right">', $entry['mem_size'], '</td>
1548                                        <td class="td-n center">', date(DATE_FORMAT, $entry['access_time']), '</td>
1549                                        <td class="td-n center">', date(DATE_FORMAT, $entry['creation_time']), '</td>';
1550                                       
1551                                        if ($fieldname == 'info') {
1552                                                if ($entry['ttl'])
1553                                                        echo '<td class="td-n center">' . $entry['ttl'] . ' seconds</td>';
1554                                                else
1555                                                        echo '<td class="td-n center">None</td>';
1556                                        }
1557                                        if ($entry['deletion_time']) {
1558                                               
1559                                                echo '<td class="td-last center">', date(DATE_FORMAT, $entry['deletion_time']), '</td>';
1560                                        } else if ($MYREQUEST['OB'] == OB_USER_CACHE) {
1561                                               
1562                                                echo '<td class="td-last center">';
1563                                                echo '[<a href="', $MY_SELF, '&DU=', urlencode($entry[$fieldkey]), '">Delete Now</a>]';
1564                                                echo '</td>';
1565                                        } else {
1566                                                echo '<td class="td-last center"> &nbsp; </td>';
1567                                        }
1568                                        echo '</tr>';
1569                                        if ($sh == $MYREQUEST["SH"]) { // Le ZOOM sur une entrée
1570                                                echo '<tr>';
1571                                                echo '<td colspan="7">';
1572                                               
1573                                                if (isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT')) {
1574                                                        $url      = parametre_url($self, 'ZOOM', 'TEXTELONG') . "#key-$sh";
1575                                                        $menuzoom = "<a href='$url' class='menuzoom'>Voir tout le texte</a> ";
1576                                                } else {
1577                                                        $url      = parametre_url($self, 'ZOOM', 'TEXTECOURT') . "#key-$sh";
1578                                                        $menuzoom = "<a href='$url' class='menuzoom'>Voir texte abbrégé</a> ";
1579                                                }
1580                                                $url = parametre_url($self, 'SH', '') . "#key-$sh";
1581                                                $menuzoom .= "<a href='$url' class='menuzoom'>Replier</a>";
1582                                               
1583                                                if ($data_success) {
1584                                                        echo "<p>$menuzoom</p>";
1585                                                        echo '<xmp>' . print_r($data, 1) . '</xmp>';
1586                                                } else {
1587                                                        if (!apcu_exists($entry['info']))
1588                                                                echo '(! doesnt exist anymore !)';
1589                                                        else
1590                                                                echo '(! fetch failed !)';
1591                                                }
1592                                                echo '</td>';
1593                                                echo '</tr>';
1594                                        }
1595                                        $i++;
1596                                        if ($i == $MYREQUEST['COUNT'])
1597                                                break;
1598                                }
1599                        }
1600                       
1601                } else {
1602                        echo '<tr class=tr-0><td class="center" colspan=', $cols, '><i>No data</i></td></tr>';
1603                }
1604                echo <<< EOB
1605                </tbody></table>
1606EOB;
1607               
1608                if ($list && $i < count($list)) {
1609                        echo "<a href=\"$MY_SELF", "&COUNT=0\"><i>", count($list) - $i, ' more available...</i></a>';
1610                }
1611               
1612                echo <<< EOB
1613                </div>
1614EOB;
1615                break;
1616       
1617        // -----------------------------------------------
1618        // Version check
1619        // -----------------------------------------------
1620        case OB_VERSION_CHECK:
1621                echo <<<EOB
1622                <div class="info"><h2>APCu Version Information</h2>
1623                <table cellspacing=0><tbody>
1624                <tr>
1625                <th></th>
1626                </tr>
1627EOB;
1628                if (defined('PROXY')) {
1629                        $ctxt = stream_context_create(array(
1630                                'http' => array(
1631                                        'proxy' => PROXY,
1632                                        'request_fulluri' => True
1633                                )
1634                        ));
1635                        $rss  = @file_get_contents("http://pecl.php.net/feeds/pkg_apcu.rss", False, $ctxt);
1636                } else {
1637                        $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apcu.rss");
1638                }
1639                if (!$rss) {
1640                        echo '<tr class="td-last center"><td>Unable to fetch version information.</td></tr>';
1641                } else {
1642                        $apcversion = phpversion('apcu');
1643                       
1644                        preg_match('!<title>APCu ([0-9.]+)</title>!', $rss, $match);
1645                        echo '<tr class="tr-0 center"><td>';
1646                        if (version_compare($apcversion, $match[1], '>=')) {
1647                                echo '<div class="ok">You are running the latest version of APCu (' . $apcversion . ')</div>';
1648                                $i = 3;
1649                        } else {
1650                                echo '<div class="failed">You are running an older version of APCu (' . $apcversion . '),
1651                                newer version ' . $match[1] . ' is available at <a href="http://pecl.php.net/package/APCu/' . $match[1] . '">
1652                                http://pecl.php.net/package/APCu/' . $match[1] . '</a>
1653                                </div>';
1654                                $i = -1;
1655                        }
1656                        echo '</td></tr>';
1657                        echo '<tr class="tr-0"><td><h3>Change Log:</h3><br/>';
1658                       
1659                        preg_match_all('!<(title|description)>([^<]+)</\\1>!', $rss, $match);
1660                        $changelog = $match[2];
1661                       
1662                        for ($j = 2; $j + 1 < count($changelog); $j += 2) {
1663                                $v = $changelog[$j];
1664                                if ($i < 0 && version_compare($apcversion, $ver, '>=')) {
1665                                        break;
1666                                } else if (!$i--) {
1667                                        break;
1668                                }
1669                                list($unused, $ver) = $v;
1670                                $changes = $changelog[$j + 1];
1671                                echo "<b><a href=\"http://pecl.php.net/package/APCu/$ver\">" . htmlspecialchars($v, ENT_QUOTES, 'UTF-8') . "</a></b><br><blockquote>";
1672                                echo nl2br(htmlspecialchars($changes, ENT_QUOTES, 'UTF-8')) . "</blockquote>";
1673                        }
1674                        echo '</td></tr>';
1675                }
1676                echo <<< EOB
1677                </tbody></table>
1678                </div>
1679EOB;
1680                break;
1681
1682        case OB_CACHELAB :
1683                include_spip('inc/cachelab');
1684                include('cachelab_diag.php');
1685                break;
1686}
1687?>
1688
1689        </div>
1690<!--
1691Based on APCGUI By R.Becker\n$VERSION
1692-->
1693</body>
1694</html>
Note: See TracBrowser for help on using the repository browser.