Browse Source

Date/time updates

Added new config option to change the format of the date/time strings throughout the interface.

Added `last modified` date/time output to the file cache list, and added the last modified as a sorting option (fixes PR#82).
Andrew Collington 3 years ago
parent
commit
17e8f6e708
4 changed files with 97 additions and 62 deletions
  1. 24 18
      README.md
  2. 2 0
      build/_frontend/interface.jsx
  3. 36 22
      index.php
  4. 35 22
      src/Opcache/Service.php

+ 24 - 18
README.md

@@ -73,24 +73,25 @@ The default configuration for the interface looks like this:
 
 ```php
 $options = [
-   'allow_filelist'   => true,          // show/hide the files tab
-   'allow_invalidate' => true,          // give a link to invalidate files
-   'allow_reset'      => true,          // give option to reset the whole cache
-   'allow_realtime'   => true,          // give option to enable/disable real-time updates
-   'refresh_time'     => 5,             // how often the data will refresh, in seconds
-   'size_precision'   => 2,             // Digits after decimal point
-   'size_space'       => false,         // have '1MB' or '1 MB' when showing sizes
-   'charts'           => true,          // show gauge chart or just big numbers
-   'debounce_rate'    => 250,           // milliseconds after key press to send keyup event when filtering
-   'per_page'         => 200,           // How many results per page to show in the file list, false for no pagination
-   'cookie_name'      => 'opcachegui',  // name of cookie
-   'cookie_ttl'       => 365,           // days to store cookie
-   'highlight'        => [
-       'memory' => true,                // show the memory chart/big number
-       'hits'   => true,                // show the hit rate chart/big number
-       'keys'   => true,                // show the keys used chart/big number
-       'jit'    => true                 // show the jit buffer chart/big number
-   ]
+    'allow_filelist'   => true,                // show/hide the files tab
+    'allow_invalidate' => true,                // give a link to invalidate files
+    'allow_reset'      => true,                // give option to reset the whole cache
+    'allow_realtime'   => true,                // give option to enable/disable real-time updates
+    'refresh_time'     => 5,                   // how often the data will refresh, in seconds
+    'size_precision'   => 2,                   // Digits after decimal point
+    'size_space'       => false,               // have '1MB' or '1 MB' when showing sizes
+    'charts'           => true,                // show gauge chart or just big numbers
+    'debounce_rate'    => 250,                 // milliseconds after key press to send keyup event when filtering
+    'per_page'         => 200,                 // How many results per page to show in the file list, false for no pagination
+    'cookie_name'      => 'opcachegui',        // name of cookie
+    'cookie_ttl'       => 365,                 // days to store cookie
+    'datetime_format'  => 'D, d M Y H:i:s O',  // Show datetime in this format
+    'highlight'        => [
+        'memory' => true,                      // show the memory chart/big number
+        'hits'   => true,                      // show the hit rate chart/big number
+        'keys'   => true,                      // show the keys used chart/big number
+        'jit'    => true                       // show the jit buffer chart/big number
+    ]
 ];
 ```
 
@@ -172,6 +173,11 @@ Also, if you choose to invalidate any files or reset the cache it will do this w
 
 # Releases
 
+**Version 3.4.0**\
+* Added new `datetime_format` config option for flexible formatting of date/time values
+* Added the cached file's `modified` date/time to the output (when the file was either added or updated)
+* Added PR#83 from @Stevemoretz
+
 **Version 3.3.1**\
 Just a few minor tweaks:
 * Added more of an explanation to the JIT value

+ 2 - 0
build/_frontend/interface.jsx

@@ -777,6 +777,7 @@ class CachedFiles extends React.Component {
                     <nav className="filter" aria-label="Sort order">
                         <select name="sortBy" onChange={this.changeSort} value={this.state.sortBy}>
                             <option value="last_used_timestamp">Last used</option>
+                            <option value="last_modified">Last modified</option>
                             <option value="full_path">Path</option>
                             <option value="hits">Number of hits</option>
                             <option value="memory_consumption">Memory consumption</option>
@@ -832,6 +833,7 @@ class CachedFile extends React.Component {
                     <span className="file-metainfo">
                         <b>hits: </b><span>{this.props.readable.hits}, </span>
                         <b>memory: </b><span>{this.props.readable.memory_consumption}, </span>
+                        { this.props.last_modified && <span><b>last modified: </b><span>{this.props.last_modified}, </span></span> }
                         <b>last used: </b><span>{this.props.last_used}</span>
                     </span>
                     { !this.props.timestamp && <span className="invalid file-metainfo"> - has been invalidated</span> }

+ 36 - 22
index.php

@@ -64,27 +64,29 @@ class Service
 {
     public const VERSION = '3.4.0';
 
+    protected $tz;
     protected $data;
     protected $options;
     protected $optimizationLevels;
     protected $defaults = [
-        'allow_filelist'   => true,          // show/hide the files tab
-        'allow_invalidate' => true,          // give a link to invalidate files
-        'allow_reset'      => true,          // give option to reset the whole cache
-        'allow_realtime'   => true,          // give option to enable/disable real-time updates
-        'refresh_time'     => 5,             // how often the data will refresh, in seconds
-        'size_precision'   => 2,             // Digits after decimal point
-        'size_space'       => false,         // have '1MB' or '1 MB' when showing sizes
-        'charts'           => true,          // show gauge chart or just big numbers
-        'debounce_rate'    => 250,           // milliseconds after key press to send keyup event when filtering
-        'per_page'         => 200,           // How many results per page to show in the file list, false for no pagination
-        'cookie_name'      => 'opcachegui',  // name of cookie
-        'cookie_ttl'       => 365,           // days to store cookie
+        'allow_filelist'   => true,                // show/hide the files tab
+        'allow_invalidate' => true,                // give a link to invalidate files
+        'allow_reset'      => true,                // give option to reset the whole cache
+        'allow_realtime'   => true,                // give option to enable/disable real-time updates
+        'refresh_time'     => 5,                   // how often the data will refresh, in seconds
+        'size_precision'   => 2,                   // Digits after decimal point
+        'size_space'       => false,               // have '1MB' or '1 MB' when showing sizes
+        'charts'           => true,                // show gauge chart or just big numbers
+        'debounce_rate'    => 250,                 // milliseconds after key press to send keyup event when filtering
+        'per_page'         => 200,                 // How many results per page to show in the file list, false for no pagination
+        'cookie_name'      => 'opcachegui',        // name of cookie
+        'cookie_ttl'       => 365,                 // days to store cookie
+        'datetime_format'  => 'D, d M Y H:i:s O',  // Show datetime in this format
         'highlight'        => [
-            'memory' => true,                // show the memory chart/big number
-            'hits'   => true,                // show the hit rate chart/big number
-            'keys'   => true,                // show the keys used chart/big number
-            'jit'    => true                 // show the jit buffer chart/big number
+            'memory' => true,                      // show the memory chart/big number
+            'hits'   => true,                      // show the hit rate chart/big number
+            'keys'   => true,                      // show the keys used chart/big number
+            'jit'    => true                       // show the jit buffer chart/big number
         ]
     ];
     protected $jitModes = [
@@ -158,6 +160,7 @@ class Service
             1 << 15 => 'Inline functions'
         ];
         $this->options = array_merge($this->defaults, $options);
+        $this->tz = new DateTimeZone(date_default_timezone_get());
         $this->data = $this->compileState();
     }
 
@@ -321,6 +324,15 @@ class Service
                     'hits' => number_format($file['hits']),
                     'memory_consumption' => $this->size($file['memory_consumption'])
                 ];
+                $file['last_used'] = (new DateTimeImmutable("@{$file['last_used_timestamp']}"))
+                    ->setTimezone($this->tz)
+                    ->format($this->getOption('datetime_format'));
+                $file['last_modified'] = "";
+                if (!empty($file['timestamp'])) {
+                    $file['last_modified'] = (new DateTimeImmutable("@{$file['timestamp']}"))
+                        ->setTimezone($this->tz)
+                        ->format($this->getOption('datetime_format'));
+                }
             }
             $files = array_values($status['scripts']);
         }
