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