Check OPcache in SystemCheckPage
authorTim Düsterhus <duesterhus@woltlab.com>
Fri, 20 Jan 2023 13:22:28 +0000 (14:22 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Fri, 20 Jan 2023 13:22:28 +0000 (14:22 +0100)
Resolves #5230

wcfsetup/install/files/acp/templates/systemCheck.tpl
wcfsetup/install/files/lib/acp/page/SystemCheckPage.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 39428c345a6dff23c67afd6a23b58eece2523cba..2a15d38713e3458e851e3edf16364e0528c5cd8b 100644 (file)
                        <small>{lang}wcf.acp.systemCheck.php.sha256.description{/lang}</small>
                </dd>
        </dl>
+
+       <dl{if $results[php][opcache] === false} class="formError"{/if}>
+               <dt>{lang}wcf.acp.systemCheck.php.opcache{/lang}</dt>
+               <dd>
+                       {if $results[php][opcache] === true}
+                               {@$statusOk} {lang}wcf.acp.systemCheck.pass{/lang}
+                       {elseif $results[php][opcache] === null}
+                               {@$statusSufficient} {lang}wcf.acp.systemCheck.notSupported{/lang}
+                       {else}
+                               {@$statusInsufficient} {lang}wcf.acp.systemCheck.php.opcache.broken{/lang}
+                       {/if}
+                       <small>{lang}wcf.acp.systemCheck.php.opcache.description{/lang}</small>
+               </dd>
+       </dl>
        
        <dl{if !$results[php][gd][result]} class="formError"{/if}>
                <dt>{lang}wcf.acp.systemCheck.php.gd{/lang}</dt>
index 5abed858a0ca7f57fb38369592306ba8b8626db8..edd1e58e8e4b9a4e535a5fc53842f5ba788c2289 100644 (file)
@@ -147,6 +147,7 @@ class SystemCheckPage extends AbstractPage
                 'value' => '0',
             ],
             'sha256' => false,
+            'opcache' => null,
             'version' => [
                 'result' => 'unsupported',
                 'value' => '0.0.0',
@@ -323,7 +324,20 @@ class SystemCheckPage extends AbstractPage
             $this->results['php']['sha256'] = \in_array('sha256', \hash_algos());
         }
 
-        $this->results['status']['php'] = empty($this->results['php']['extension']) && $this->results['php']['sha256'];
+        try {
+            // Attempt to reset ourselves to perform a functional check.
+            WCF::resetZendOpcache(__FILE__);
+
+            if (\extension_loaded('Zend Opcache') && @\ini_get('opcache.enable')) {
+                $this->results['php']['opcache'] = \function_exists('opcache_reset') && \function_exists('opcache_invalidate');
+            }
+        } catch (\Exception $e) {
+            $this->results['php']['opcache'] = false;
+        }
+
+        $this->results['status']['php'] = empty($this->results['php']['extension'])
+            && $this->results['php']['sha256']
+            && $this->results['php']['opcache'] !== false;
     }
 
     protected function validatePhpMemoryLimit()
index 58139bbbc50497bab1899e01db59c94f4b4ec5a2..279b37f0aaf28cad3866a6ca652126b4ac3e568d 100644 (file)
@@ -2824,6 +2824,9 @@ Abschnitte dürfen nicht leer sein und nur folgende Zeichen enthalten: <kbd>[a-z
                <item name="wcf.acp.systemCheck.directories.writable.description"><![CDATA[Einige Verzeichnisse werden zur Laufzeit durch die Software beschrieben, der PHP-Benutzer muss Schreibrechte haben.]]></item>
                <item name="wcf.acp.systemCheck.php.gd"><![CDATA[Unterstützte Formate der GD-Bibliothek]]></item>
                <item name="wcf.acp.systemCheck.php.gd.description"><![CDATA[Die GD-Bibliothek muss inklusive der Unterstützung der Formate „jpeg“, „png“ und „webp“ installiert sein.]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache"><![CDATA[OPcache]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache.description"><![CDATA[PHPs OPcache beschleunigt die Bearbeitung von Anfragen, indem der vorverarbeitete Programmcode gecached wird. Bei aktiviertem OPcache müssen die Verwaltungsfunktionen <kbd>opcache_reset()</kbd> und <kbd>opcache_invalidate()</kbd> zur Verfügung stehen, damit der Cache nach einer Aktualisierung des Programmcodes zuverlässig neu aufgebaut werden kann.]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache.broken"><![CDATA[Fehlerhaft – die Verwaltungsfunktionen sind nicht verfügbar]]></item>
        </category>
        <category name="wcf.acp.updateServer">
                <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>
index 066d3e56ce134692bba2b5eaaaf8b99f2a67960c..f89c49fde858ef5822df973c70854c20b444fe05 100644 (file)
@@ -2755,6 +2755,9 @@ If you have <strong>already bought the licenses for the listed apps</strong>, th
                <item name="wcf.acp.systemCheck.directories.writable.description"><![CDATA[Some directories are being written to during the normal operation. The user that runs the PHP process must have write access.]]></item>
                <item name="wcf.acp.systemCheck.php.gd"><![CDATA[Supported formats of the GD library]]></item>
                <item name="wcf.acp.systemCheck.php.gd.description"><![CDATA[The GD library must be installed with support for the formats “jpeg”, “png” and “webp”.]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache"><![CDATA[OPcache]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache.description"><![CDATA[PHP’s OPcache improves request processing performance by caching the preprocessed application code. If OPcache is enabled the management functions <kbd>opcache_reset()</kbd> and <kbd>opcache_invalidate()</kbd> need to be available to be able to reliably reset the cache when the application code is updated.]]></item>
+               <item name="wcf.acp.systemCheck.php.opcache.broken"><![CDATA[Broken – the management functions are unavailable]]></item>
        </category>
        <category name="wcf.acp.updateServer">
                <item name="wcf.acp.updateServer.add"><![CDATA[Add Server]]></item>