@@ -353,13 +365,13 @@ class Service
                         'max_cached_keys' => number_format($status['opcache_statistics']['max_cached_keys']),
                         'interned' => null,
                         'start_time' => (new DateTimeImmutable("@{$status['opcache_statistics']['start_time']}"))
-                            ->setTimezone(new DateTimeZone(date_default_timezone_get()))
-                            ->format('Y-m-d H:i:s'),
+                            ->setTimezone($this->tz)
+                            ->format($this->getOption('datetime_format')),
                         'last_restart_time' => ($status['opcache_statistics']['last_restart_time'] === 0
                             ? 'never'
                             : (new DateTimeImmutable("@{$status['opcache_statistics']['last_restart_time']}"))
-                                ->setTimezone(new DateTimeZone(date_default_timezone_get()))
-                                ->format('Y-m-d H:i:s')
+                                ->setTimezone($this->tz)
+                                ->format($this->getOption('datetime_format'))
                         )
                     ]
                 ]
@@ -434,7 +446,7 @@ class Service
         $version = array_merge(
             $config['version'],
             [
-                'php' => phpversion(),
+                'php' => PHP_VERSION,
                 'server' => $_SERVER['SERVER_SOFTWARE'] ?: '',
                 'host' => (function_exists('gethostname')
                     ? gethostname()
@@ -1283,6 +1295,8 @@ class CachedFiles extends React.Component {
     }, /*#__PURE__*/React.createElement("option", {
       value: "last_used_timestamp"
     }, "Last used"), /*#__PURE__*/React.createElement("option", {
+      value: "last_modified"
+    }, "Last modified"), /*#__PURE__*/React.createElement("option", {
       value: "full_path"
     }, "Path"), /*#__PURE__*/React.createElement("option", {
       value: "hits"
@@ -1337,7 +1351,7 @@ class CachedFile extends React.Component {
       className: "file-pathname"
     }, this.props.full_path), /*#__PURE__*/React.createElement("span", {
       className: "file-metainfo"
-    }, /*#__PURE__*/React.createElement("b", null, "hits: "), /*#__PURE__*/React.createElement("span", null, this.props.readable.hits, ", "), /*#__PURE__*/React.createElement("b", null, "memory: "), /*#__PURE__*/React.createElement("span", null, this.props.readable.memory_consumption, ", "), /*#__PURE__*/React.createElement("b", null, "last used: "), /*#__PURE__*/React.createElement("span", null, this.props.last_used)), !this.props.timestamp && /*#__PURE__*/React.createElement("span", {
+    }, /*#__PURE__*/React.createElement("b", null, "hits: "), /*#__PURE__*/React.createElement("span", null, this.props.readable.hits, ", "), /*#__PURE__*/React.createElement("b", null, "memory: "), /*#__PURE__*/React.createElement("span", null, this.props.readable.memory_consumption, ", "), this.props.last_modified && /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("b", null, "last modified: "), /*#__PURE__*/React.createElement("span", null, this.props.last_modified, ", ")), /*#__PURE__*/React.createElement("b", null, "last used: "), /*#__PURE__*/React.createElement("span", null, this.props.last_used)), !this.props.timestamp && /*#__PURE__*/React.createElement("span", {
       className: "invalid file-metainfo"
     }, " - has been invalidated"), this.props.canInvalidate && /*#__PURE__*/React.createElement("span", null, ",\xA0", /*#__PURE__*/React.createElement("a", {
       className: "file-metainfo",

+ 35 - 22
src/Opcache/Service.php

@@ -10,27 +10,29 @@ class Service
 {
     public const VERSION = '3.4.0';
 
+    protected $tz;
     protected $data;
     protected $options;
     protected $optimizationLevels;
     protected $defaults = [
-        'allow_filelist'   => true,          // show/hide the files tab
-        'allow_invalidate' => true,          // give a link to invalidate files
-        'allow_reset'      => true,          // give option to reset the whole cache
-        'allow_realtime'   => true,          // give option to enable/disable real-time updates
-        'refresh_time'     => 5,             // how often the data will refresh, in seconds
-        'size_precision'   => 2,             // Digits after decimal point
-        'size_space'       => false,         // have '1MB' or '1 MB' when showing sizes
-        'charts'           => true,          // show gauge chart or just big numbers
-        'debounce_rate'    => 250,           // milliseconds after key press to send keyup event when filtering
-        'per_page'         => 200,           // How many results per page to show in the file list, false for no pagination
-        'cookie_name'      => 'opcachegui',  // name of cookie
-        'cookie_ttl'       => 365,           // days to store cookie
+        'allow_filelist'   => true,                // show/hide the files tab
+        'allow_invalidate' => true,                // give a link to invalidate files
+        'allow_reset'      => true,                // give option to reset the whole cache
+        'allow_realtime'   => true,                // give option to enable/disable real-time updates
+        'refresh_time'     => 5,                   // how often the data will refresh, in seconds
+        'size_precision'   => 2,                   // Digits after decimal point
+        'size_space'       => false,               // have '1MB' or '1 MB' when showing sizes
+        'charts'           => true,                // show gauge chart or just big numbers
+        'debounce_rate'    => 250,                 // milliseconds after key press to send keyup event when filtering
+        'per_page'         => 200,                 // How many results per page to show in the file list, false for no pagination
+        'cookie_name'      => 'opcachegui',        // name of cookie
+        'cookie_ttl'       => 365,                 // days to store cookie
+        'datetime_format'  => 'D, d M Y H:i:s O',  // Show datetime in this format
         'highlight'        => [
-            'memory' => true,                // show the memory chart/big number
-            'hits'   => true,                // show the hit rate chart/big number
-            'keys'   => true,                // show the keys used chart/big number
-            'jit'    => true                 // show the jit buffer chart/big number
+            'memory' => true,                      // show the memory chart/big number
+            'hits'   => true,                      // show the hit rate chart/big number
+            'keys'   => true,                      // show the keys used chart/big number
+            'jit'    => true                       // show the jit buffer chart/big number
         ]
     ];
     protected $jitModes = [
@@ -81,6 +83,7 @@ class Service
     /**
      * Service constructor.
      * @param array $options
+     * @throws Exception
      */
     public function __construct(array $options = [])
     {
@@ -103,6 +106,7 @@ class Service
             1 << 15 => 'Inline functions'
         ];
         $this->options = array_merge($this->defaults, $options);
+        $this->tz = new DateTimeZone(date_default_timezone_get());
         $this->data = $this->compileState();
     }
 
@@ -266,6 +270,15 @@ class Service
                     'hits' => number_format($file['hits']),
                     'memory_consumption' => $this->size($file['memory_consumption'])
                 ];
+                $file['last_used'] = (new DateTimeImmutable("@{$file['last_used_timestamp']}"))
+                    ->setTimezone($this->tz)
+                    ->format($this->getOption('datetime_format'));
+                $file['last_modified'] = "";
+                if (!empty($file['timestamp'])) {
+                    $file['last_modified'] = (new DateTimeImmutable("@{$file['timestamp']}"))
+                        ->setTimezone($this->tz)
+                        ->format($this->getOption('datetime_format'));
+                }
             }
             $files = array_values($status['scripts']);
         }
@@ -298,13 +311,13 @@ class Service
                         'max_cached_keys' => number_format($status['opcache_statistics']['max_cached_keys']),
                         'interned' => null,
                         'start_time' => (new DateTimeImmutable("@{$status['opcache_statistics']['start_time']}"))
-                            ->setTimezone(new DateTimeZone(date_default_timezone_get()))
-                            ->format('Y-m-d H:i:s'),
-                        'last_restart_time' => ($status['opcache_statistics']['last_restart_time'] == 0
+                            ->setTimezone($this->tz)
+                            ->format($this->getOption('datetime_format')),
+                        'last_restart_time' => ($status['opcache_statistics']['last_restart_time'] === 0
                             ? 'never'
                             : (new DateTimeImmutable("@{$status['opcache_statistics']['last_restart_time']}"))
-                                ->setTimezone(new DateTimeZone(date_default_timezone_get()))
-                                ->format('Y-m-d H:i:s')
+                                ->setTimezone($this->tz)
+                                ->format($this->getOption('datetime_format'))
                         )
                     ]
                 ]
@@ -379,7 +392,7 @@ class Service
         $version = array_merge(
             $config['version'],
             [
-                'php' => phpversion(),
+                'php' => PHP_VERSION,
                 'server' => $_SERVER['SERVER_SOFTWARE'] ?: '',
                 'host' => (function_exists('gethostname')
                     ? gethostname()