MediaWiki REL1_39
Setup.php
Go to the documentation of this file.
1<?php
53// phpcs:disable MediaWiki.Usage.DeprecatedGlobalVariables
67use Psr\Log\LoggerInterface;
68use Wikimedia\RequestTimeout\RequestTimeout;
69
77// This file must be included from a valid entry point (e.g. WebStart.php, Maintenance.php)
78if ( !defined( 'MEDIAWIKI' ) ) {
79 exit( 1 );
80}
81
82// PHP must not be configured to overload mbstring functions. (T5782, T122807)
83// This was deprecated by upstream in PHP 7.2, likely to be removed in PHP 8.0.
84if ( ini_get( 'mbstring.func_overload' ) ) {
85 die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
86}
87
88// The MW_ENTRY_POINT constant must always exists, to make it safe to access.
89// For compat, we do support older and custom MW entrypoints that don't set this,
90// in which case we assign a default here.
91if ( !defined( 'MW_ENTRY_POINT' ) ) {
97 define( 'MW_ENTRY_POINT', 'unknown' );
98}
99
100// The $IP variable is defined for use by LocalSettings.php.
101// It is made available as a global variable for backwards compatibility.
102//
103// Source code should instead use the MW_INSTALL_PATH constant, or the
104// MainConfigNames::BaseDirectory setting. The BaseDirectory setting is set further
105// down in Setup.php to the value of MW_INSTALL_PATH.
106global $IP;
107$IP = $IP = wfDetectInstallPath(); // ensure MW_INSTALL_PATH is defined
108
114require_once MW_INSTALL_PATH . '/includes/AutoLoader.php';
115require_once MW_INSTALL_PATH . '/includes/Defines.php';
116
117// Assert that composer dependencies were successfully loaded
118if ( !interface_exists( LoggerInterface::class ) ) {
119 $message = (
120 'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
121 "library</a> to be present. This library is not embedded directly in MediaWiki's " .
122 "git repository and must be installed separately by the end user.\n\n" .
123 'Please see the <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
124 '#Fetch_external_libraries">instructions for installing libraries</a> on mediawiki.org ' .
125 'for help on installing the required components.'
126 );
127 echo $message;
128 trigger_error( $message, E_USER_ERROR );
129}
130
131// Set $wgCommandLineMode to false if it wasn't set to true.
133
140
142
144 MW_INSTALL_PATH,
145 ExtensionRegistry::getInstance(),
146 new GlobalConfigBuilder( 'wg' ),
147 new PhpIniSink()
148);
149
150if ( defined( 'MW_USE_CONFIG_SCHEMA_CLASS' ) ) {
151 // Load config schema from MainConfigSchema. Useful for running scripts that
152 // generate other representations of the config schema. This is slow, so it
153 // should not be used for serving web traffic.
154 $wgSettings->load( new ReflectionSchemaSource( MainConfigSchema::class ) );
155} elseif ( getenv( 'MW_USE_LEGACY_DEFAULT_SETTINGS' ) || defined( 'MW_USE_LEGACY_DEFAULT_SETTINGS' ) ) {
156 // Load the old DefaultSettings.php file. Should be removed in 1.39. See T300129.
157 require_once MW_INSTALL_PATH . '/includes/DefaultSettings.php';
158
159 // This is temporary until we no longer need this mode.
160 // TODO: delete config-merge-strategies.php when this code is removed.
161 $wgSettings->load( new PhpSettingsSource( MW_INSTALL_PATH . '/includes/config-merge-strategies.php' ) );
162} else {
163 $wgSettings->load( new PhpSettingsSource( MW_INSTALL_PATH . '/includes/config-schema.php' ) );
164}
165
166require_once MW_INSTALL_PATH . '/includes/GlobalFunctions.php';
167
168HeaderCallback::register();
169
170// Set the encoding used by PHP for reading HTTP input, and writing output.
171// This is also the default for mbstring functions.
172mb_internal_encoding( 'UTF-8' );
173
178// Initialize some config settings with dynamic defaults, and
179// make default settings available in globals for use in LocalSettings.php.
180$wgSettings->putConfigValues( [
181 MainConfigNames::BaseDirectory => MW_INSTALL_PATH,
182 MainConfigNames::ExtensionDirectory => MW_INSTALL_PATH . '/extensions',
183 MainConfigNames::StyleDirectory => MW_INSTALL_PATH . '/skins',
184 MainConfigNames::ServiceWiringFiles => [ MW_INSTALL_PATH . '/includes/ServiceWiring.php' ],
185 'Version' => MW_VERSION,
186] );
187$wgSettings->apply();
188
189// $wgSettings->apply() puts all configuration into global variables.
190// If we are not in global scope, make all relevant globals available
191// in this file's scope as well.
192$wgScopeTest = 'MediaWiki Setup.php scope test';
193if ( !isset( $GLOBALS['wgScopeTest'] ) || $GLOBALS['wgScopeTest'] !== $wgScopeTest ) {
194 foreach ( $wgSettings->getConfigSchema()->getDefinedKeys() as $key ) {
195 $var = "wg$key";
196 // phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.allowedPrefix
197 global $$var;
198 }
199 unset( $key, $var );
200}
201unset( $wgScopeTest );
202
203if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
204 call_user_func( MW_CONFIG_CALLBACK, $wgSettings );
205} else {
206 wfDetectLocalSettingsFile( MW_INSTALL_PATH );
207
208 if ( getenv( 'MW_USE_LOCAL_SETTINGS_LOADER' ) ) {
209 // NOTE: This will not work for configuration variables that use a prefix
210 // other than "wg".
211 $localSettingsLoader = new LocalSettingsLoader( $wgSettings, MW_INSTALL_PATH );
212 $localSettingsLoader->loadLocalSettingsFile( MW_CONFIG_FILE );
213 unset( $localSettingsLoader );
214 } else {
215 if ( str_ends_with( MW_CONFIG_FILE, '.php' ) ) {
216 // make defaults available as globals
217 $wgSettings->apply();
218 require_once MW_CONFIG_FILE;
219 } else {
220 $wgSettings->loadFile( MW_CONFIG_FILE );
221 }
222 }
223}
224
225// Make settings loaded by LocalSettings.php available in globals for use here
226$wgSettings->apply();
227
235if ( defined( 'MW_SETUP_CALLBACK' ) ) {
236 call_user_func( MW_SETUP_CALLBACK, $wgSettings );
237 // Make any additional settings available in globals for use here
238 $wgSettings->apply();
239}
240
241// If in a wiki-farm, load site-specific settings
242if ( $wgSettings->getConfig()->get( MainConfigNames::WikiFarmSettingsDirectory ) ) {
243 $wikiFarmSettingsLoader = new WikiFarmSettingsLoader( $wgSettings );
244 $wikiFarmSettingsLoader->loadWikiFarmSettings();
245 unset( $wikiFarmSettingsLoader );
246}
247
248// Apply dynamic defaults declared in config schema callbacks.
250$dynamicDefaults->applyDynamicDefaults( $wgSettings->getConfigBuilder() );
251
252// Make updated config available in global scope.
253$wgSettings->apply();
254
255// Apply dynamic defaults implemented in SetupDynamicConfig.php.
256// Ideally, all logic in SetupDynamicConfig would be converted to
257// callbacks in the config schema.
258require __DIR__ . '/SetupDynamicConfig.php';
259
260// All settings should be loaded now.
261$wgSettings->finalize();
262if ( $wgBaseDirectory !== MW_INSTALL_PATH ) {
263 throw new FatalError(
264 '$wgBaseDirectory must not be modified in settings files! ' .
265 'Use the MW_INSTALL_PATH environment variable to override the installation root directory.'
266 );
267}
268
269// Start time limit
271 RequestTimeout::singleton()->setWallTimeLimit( $wgRequestTimeLimit );
272}
273
278ExtensionRegistry::getInstance()->loadFromQueue();
279// Don't let any other extensions load
281
282// Set an appropriate locale (T291234)
283// setlocale() will return the locale name actually set.
284// The putenv() is meant to propagate the choice of locale to shell commands
285// so that they will interpret UTF-8 correctly. If you have a problem with a
286// shell command and need to send a special locale, you can override the locale
287// with Command::environment().
288putenv( "LC_ALL=" . setlocale( LC_ALL, 'C.UTF-8', 'C' ) );
289
290// Set PHP runtime to the desired timezone
291date_default_timezone_set( $wgLocaltimezone );
292
294
295// Enable the global service locator.
296// Trivial expansion of site configuration should go before this point.
297// Any non-trivial expansion that requires calling into MediaWikiServices or other parts of MW.
298MediaWikiServices::allowGlobalInstance();
299
300// Define a constant that indicates that the bootstrapping of the service locator
301// is complete.
302define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
303
304MWExceptionRenderer::setShowExceptionDetails( $wgShowExceptionDetails );
305MWExceptionHandler::installHandler( $wgLogExceptionBacktrace, $wgPropagateErrors );
306
307// Non-trivial validation of: $wgServer
308// The FatalError page only renders cleanly after MWExceptionHandler is installed.
309if ( $wgServer === false ) {
310 // T30798: $wgServer must be explicitly set
311 throw new FatalError(
312 '$wgServer must be set in LocalSettings.php. ' .
313 'See <a href="https://www.mediawiki.org/wiki/Manual:$wgServer">' .
314 'https://www.mediawiki.org/wiki/Manual:$wgServer</a>.'
315 );
316}
317
318// Non-trivial expansion of: $wgCanonicalServer, $wgServerName.
319// These require calling global functions.
320// Also here are other settings that further depend on these two.
321if ( $wgCanonicalServer === false ) {
322 $wgCanonicalServer = MediaWikiServices::getInstance()->getUrlUtils()->getCanonicalServer();
323}
325
327if ( $wgServerName !== false ) {
328 wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
329 . 'not customized. Overwriting $wgServerName.' );
330}
332unset( $serverParts );
333
334// $wgEmergencyContact and $wgPasswordSender may be false or empty string (T104142)
335if ( !$wgEmergencyContact ) {
336 $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
337}
338if ( !$wgPasswordSender ) {
339 $wgPasswordSender = 'apache@' . $wgServerName;
340}
341if ( !$wgNoReplyAddress ) {
343}
344
345// Non-trivial expansion of: $wgSecureLogin
346// (due to calling wfWarn).
347if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
348 $wgSecureLogin = false;
349 wfWarn( 'Secure login was enabled on a server that only supports '
350 . 'HTTP or HTTPS. Disabling secure login.' );
351}
352
353// Now that GlobalFunctions is loaded, set defaults that depend on it.
354if ( $wgTmpDirectory === false ) {
356}
357
359 // Apply $wgSharedDB table aliases for the local LB (all non-foreign DB connections)
360 MediaWikiServices::getInstance()->getDBLoadBalancer()->setTableAliases(
361 array_fill_keys(
363 [
364 'dbname' => $wgSharedDB,
365 'schema' => $wgSharedSchema,
366 'prefix' => $wgSharedPrefix
367 ]
368 )
369 );
370}
371
372// Raise the memory limit if it's too low
373// NOTE: This use wfDebug, and must remain after the MWDebug::setup() call.
375
376// Explicit globals, so this works with bootstrap.php
378
379// Initialize the request object in $wgRequest
380$wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
381
382// Make sure that object caching does not undermine the ChronologyProtector improvements
383if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
384 // The user is pinned to the primary DC, meaning that they made recent changes which should
385 // be reflected in their subsequent web requests. Avoid the use of interim cache keys because
386 // they use a blind TTL and could be stale if an object changes twice in a short time span.
387 MediaWikiServices::getInstance()->getMainWANObjectCache()->useInterimHoldOffCaching( false );
388}
389
390// Useful debug output
391( static function () {
393 $logger = LoggerFactory::getInstance( 'wfDebug' );
394 if ( $wgCommandLineMode ) {
395 $self = $_SERVER['PHP_SELF'] ?? '';
396 $logger->debug( "\n\nStart command line script $self" );
397 } else {
398 $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
399 $debug .= "IP: " . $wgRequest->getIP() . "\n";
400 $debug .= "HTTP HEADERS:\n";
401 foreach ( $wgRequest->getAllHeaders() as $name => $value ) {
402 $debug .= "$name: $value\n";
403 }
404 $debug .= "(end headers)";
405 $logger->debug( $debug );
406 }
407} )();
408
409// Most of the config is out, some might want to run hooks here.
410Hooks::runner()->onSetupAfterCache();
411
412// Now that variant lists may be available, parse any action paths and article paths
413// as query parameters.
414//
415// Skip title interpolation on API queries where it is useless and sometimes harmful (T18019).
416//
417// Optimization: Skip on load.php and all other entrypoints besides index.php to save time.
418//
419// TODO: Figure out if this can be safely done after everything else in Setup.php (e.g. any
420// hooks or other state that would miss this?). If so, move to wfIndexMain or MediaWiki::run.
421if ( MW_ENTRY_POINT === 'index' ) {
422 $wgRequest->interpolateTitle();
423}
424
429if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
430 // If session.auto_start is there, we can't touch session name
431 if ( $wgPHPSessionHandling !== 'disable' && !wfIniGetBool( 'session.auto_start' ) ) {
432 HeaderCallback::warnIfHeadersSent();
433 session_name( $wgSessionName ?: $wgCookiePrefix . '_session' );
434 }
435
436 // Create the SessionManager singleton and set up our session handler,
437 // unless we're specifically asked not to.
438 if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
439 MediaWiki\Session\PHPSessionHandler::install(
440 MediaWiki\Session\SessionManager::singleton()
441 );
442 }
443
444 $contLang = MediaWikiServices::getInstance()->getContentLanguage();
445
446 // Initialize the session
447 try {
448 $session = MediaWiki\Session\SessionManager::getGlobalSession();
449 } catch ( MediaWiki\Session\SessionOverflowException $ex ) {
450 // The exception is because the request had multiple possible
451 // sessions tied for top priority. Report this to the user.
452 $list = [];
453 foreach ( $ex->getSessionInfos() as $info ) {
454 $list[] = $info->getProvider()->describe( $contLang );
455 }
456 $list = $contLang->listToText( $list );
457 throw new HttpError( 400,
458 Message::newFromKey( 'sessionmanager-tie', $list )->inLanguage( $contLang )
459 );
460 }
461
462 unset( $contLang );
463
464 if ( $session->isPersistent() ) {
465 $wgInitialSessionId = $session->getSessionId();
466 }
467
468 $session->renew();
469 if ( MediaWiki\Session\PHPSessionHandler::isEnabled() &&
470 ( $session->isPersistent() || $session->shouldRememberUser() ) &&
471 session_id() !== $session->getId()
472 ) {
473 // Start the PHP-session for backwards compatibility
474 if ( session_id() !== '' ) {
475 wfDebugLog( 'session', 'PHP session {old_id} was already started, changing to {new_id}', 'all', [
476 'old_id' => session_id(),
477 'new_id' => $session->getId(),
478 ] );
479 session_write_close();
480 }
481 session_id( $session->getId() );
482 session_start();
483 }
484
485 unset( $session );
486} else {
487 // Even if we didn't set up a global Session, still install our session
488 // handler unless specifically requested not to.
489 if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
490 MediaWiki\Session\PHPSessionHandler::install(
491 MediaWiki\Session\SessionManager::singleton()
492 );
493 }
494}
495
496// Explicit globals, so this works with bootstrap.php
498
504$wgUser = new StubGlobalUser( RequestContext::getMain()->getUser() ); // BackCompat
505register_shutdown_function( static function () {
507} );
508
513
517$wgOut = RequestContext::getMain()->getOutput(); // BackCompat
518
522$wgTitle = null;
523
524// Explicit globals, so this works with bootstrap.php
526
527// Extension setup functions
528// Entries should be added to this variable during the inclusion
529// of the extension file. This allows the extension to perform
530// any necessary initialisation in the fully initialised environment
531foreach ( $wgExtensionFunctions as $func ) {
532 call_user_func( $func );
533}
534unset( $func ); // no global pollution; destroy reference
535
536// If the session user has a 0 id but a valid name, that means we need to
537// autocreate it.
538if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
539 $sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
540 if ( $sessionUser->getId() === 0 &&
541 MediaWikiServices::getInstance()->getUserNameUtils()->isValid( $sessionUser->getName() )
542 ) {
543 $res = MediaWikiServices::getInstance()->getAuthManager()->autoCreateUser(
544 $sessionUser,
545 MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
546 true
547 );
548 \MediaWiki\Logger\LoggerFactory::getInstance( 'authevents' )->info( 'Autocreation attempt', [
549 'event' => 'autocreate',
550 'successful' => $res->isGood(),
551 'status' => ( $res->getErrorsArray() ?: $res->getWarningsArray() )[0][0] ?? '-',
552 ] );
553 unset( $res );
554 }
555 unset( $sessionUser );
556}
557
558if ( !$wgCommandLineMode ) {
560}
561
563if ( $settingsWarnings ) {
564 $logger = LoggerFactory::getInstance( 'Settings' );
565 foreach ( $settingsWarnings as $msg ) {
566 $logger->warning( $msg );
567 }
568 unset( $logger );
569}
570
571unset( $settingsWarnings );
572
573// Explicit globals, so this works with bootstrap.php
576
577// T264370
578if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
579 MediaWiki\Session\SessionManager::singleton()->logPotentialSessionLeakage();
580}
getUser()
wfDetectLocalSettingsFile(?string $installationPath=null)
Decide and remember where to load LocalSettings from.
wfDetectInstallPath()
Decide and remember where mediawiki is installed.
const MW_VERSION
The running version of MediaWiki.
Definition Defines.php:36
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
wfTempDir()
Tries to get the system directory for temporary files.
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfMemoryLimit( $newLimit)
Raise PHP's memory limit (if needed).
wfIniGetBool( $setting)
Safety wrapper around ini_get() for boolean settings.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
if(!defined( 'MEDIAWIKI')) if(ini_get('mbstring.func_overload')) if(!defined( 'MW_ENTRY_POINT')) global $IP
Environment checks.
Definition Setup.php:91
global $wgRequest
Definition Setup.php:377
$wgUser
Definition Setup.php:504
if(!defined( 'MW_NO_SESSION') &&! $wgCommandLineMode $wgOut
Definition Setup.php:497
$wgAutoloadClasses
Definition Setup.php:141
if(!defined('MW_NO_SESSION') &&! $wgCommandLineMode) if(! $wgCommandLineMode) $settingsWarnings
Definition Setup.php:562
$serverParts
Definition Setup.php:326
global $wgInitialSessionId
The persistent session ID (if any) loaded at startup.
Definition Setup.php:377
if(defined('MW_SETUP_CALLBACK')) if( $wgSettings->getConfig() ->get(MainConfigNames::WikiFarmSettingsDirectory)) $dynamicDefaults
Customization point after all loading (constants, functions, classes, LocalSettings).
Definition Setup.php:249
if(!defined( 'MW_NO_SESSION') &&! $wgCommandLineMode $wgLang
Definition Setup.php:497
$wgConf
$wgConf hold the site configuration.
Definition Setup.php:139
if( $wgServerName !==false) $wgServerName
Definition Setup.php:331
if(!interface_exists(LoggerInterface::class)) $wgCommandLineMode
Pre-config setup: Before loading LocalSettings.php.
Definition Setup.php:132
if(!defined( 'MW_NO_SESSION') &&! $wgCommandLineMode $wgTitle
Definition Setup.php:497
$wgScopeTest
Definition Setup.php:192
if($wgServer===false) if( $wgCanonicalServer===false) $wgVirtualRestConfig['global']['domain']
Definition Setup.php:324
global $wgFullyInitialised
Definition Setup.php:525
global $wgExtensionFunctions
Definition Setup.php:525
$wgSettings
Definition Setup.php:143
const MW_ENTRY_POINT
Definition api.php:41
Abort the web request with a custom HTML string that will represent the entire response.
static runner()
Get a HookRunner instance for calling hooks using the new interfaces.
Definition Hooks.php:173
Show an error that looks like an HTTP server error.
Definition HttpError.php:32
static setup()
Definition MWDebug.php:81
PSR-3 logger instance factory.
A class containing constants representing the names of configuration variables.
This class contains schema declarations for all configuration variables known to MediaWiki core.
Service locator for MediaWiki core services.
Settings sink for values to pass to ini_set.
Utility for loading LocalSettings files.
Utility for loading settings files.
Settings loaded from a PHP file path as an array structure.
Constructs a settings array based on a PHP class by inspecting class members to construct a schema.
Utility for loading site-specific settings in a multi-tenancy ("wiki farm" or "wiki family") environm...
static newFromKey( $key,... $params)
Factory function that is just wrapper for the real constructor.
Definition Message.php:399
static schedulePingback()
Schedule a deferred callable that will check if a pingback should be sent and (if so) proceed to send...
Definition Pingback.php:291
static getMain()
Get the RequestContext object associated with the main request.
Configuration holder, particularly for multi-wiki sites.
Stub object for the global user ($wgUser) that makes it possible to change the relevant underlying ob...
static bool $destructorDeprecationDisarmed
Stub object for the user language.
$wgMemoryLimit
Config variable stub for the MemoryLimit setting, for use by phpdoc and IDEs.
$wgEmergencyContact
Config variable stub for the EmergencyContact setting, for use by phpdoc and IDEs.
$wgSharedTables
Config variable stub for the SharedTables setting, for use by phpdoc and IDEs.
$wgSessionName
Config variable stub for the SessionName setting, for use by phpdoc and IDEs.
$wgLogExceptionBacktrace
Config variable stub for the LogExceptionBacktrace setting, for use by phpdoc and IDEs.
$wgTmpDirectory
Config variable stub for the TmpDirectory setting, for use by phpdoc and IDEs.
$wgNoReplyAddress
Config variable stub for the NoReplyAddress setting, for use by phpdoc and IDEs.
$wgBaseDirectory
Config variable stub for the BaseDirectory setting, for use by phpdoc and IDEs.
$wgSecureLogin
Config variable stub for the SecureLogin setting, for use by phpdoc and IDEs.
$wgLocaltimezone
Config variable stub for the Localtimezone setting, for use by phpdoc and IDEs.
$wgShowExceptionDetails
Config variable stub for the ShowExceptionDetails setting, for use by phpdoc and IDEs.
$wgRequestTimeLimit
Config variable stub for the RequestTimeLimit setting, for use by phpdoc and IDEs.
$wgSharedDB
Config variable stub for the SharedDB setting, for use by phpdoc and IDEs.
$wgCanonicalServer
Config variable stub for the CanonicalServer setting, for use by phpdoc and IDEs.
$wgServer
Config variable stub for the Server setting, for use by phpdoc and IDEs.
$wgPropagateErrors
Config variable stub for the PropagateErrors setting, for use by phpdoc and IDEs.
$wgSharedSchema
Config variable stub for the SharedSchema setting, for use by phpdoc and IDEs.
$wgPasswordSender
Config variable stub for the PasswordSender setting, for use by phpdoc and IDEs.
$wgCookiePrefix
Config variable stub for the CookiePrefix setting, for use by phpdoc and IDEs.
$wgSharedPrefix
Config variable stub for the SharedPrefix setting, for use by phpdoc and IDEs.
$wgPHPSessionHandling
Config variable stub for the PHPSessionHandling setting, for use by phpdoc and IDEs.
const MW_CONFIG_CALLBACK
Definition install.php:30
$debug
Definition mcc.php:31
A helper class for throttling authentication attempts.