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

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

liens vers les sources des squelettes compilés et des squelettes (dans le zoom sur un cache). Pas de jolification du code.

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