Heim  >  Artikel  >  Backend-Entwicklung  >  mediawiki1.24 Quellcode-Analyse (1)

mediawiki1.24 Quellcode-Analyse (1)

WBOY
WBOYOriginal
2016-08-08 09:26:521755Durchsuche

Alle Analyseanweisungen sind in hellroter, kleiner Kursivschrift in 4-Größe geschrieben.

Index.php

//mediawiki-Programmeintrag

Dies ist der Hauptwebeintrag Punkt für MediaWiki.

Besuchen Sie nun die erste Codezeile des Programms, um festzustellen, ob die PHP-Version 5.3.2 oder höher ist. Auf der Seite wird eine Fehlermeldung angezeigt.

PHP-Code

  1. if ( !function_exists( 'version_compare' ) ||. version_compare( PHP_VERSION, '5.3.2' ) < ) {
  2. // Wir müssen dirname( __FILE__ ) hier, weil __DIR__ PHP5.3 ist
  3. require dirname( __FILE__ ) .'/includes/PHPVersionError. php'; 🎜>
  4. Der nächste Schritt ist der kritischere Code, nämlich die Einführung einer PHP-Datei Webstart.php.
  5. PHP-Code

require

__DIR__ .'/includes/WebStart. php'; .

* Es führt einige Sicherheitsüberprüfungen durch, startet den Profiler und lädt die

    * Konfiguration und lädt optional Setup.php abhängig davon, ob
  1. * MW_NO_SETUP definiert ist.
  2. * Setup.php (falls geladen) richtet dann GlobalFunctions, den AutoLoader, ein ,

* und die Konfigurationsglobals (allerdings nicht $wgTitle).

WebStart .php< Die Dateianmerkungen von 🎜> sind wie oben. Man kann sagen, dass die von dieser Datei ausgeführte Operation darin besteht, Einstellungen für eine Webanforderung zu initialisieren: Sicherheitsprüfungen durchführen, Debuggen aktivieren und globale Variablen und Konstanten laden die Konfigurationsdatei. Wenn Mediawiki noch nicht installiert ist, rufen Sie schließlich setup.php auf, um Mediawiki zu installieren. Diese Datei ruft Defines.php (Konstanten) und LocalSettings.php (Konfigurationsdatei, globale Variablen) auf und öffnet hier auch den Zeichenpuffer entsprechend der Konfiguration. Die Rückrufmethode ist die wfOutputHandler-Methode von OutputHandler.php.

PHP-Code

if (

ini_get

( 'register_globals' ) ) {

sterben (

'MediaWiki unterstützt keine Installationen, bei denen register_globals aktiviert ist. '

.

'Bitte beachten Sie mediawiki.org '

  1. . 'für Hilfe zum Deaktivieren.' ); }
  2. Wenn das PHP-Konfigurationselement register_globals aktiviert ist, kann mediawiki nicht ausgeführt werden .
  3. # Fehler 15461: Alle anderen sollten dies ignorieren 🎜># Wir fügen es hier hinzu, damit es *immer* gesetzt ist, auch für alternative Eingaben
  4. # Punkte und wenn $wgOut deaktiviert oder überschrieben wird.
  5. PHP-Code
header( 'X-Content-Type-Options: nosniff'

);

Deaktivieren Sie Content Sniffing für IE8, jeder sollte dies ignorieren

PHP-Code

  1. $wgRequestTime = microtime( true ); Die Funktion

gibt den aktuellen Unix-Zeitstempel und die Mikrosekunden zurück.

PHP-Code

  1. unset( $IP );

Registrierung der Variablen aufheben, die $IP definiert

PHP-Code

  1. define('MEDIAWIKI', true );

Definieren Sie ein konstantes Mediawiki

# Vollständiger Pfad zum Arbeitsverzeichnis.

# Ermöglicht beispielsweise einen effektiven Ausschlusspfad in apc.

# __DIR__ bricht symlinked ein, aber realpath() gibt false zurück

# wenn wir keine Berechtigungen für übergeordnete Verzeichnisse haben.

PHP-Code 🎜>$IP

= getenv
    (
  1. 'MW_INSTALL_PATH' ); if ( $IP
  2. === false ) {
  3. $IP = realpath
  4. (
  5. '.' ) ?: dirname( __DIR__ ); }
  6. Rufen Sie das Installationsverzeichnis ab, indem Sie die PHP-Umgebungsvariable abrufen.

# Profiler laden

PHP-Code

require_once

"$IP/includes/profiler/Profiler.php"
    ; >$wgRUstart
  1. = wfGetRusage() ?: array();
  2. ...# Profiler starten
//In der Datei StartProfiler.php wird nur ProfilerStub.php aufgerufen. Je nach Kontext sollten zum Debuggen die beiden in ProfilerStub.php definierten Hauptfunktionen wfProfileIn() und wfProfileOut() verwendet werden.

PHP-Code

$wgProfiler =

array() ;

    if
  1. ( file_exists( "$IP/StartProfiler.php" ) ) {
  2. erforderlich"$IP/StartProfiler.php"; 🎜>...
  3. if ( !defined( 'MW_NO_SETUP' ) ) {
  4. require_once"$IP/includes /Setup.php"
  5. ; >
  6. require_once viele Dateien: Profiler.php (analysieren, hauptsächlich für DEBUG-Debugging verwendet) , AutoLoader.php (Klassenverwaltungscontainer, ähnlich dem IOC-Container von SPRING in JAVA), Defines.php, StartProfiler.php, DefaultSettings.php, autoload.php, NoLocalSettings.php, OutputHandler.php, Setup.php...
  7. Dann kommt der Programm-Geschäftsverarbeitungseingang:
  8. PHP-Code
$mediaWiki

= neuMediaWiki();

$mediaWiki

->run() ;

Mediawiki.php

Die MediaWiki-Klasse ist in mediawiki.php definiert. Es enthält viele Methoden von Wiki-Objekten. Öffnen Sie dann Speicherplatz für das $mediaWiki-Objekt.

PHP-Code

  1. öffentlicheFunktion __construct( IContextSource $context = null ) {
  2. if ( !$context ) {
  3. $context = RequestContext::getMain();
  4. } >
  5. $this-> ;context = $context
  6. ;
  7. $this- >config = $context
  8. ->getConfig( );
  9. } Erhalten Sie über die Konstruktionsmethode das Anforderungsanforderungsobjekt und die Konfigurationsinformationen.
PHP-Code

öffentlichfunction

run() {

try {
  1. //Wenn die Anfrage eine verzögerte Anfrage enthält , Vergleichen Sie mit der letzten Betriebszeit des Systems. Wenn die Zeit des letzten Vorgangs länger als die maximale Anforderungsverzögerung ist, wird eine Zeitüberschreitung angezeigt.
  2. $this->checkMaxLag();
  3. try {
  4. //Schlüsselmethode, die hauptsächlich Vorgänge im Zusammenhang mit dem Geschäftsablauf ausführt.
  5. $this->main();
  6. } Catch ( ErrorPageError $ e ) {
  7. // Fehler 62091: Während Ausnahmen häufig dazu führen, dass GUI-Fehler auftreten,
  8. // Es handelt sich nicht um interne Anwendungsfehler.
  9. // sollte festgeschrieben werden, die Ausgabe drucken, verzögerte Aktualisierungen durchführen, Jobs und Profilerstellung.
  10. wfGetLBFactory()->commitMasterChanges();
  11. $e ->report(); // GUI-Fehler anzeigen
  12. }
  13. if ( function_exists( 'fastcgi_finish_request' ) ) {
  14. fastcgi_finish_request();
  15. } $this
  16. ->triggerJobs();
  17. $this->restInPeace(); 🎜>
  18. } Catch ( Ausnahme $e ) {
  19. MWExceptionHandler::handle( $e );
  20. } } >
  21. // Ajax-Anfragen an den Ajax-Dispatcher senden .
  22. if
  23. (
  24. $ this->config->get( 'UseAjax'
  25. ) &&
  26. $request->getVal( 'action'
  27. ,
  28. 'view' ) == 'ajax' ) {
  29. // Legen Sie einen Dummy-Titel fest, da $wgTitle == null möglicherweise Probleme verursacht $title = Title::makeTitle( NS_MAIN, 'AJAX' );
  30. $this
  31. ->context->setTitle(
  32. $title );
  33. $wgTitle = $title; >$dispatcher = new AjaxDispatcher(
  34. $this
  35. ->config ); $dispatcher ->performAction(
  36. $this
  37. ->context->getUser() ); wfProfileOut( __METHOD__ );
  38. zurück
  39. ;

    Bestimmen Sie, ob AJAX-Anfragen aktiviert werden sollen und der $action-Wert in der Anfrage Ajax ist, und senden Sie dann die Ajax-Anfrage an den Ajax-Dispather-Prozessor.

    Wenn für den Benutzer „forceHTTPS“ auf „true“ gesetzt ist oder wenn der Benutzer

    // zu einer Gruppe gehört, die HTTPS benötigt, oder wenn dies der Fall ist die HTTPS

    //-Einstellung festlegen, leiten Sie sie zu HTTPS um.

    // Hinweis: Führen Sie dies aus, nachdem $wgTitle eingerichtet wurde, andernfalls Hooks laufen von

    // isLoggedIn() wird alle möglichen seltsamen Dinge tun.

    PHP-Code

    1. if (
    2. $request->getProtocol() == ' http' &&
    3. (
    4. ... >__METHOD__ );
    5. return; 🎜>} 
    6. Wenn forcehttps auf true gesetzt ist und https-Zugriff verwendet wird, wird eine erneute Elementverarbeitung durchgeführt
    7. PHP-Code

    wenn ( $this

    ->config ->get(

    'UseFileCache' ) && $title

    ->getNamespace() >= 0 ) {

    wfProfileIn( 'main-try-filecache'
      );
    1. ... wfProfileOut( 'main-try-filecache' );
    2. }
    3. Bestimmen Sie, ob die Konfiguration die Datei-Cache-Funktion aktiviert, und benennen Sie sie. Wenn der Speicherplatz größer oder gleich 1 ist, verwenden Sie die Funktionen für den Datei-Caching-Mechanismus
    4. .
    Namespace-Wert

    Namespace-Wertbedeutung

    Test_talk :   Bild:                                              89101112131415
    -1

    Spezial: 

    0

    Vorlage: 

    1

    Talk:  

    2

    Benutzer:  

    3

    User_talk:  

    4

    Test:

    5

    6

    Image_talk: 

    MediaWiki:  

    MediaWiki_talk:

    Vorlage: 

    Template_talk:

    Hilfe:  

    Help_talk:  

    Kategorie:  

    Category_talk:  

    16

    ONLINEPAY

    // Erledige tatsächlich die Arbeit der Anfrage und baue eine beliebige Ausgabe auf

    PHP-Code

    1. $this->performRequest(); Arbeit und Build-Ausgabe. Diese Methode generiert ein Ausgabeobjekt $output. Dieses Objekt verfügt über entsprechende Methoden zum Festlegen verschiedener Ausgabeergebnisse.

    PHP-Code

    wfProfileIn(

    __METHOD__

    );
    1. Im ersten Satz der Methode wird festgestellt, dass der grundlegende Methodeneintrag in Mediawiki diesen Satz enthält. Danach erscheint wfProfileOut( __METHOD__ ). Modus werden die entsprechenden Daten ausgedruckt. Aktivieren Sie die Druckmethode und legen Sie den Wert
    2. $wgDebugLogFile=d:a.txt
    in LocationSettings.php fest. Hinweis: wfProfileIn und wfProfileOut müssen paarweise erscheinen, sonst tritt ein Fehler auf. Darüber hinaus lautet die Ausgabereihenfolge der Debugging-Informationen: Geben Sie zuerst die Debugging-Informationen des übereinstimmenden Paares von wfProfileIn und wfProfileOut aus, dh geben Sie die Debugging-Informationen nur aus, wenn wfProfileOut angetroffen wird, nicht wfProfileIn. .

    PHP-Code

    if

    ( $request
      -> ;getVal(
    1. 'printable' ) === 'yes' ) { $output-> setPrintable();
    2. }
    3. Bestimmen Sie, ob die Anfrage eine Druckanforderung hat. Wenn ja, markieren Sie es im Ausgabeobjekt.

    PHP-Code

    $unused

    = null; // Zum Bestehen es durch Referenz
    1. wfRunHooks( 'BeforeInitialize', array
    2. ( &
    3. $title, &$unused, &$output, &$user, $request, $this ) ); Führen Sie Vorinitialisierungsprüfungen über das Anforderungsobjekt durch. Dies ist ein System-Hook-Programm und sollte ein Plug-in zur Implementierung der BeforeInitialize-Methode erfordern. Meine Volltextsuche hat keine konkreten praktischen Beispiele für diese Methode gefunden.
    // Überprüfen Sie die Berechtigungen des Benutzers zum Lesen dieser Seite.

    // Wir müssen hier überprüfen, um spezielle Seiten usw. zu erkennen.

    // Wir werden es noch einmal in Article::view() prüfen.

    PHP-Code

    $permErrors

    = $title
      ->isSpecial(
    1. 'RunJobs' ) ? array() // verlässt sich allein auf die HMAC-Schlüsselsignatur
    2. : $title->getUserPermissionsErrors( 'read'
    3. ,
    4. $user ); if ( count
    5. (
    6. $permErrors ) ) { Bestimmen Sie anhand des Titels, ob der Benutzer eine Leseberechtigung für den Zugriff auf die Seite hat. Wenn die Berechtigungen nicht ausreichen, erstellen Sie die Artikelseite und kehren Sie zurück.

    // Entweder sollten alle DB- und verzögerten Aktualisierungen erfolgen oder keine.

    // Letzteres sollte nicht aufgrund einer Client-Verbindungsunterbrechung abgebrochen werden.

    PHP-Code

    ignore_user_abort( true );

      Die von PHP bereitgestellte Funktion ignoriert, wenn sie auf „true“ gesetzt ist, die Trennung vom Benutzer. PHP erkennt nicht, ob der Benutzer die Verbindung getrennt hat, bis er versucht, Informationen an den Client zu senden.

      // Jetzt alle Transaktionen festschreiben, damit nicht gemeldete Fehler nach

      // Output() nicht die gesamte DB-Transaktion zurücksetzen

      PHP-Code

      1. wfGetLBFactory()->commitMasterChanges();

      Bei Fehlern werden Dinge übermittelt und zurückgesetzt.

      //Alles ausgeben!

      PHP-Code

      1. $this->context->getOutput()->output();

      Die Seite wird auf der Startseite ausgegeben , hier Alle Daten vor dem Satz tragen keine Stile. Durch die Ausführung von Word-Code werden je nach Rückgabedatentyp unterschiedliche Skins hinzugefügt.

      PHP-Code

      1. wfProfileOut( __METHOD__ );

      Das Obige stellt die Quellcode-Analyse von mediawiki1.24 vor (1), einschließlich des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn