ホームページ  >  記事  >  バックエンド開発  >  mediawiki1.24 ソースコード解析 (1)

mediawiki1.24 ソースコード解析 (1)

WBOY
WBOYオリジナル
2016-08-08 09:26:521709ブラウズ

すべての分析手順は、薄赤色の小さいサイズの 4 の斜体で書かれています。

Index.php

//mediawiki プログラム エントリ

これは MediaWiki のメイン Web エントリ ポイントです。

次に、プログラムのコードの最初の行を見てみましょう。 PHP のバージョンが 5.3.2 以降であるかどうかを確認します。そうでない場合は、ページにエラー メッセージが報告されます。

Php コード

  1. if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 )
  2. / / __DIR__ は PHP5.3+
  3. require dirname(__FILE__) であるため、ここでは dirname(__FILE__) を使用する必要があります ; HPVersionError(
  4. 'index.php'
  5. ); }
次は、より重要なコードです。PHP ファイル Webstart.php を導入します。

Php コード

require
    __DIR__ .
  1. '/includes/WebStart.php' * これは Web リクエストの初期設定を行います。 * ある程度の効果はありますセキュリティチェック、プロファイラの起動、 * 設定のロード、そしてオプションで

* MW_NO_SETUP が定義されているかどうかに応じて Setup.php をロードします。

* Setup.php (ロードされている場合) 次に、GlobalFunctions をセットアップします。 、AutoLoader、

*、および構成グローバル(ただし$wgTitleではありません)。

WebStart.php ファイルのアノテーション部分は上記のとおりです。大まかに言うと、次の操作が実行されます。このファイルは、Web リクエストの設定を初期化するためのものです。つまり、セキュリティ チェックを実行し、デバッグを有効にし、構成ファイルにグローバル変数と定数をロードします。最後に、mediawiki がインストールされていない場合は、setup.php を呼び出して mediawiki をインストールします。このファイルは、Defines.php (定数)、LocalSettings.php (設定ファイル、グローバル変数) を呼び出し、設定に従ってここで文字バッファーも開きます。コールバック メソッドは、OutputHandler.php の wfOutputHandler メソッドです。

Phpコード

if

( ini_get(

'register_globals'

) ) {

die

(

'MediaWiki はサポートしていませんregister_globals が有効になっているインストール。

'無効にする方法については、'
    );
  1. PHP 設定項目 register_globals が開いている (ON) 場合、mediawiki は実行できません。
  2. # バグ 15461: IE8 でコンテンツ スニッフィングをオフにするようにします。他の人はこれを無視する必要があります
  3. # 代替エントリであっても、*常に* 設定されるようにここに追加しています
  4. # ポイントと $wgOut が無効化またはオーバーライドされるとき。
  5. Php コード
  6. header( 'X-Content-Type-Options: nosniff'
  7. ); IE8ターンコンテンツの盗聴はやめてください、皆さんこれを無視してください

phpコード$ wgrequesttime = microtime(true); Phpコード

define(

'MEDIAWIKI'

, true );

  1. 定数mediawikiを定義します
# 作業ディレクトリへのフルパス。

# itludepを作成しますたとえば持つことが可能有効な exc pathin apc

.

# __DIR__ は
  1. symlinked を含みますが、親に対する権限がない場合は realpath
() が false を返します

#ディレクトリ

Phpコード

  1. $IP =
  2. getenv
(

​​'MW_INSTALL_PATH'

);

if (

$IP)

=== false ) { $IP = realpath(' .' ) ?: dirname( __DIR__ );

} PHPの環境変数を取得して、インストール先のディレクトリを取得します。

# プロファイラーをロードします

    Phpコード
  1. require_once"$IP/includes/profiler/Profiler.php" ;
  2. $wgRUstart = wfGetRusage() ?: array();
  3. # プロファイラーを開始します
  4. //StartProfiler.php ファイルは ProfilerStub.php のみを呼び出します。状況に応じて、ProfilerStub.php で定義されている 2 つの主要な関数 wfProfileIn() と wfProfileOut() をデバッグに使用する必要があります。

PHPコード

$wgProfiler

=

array();

if

(

file_exists
    (
  1. "$IP/ StartProfiler.php" ) ) { require
  2. "$IP/StartProfiler.php"; }

