2023-10-26 09:24:00 -04:00
< ? php
declare ( strict_types = 1 );
/**
2024-06-03 04:23:34 -04:00
* SPDX - FileCopyrightText : 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2023-10-26 09:24:00 -04:00
*/
namespace OCA\Settings\SetupChecks ;
2024-10-10 06:40:31 -04:00
use OC\Memcache\Memcached ;
2024-12-02 03:02:22 -05:00
use OCP\ICacheFactory ;
2023-10-26 09:24:00 -04:00
use OCP\IConfig ;
use OCP\IL10N ;
use OCP\IURLGenerator ;
use OCP\SetupCheck\ISetupCheck ;
use OCP\SetupCheck\SetupResult ;
class MemcacheConfigured implements ISetupCheck {
public function __construct (
private IL10N $l10n ,
private IConfig $config ,
private IURLGenerator $urlGenerator ,
2024-12-02 03:02:22 -05:00
private ICacheFactory $cacheFactory ,
2023-10-26 09:24:00 -04:00
) {
}
public function getName () : string {
return $this -> l10n -> t ( 'Memcache' );
}
public function getCategory () : string {
return 'system' ;
}
public function run () : SetupResult {
2024-01-15 10:45:19 -05:00
$memcacheDistributedClass = $this -> config -> getSystemValue ( 'memcache.distributed' , null );
$memcacheLockingClass = $this -> config -> getSystemValue ( 'memcache.locking' , null );
$memcacheLocalClass = $this -> config -> getSystemValue ( 'memcache.local' , null );
$caches = array_filter ([ $memcacheDistributedClass , $memcacheLockingClass , $memcacheLocalClass ]);
2024-10-10 06:40:31 -04:00
if ( in_array ( Memcached :: class , array_map ( fn ( string $class ) => ltrim ( $class , '\\' ), $caches ))) {
2024-05-09 11:45:16 -04:00
// wrong PHP module is installed
if ( extension_loaded ( 'memcache' ) && ! extension_loaded ( 'memcached' )) {
2024-01-15 10:45:19 -05:00
return SetupResult :: warning (
2024-05-09 11:45:16 -04:00
$this -> l10n -> t ( 'Memcached is configured as distributed cache, but the wrong PHP module ("memcache") is installed. Please install the PHP module "memcached".' )
2024-01-15 10:45:19 -05:00
);
}
2024-05-09 11:45:16 -04:00
// required PHP module is missing
2024-01-15 10:45:19 -05:00
if ( ! extension_loaded ( 'memcached' )) {
return SetupResult :: warning (
2024-05-09 11:45:16 -04:00
$this -> l10n -> t ( 'Memcached is configured as distributed cache, but the PHP module "memcached" is not installed. Please install the PHP module "memcached".' )
2024-01-15 10:45:19 -05:00
);
}
}
if ( $memcacheLocalClass === null ) {
2023-10-26 09:24:00 -04:00
return SetupResult :: info (
$this -> l10n -> t ( 'No memory cache has been configured. To enhance performance, please configure a memcache, if available.' ),
$this -> urlGenerator -> linkToDocs ( 'admin-performance' )
);
}
2024-12-02 03:02:22 -05:00
if ( $this -> cacheFactory -> isLocalCacheAvailable ()) {
2025-01-09 13:21:35 -05:00
$random = bin2hex ( random_bytes ( 64 ));
2024-12-02 03:02:22 -05:00
$local = $this -> cacheFactory -> createLocal ( 'setupcheck.local' );
try {
$local -> set ( 'test' , $random );
$local2 = $this -> cacheFactory -> createLocal ( 'setupcheck.local' );
$actual = $local2 -> get ( 'test' );
$local -> remove ( 'test' );
} catch ( \Throwable ) {
$actual = null ;
}
if ( $actual !== $random ) {
return SetupResult :: error ( $this -> l10n -> t ( 'Failed to write and read a value from local cache.' ));
}
}
if ( $this -> cacheFactory -> isAvailable ()) {
2025-01-09 13:21:35 -05:00
$random = bin2hex ( random_bytes ( 64 ));
2024-12-02 03:02:22 -05:00
$distributed = $this -> cacheFactory -> createDistributed ( 'setupcheck' );
try {
$distributed -> set ( 'test' , $random );
$distributed2 = $this -> cacheFactory -> createDistributed ( 'setupcheck' );
$actual = $distributed2 -> get ( 'test' );
$distributed -> remove ( 'test' );
} catch ( \Throwable ) {
$actual = null ;
}
if ( $actual !== $random ) {
return SetupResult :: error ( $this -> l10n -> t ( 'Failed to write and read a value from distributed cache.' ));
}
}
2024-01-15 10:45:19 -05:00
return SetupResult :: success ( $this -> l10n -> t ( 'Configured' ));
2023-10-26 09:24:00 -04:00
}
}