149 $services ??= MediaWikiServices::getInstance();
150 $conf = $services->getMainConfig();
154 'logger' => LoggerFactory::getInstance( $params[
'loggroup'] ??
'objectcache' ),
155 'keyspace' => self::getDefaultKeyspace(),
156 'asyncHandler' => [ DeferredUpdates::class,
'addCallableUpdate' ],
157 'reportDupes' =>
true,
158 'stats' => $services->getStatsdDataFactory(),
161 if ( isset( $params[
'factory'] ) ) {
162 $args = $params[
'args'] ?? [ $params ];
164 return call_user_func( $params[
'factory'], ...$args );
167 if ( !isset( $params[
'class'] ) ) {
168 throw new InvalidArgumentException(
169 'No "factory" nor "class" provided; got "' . print_r( $params,
true ) .
'"'
173 $class = $params[
'class'];
176 if ( is_a( $class, SqlBagOStuff::class,
true ) ) {
177 if ( isset( $params[
'globalKeyLB'] ) ) {
178 throw new InvalidArgumentException(
179 'globalKeyLB in $wgObjectCaches is no longer supported' );
181 if ( isset( $params[
'server'] ) && !isset( $params[
'servers'] ) ) {
182 $params[
'servers'] = [ $params[
'server'] ];
183 unset( $params[
'server'] );
185 if ( isset( $params[
'servers'] ) ) {
187 foreach ( $params[
'servers'] as &$server ) {
188 if ( $server[
'type'] ===
'sqlite' && !isset( $server[
'dbDirectory'] ) ) {
189 $server[
'dbDirectory'] = $conf->get( MainConfigNames::SQLiteDataDir );
192 } elseif ( isset( $params[
'cluster'] ) ) {
193 $cluster = $params[
'cluster'];
194 $params[
'loadBalancerCallback'] =
static function () use ( $services, $cluster ) {
195 return $services->getDBLoadBalancerFactory()->getExternalLB( $cluster );
197 $params += [
'dbDomain' => false ];
199 $params[
'loadBalancerCallback'] =
static function () use ( $services ) {
200 return $services->getDBLoadBalancer();
202 $params += [
'dbDomain' => false ];
204 $params += [
'writeBatchSize' => $conf->get( MainConfigNames::UpdateRowsPerQuery ) ];
208 if ( is_subclass_of( $class, MemcachedBagOStuff::class ) ) {
210 'servers' => $conf->get( MainConfigNames::MemCachedServers ),
211 'persistent' => $conf->get( MainConfigNames::MemCachedPersistent ),
212 'timeout' => $conf->get( MainConfigNames::MemCachedTimeout ),
217 if ( is_a( $class, MultiWriteBagOStuff::class,
true ) ) {
220 '@phan-var array{caches:array[]} $params';
221 foreach ( $params[
'caches'] ?? [] as $i => $cacheInfo ) {
224 $params[
'caches'][$i] = self::newFromParams( $cacheInfo, $services );
227 if ( is_a( $class, RESTBagOStuff::class,
true ) ) {
228 $params[
'telemetry'] = Telemetry::getInstance();
231 return new $class( $params );