... NO_SETUP'

) ) {

require_once

「$IP/includes/セットアップ。 php"

;

}

  1. require_once 多くのファイル: Profiler.php (分析、主に DEBUG デバッグ用途に使用)、AutoLoader.php (クラスマネージャー、 JAVA の SPRING の IOC コンテナ)、Defines.php、StartProfiler.php、DefaultSettings.php、autoload.php、NoLocalSettings.php、OutputHandler.php、Setup.php...
  2. 次はプログラムですビジネス処理入口:
  3. $mediaWiki = newMediaWiki();
  4. $mediaWiki
  5. -> ;run();
  6. メディアウィキ.php
  7. MediaWiki クラスは mediawiki.php で定義されています。これには、Wiki オブジェクトのメソッドが多数含まれています。次に、$mediaWiki オブジェクト用のメモリ領域を開きます。

    Phpコード

    1. publicfunction __construct( IContextSource $context = null ) {
    2. if ( ! $コンテキスト ) {
    3. $ context = RequestContext::getMain();
    4. }
    5. $this->context = $context;
    6. ->設定 =
    7. $context->getConfig(); }
    8. 構築メソッドを通じてリクエストリクエストオブジェクトと設定情報を取得します。

    Php code

    public
    1. function run() { try
    2. //リクエストに遅延リクエストが含まれている場合、前回はシステム動作時間の比較。最後の操作時間が最大リクエスト遅延を超えている場合、タイムアウトが要求されます。
    3. $this->checkMaxLag();
    4. try {
    5. //Keyメソッドで、主に業務フローに関する操作を実行します。
    6. $ this&- & gt; main ();
    7. } catch (ErrorPageerror $ e) {
    8. // バグ 62091: 例外がバブルアップ GUI エラーに接続されている間、
    9. // これらは内部アプリケーション障害ではありません。通常のリクエストと同様に、this
    10. // はコミット、出力の印刷、遅延更新、ジョブ、およびプロファイリングを実行する必要があります。
    11. wfGetLBFactory()-> ;commitMasterChanges();
    12. $e
    13. ->report(); // GUI エラーを表示
    14. }
    15. if ( function_exists( ' fastcgi _finish_request' ) ) {
    16. fastcgi_finish_request();
    17. } $this->triggerJobs(); eace();
    18. } キャッチ(例外 $e
    19. ) {
    20. MWExceptionHandler::handle(
    21. $e);
    22. }
    23. 次に、キーメソッド main() メソッドを入力します
    24. // Ajax リクエストを Ajax ディスパッチャに送信します。
    25. if ( $this
    26. ->config->get(
    27. 'UseAjax' ) && $request
    28. -> ;getVal(
    29. ) 'action', 'view'
    30. ) ==
    31. 'ajax') {
    32. // $wgTitle == null は動作を壊す可能性があるため、ダミーのタイトルを設定します $title = Title::makeTitle( NS_MAIN, 'AJAX' ); $this->context->setTitle(
    33. $wgTi)トレ =
    34. $title
    35. ;
    36. $dispatcher = new AjaxDispatcher(
    37. $this
    38. ->config);えー->アクションを実行 ($this ->context->getUser());
    39. wfProfileOut(
    40. __METHOD__);

      AJAX リクエストが有効かどうか、リクエストの $action 値が ajax であるかどうかを確認し、Ajax リクエストを Ajax ディスパッサ プロセッサに送信します。

      ユーザーのforceHTTPSがtrueに設定されている場合、またはユーザー

      //がHTTPSを必要とするグループに属している場合、またはHTTPS

      //設定が設定されている場合は、HTTPSにリダイレクトします。

      // 注: $wgTitle がセットアップされた後にこれを実行してください。そうでない場合、フックは次から実行されます

      // isLoggedIn() はあらゆる種類の奇妙なことを実行します。

      Php コード

      1. if (
      2. $request->getProtocol() == 'http' &&
      3. (
      4. ...
      5. wfProfileアウト( __METHOD__ );
      6. return;
      7. }
      8. }

      forcehttpsがtrueに設定され、httpsアクセスが使用される場合、リダイレクト処理

      PHP コード

      1. if ( $this->config->get( 'UseFileCache' ) && $title->getNamespace() >= 0 ) {
      2. wfProfileIn( 'main-try-filecache' );
      3. ...
      4. wfProfileOut( 'main-try-filecache' ); 構成がファイル キャッシュ機能を有効にしているかどうかを確認します。名前空間が 1 以上の場合は、ファイル キャッシュ メカニズム関連の関数を使用します

      名前空間の値

      名前空間の値の意味

      。 5Test_talk: Image: 7Image_talk: 8メディアウィキ:

      - 1

      スペシャル:

      1

      トーク:

      2

      ユーザー: ser_talk:

      MediaWiki_talk:

      10

      テンプレート:

      11

      Template_talk:

      ヘルプ: Help_talk:

      14

      カテゴリー:

      15

      Category_talk:

      16

      ONLINEPAY

      // 実際にリクエストの処理を実行し、出力を構築します

      Php コード

      1. $this->performRequest();

      処理中ジョブをリクエストして出力をビルドします。このメソッドは出力オブジェクト $output を生成します。このオブジェクトには、さまざまな出力結果を設定するための対応するメソッドがあります。

      Php コード

      1. wfProfileIn( __METHOD__ );

      メソッドの最初の文は、mediawiki の基本的なメソッドのエントリに次の文があることがわかりました、そして wfProfileOut( __私が現れるその後 THOD__ ) 追跡 DEBUG モードを開始した後、対応するデータを出力することがわかります。印刷方法を有効にし、LocationSettings.php で $wgDebugLogFile=d:a.txt 値を設定します。注: wfProfileIn と wfProfileOut はペアで指定する必要があります。ペアで指定しないと、エラーが発生します。また、デバッグ情報の出力順序は、最初に wfProfileIn と wfProfileOut の一致したペアのデバッグ情報を出力します。つまり、wfProfileOut が見つかった場合にのみデバッグ情報が出力され、wfProfileIn は出力されません。 。

      PHP コード

      1. if ( $request->getVal( 'printable' ) === 'yes' ) {
      2. $出力- >setPrintable();
      3. }

      リクエストに印刷リクエストがあるかどうかを判断します。その場合は、出力オブジェクト内でマークしてください。

      Phpコード

      1. $unused = null; // 参照渡しするには
      2. wfRunHooks('BeInitialforeize' , array ( &$タイトル, &$unused, &$output, &$user, $request, $this ) );

      は、リクエスト オブジェクトを通じて初期化前チェックを実行します。これはシステム フック プログラムであり、BeforeInitialize メソッドを実装するプラグインが必要です。全文検索では、このメソッドの具体的な実践例は見つかりませんでした。

      // このページを読むためのユーザーの権限を確認してください。

      // 特別なページなどをキャッチするには、ここを確認する必要があります。

      // Article::view() で再度確認します。

      Phpコード

      1. $permErrors = $title->isSpecial( 'RunJobs' )
      2. ? // HMAC 鍵署名のみに依存します
      3. :
      4. $title->getUserPermissionsErrors('read', $user);
      5. if(count($permエラー) ) ) {
      タイトルに基づいて、ユーザーがページにアクセスするための読み取り権限を持っているかどうかを判断します。権限が不十分な場合は、アイテム ページを構築して戻ります。

      // すべての DB 更新と遅延更新が行われるか、何も行われないかのどちらかです。

      // 後者はクライアントの切断によりキャンセルされるべきではありません。

      Php コード

        ignore_user_abort( true );

        PHPが提供する関数をtrueに設定すると、ユーザーからの切断を無視します。 PHP は、クライアントに情報を送信しようとするまで、ユーザーが切断したかどうかを検出しません。

        //ここでトランザクションをコミットします

        //output() の後に報告されていないエラーが DB トランザクション全体をロールバックしないようにします

        Php コード

        1. wfGetLBFactory()- >commitMasterChanges();

        エラーがある場合は送信され、ロールバックされます。

        //すべてを出力します!

        Phpコード

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

        ページ出力フロントページに移動します。この文より前のすべてのデータにはスタイルがありません。 Word コードを実行すると、返されるデータ型に応じて異なるスキンが追加されます。

        Phpコード

        1. wfProfileOut(__METHOD__); 以上、mediawiki1.24 のソースコード解析 (1) を内容も含めて紹介しましたので、PHP チュートリアルに興味のある友人の参考になれば幸いです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。