Jump to content

Extension:PerformanceMonitor

From mediawiki.org
This page is a translated version of the page Extension:PerformanceMonitor and the translation is 100% complete.
MediaWiki manüel uzantıları
PerformanceMonitor
Sürüm durumu: bakımsız
Uygulama Özel sayfa , Vikim
Açıklama Profiller, Json günlük dosyalarındaki MediaWiki'yi arar ve sonuçlara göz atmak, görselleştirmek, ayrıntıya inmek ve karşılaştırmak için özel bir sayfa sunar
Yazar(lar) Achim Bode (Achimbodemesaj)
En son sürüm 0.1.0 (2014-05-09)
MediaWiki 1.20 - 1.25
PHP 5.3+
Lisans GNU Genel Kamu Lisansı 2.0
İndir

PerformanceMonitor uzantısı, sunucunuzdaki PHP işlevlerinin ve yöntemlerinin çalışmasını belirler. Bu "profiller" (yani günlük dosyaları) dosya sisteminde Json-Trees olarak saklanır. Profil oluşturduktan sonra, sonuçları diyagram olarak görselleştirmek için Special:PerformanceMonitor özel sayfası özelliğini kullanabilirsiniz. Diyagramlar daha ayrıntılı seviyelere inmeye izin verir ve sunucu her zaman beklediğiniz her şeyi gösterir.

Teknik olarak uzantı görselleştirme için InfoVis adında bir javascript kütüphanesi kullanır ve bunu ayrı olarak indirip uzantı klasörünün içine koymanız gerekir.

İndir

PerformanceMonitor'ü indirin

Bu uzantının kodu GitHub adresinden indirilebilir. /extensions/PerformanceMonitor klasörüne koyun.

InfoVis Araç Setini indirin

InfoVis Toolkit'i http://philogb.github.io/jit/downloads/Jit-2.0.1.zip adresinden indirin ve uzantının /extensions/PerformanceMonitor/js-includes/jit-2.0.1 klasörüne yerleştirin.

Bootstrap Kütüphanesini İndirin

Bootstrap Kitaplığını http://getbootstrap.com/getting-started/ adresinden indirin ve uzantının /extensions/PerformanceMonitor/js-includes/bootstrap-3.1.1-dist klasörüne koyun.

Kurulum

LocalSettings.php

$wgLanguageCode = 'en'; // other languages untested

// the following were my settings during development,
// you probably do not need all of it...:

error_reporting( 1 );
ini_set( 'display_errors', 1 );

$wgDebugLogFile = '$IP/DebugLogFile.log';
// myWiki/DebugLogFile.log must exist and have the server must have write access

$wgDebugToolbar = false;
$wgShowSQLErrors = true;
$wgDebugDumpSql  = true;
$wgShowDBErrorBacktrace = true;

$wgRawHtml = true;
$wgAllowUserJS = true;
$wgDisableOutputCompression = false; // Debug javascript: $wgDisableOutputCompression = true;
$wgResourceLoaderDebug = false; // Debug javascript: $wgResourceLoaderDebug = true;

// include the Extension:
require_once( "$IP/extensions/PerformanceMonitor/PerformanceMonitor.php" );
// PerformanceMonitor: Don't forget to adapt StartProfiler.php!!!
$egPerformanceMonitorServerName = "Propellerbook"; // whatever is the name of your server
$egPerformanceMonitorExtensionPath = "/Applications/MAMP/htdocs/mediawiki-1.20.8/extensions/PerformanceMonitor/";
$egPerformanceMonitorLogfilesPath = "/Applications/MAMP/htdocs/mediawiki-1.20.8/logs/autologs/"; // make sure to configure this folder writable your server

use /index.php5/Main_Page

$wgScriptPath       = "";
$wgScriptExtension  = ".php5";

instead of /wiki/Main_Page

$wgScriptPath       = "";
$wgScriptExtension  = ".php5";
$wgArticlePath      = "/wiki/$1";
$wgUsePathInfo      = true; // Enable use of pretty URLs

StartProfiler.php

StartProfiler.php dosyası vikinin ana klasöründe bulunur, yani LocalSettings.php ile aynıdır. Varsa, geçerli kodu yorumlayın ve aşağıdaki kodu ekleyin. Aksi takdirde oluşturun ve aşağıdakileri içine koyun:

<?php
require_once( dirname(__FILE__).'/includes/profiler/ProfilerSimple.php' );
$monitorPath = "/Applications/MAMP/htdocs/mediawiki-1.20.8/extensions/PerformanceMonitor/";
require_once( $monitorPath . "ProfilerSimpleJson.php" );
$wgProfiler['class'] = 'ProfilerSimpleJson';

ProfilerSimple.php

ProfilerSimple.php dosyasının "MediaWiki 1.25 profili tamamen yeniden yazıldığında" son MediaWiki sürümlerinden birinde kaldırıldığını tespit ettik (Manual:Profiling sayfasına bakın). Eskiden /includes/profiler/ProfilerSimple.php içinde gönderilecek eski dosyayı arkadan bulabilirsiniz (MW 1.20 olmalıdır). Yalnızca bir profile türetmek için kullanıldı, bunun yerine json dosyası oluşturulduğu normal satır satır protokoldür. Bunu MediaWiki'nin daha yeni sürümlerine uyarlamaktan çekinmeyin...

<?php
/**
 * Base class for simple profiling.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @file
 * @ingroup Profiler
 **/

/**
 * Simple profiler base class.
 * @todo document methods (?)
 * @ingroup Profiler
 */
class ProfilerSimple extends Profiler {
	var $mMinimumTime = 0;

	var $zeroEntry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
	var $errorEntry;

	public function isPersistent() {
		/* Implement in output subclasses */
		return false;
	}

	protected function addInitialStack() {
		$this->errorEntry = $this->zeroEntry;
		$this->errorEntry['count'] = 1;

		$initialTime = $this->getInitialTime();
		$initialCpu = $this->getInitialTime( 'cpu' );
		if ( $initialTime !== null && $initialCpu !== null ) {
			$this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu );
			$this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu );

			$this->profileOut( '-setup' );
		} else {
			$this->profileIn( '-total' );
		}
	}

	function setMinimum( $min ) {
		$this->mMinimumTime = $min;
	}

	function profileIn($functionname) {
		global $wgDebugFunctionEntry;
		if ($wgDebugFunctionEntry) {
			$this->debug(str_repeat(' ', count($this->mWorkStack)).'Entering '.$functionname."\n");
		}
		$this->mWorkStack[] = array( $functionname, count( $this->mWorkStack ), $this->getTime(), $this->getTime( 'cpu' ) );
	}

	function profileOut($functionname) {
		global $wgDebugFunctionEntry;

		if ($wgDebugFunctionEntry) {
			$this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
		}

		list($ofname, /* $ocount */ ,$ortime,$octime) = array_pop($this->mWorkStack);

		if (!$ofname) {
			$this->debug("Profiling error: $functionname\n");
		} else {
			if ($functionname == 'close') {
				$message = "Profile section ended by close(): {$ofname}";
				$functionname = $ofname;
				$this->debug( "$message\n" );
				$this->mCollated[$message] = $this->errorEntry;
			}
			elseif ($ofname != $functionname) {
				$message = "Profiling error: in({$ofname}), out($functionname)";
				$this->debug( "$message\n" );
				$this->mCollated[$message] = $this->errorEntry;
			}
			$entry =& $this->mCollated[$functionname];
			$elapsedcpu = $this->getTime( 'cpu' ) - $octime;
			$elapsedreal = $this->getTime() - $ortime;
			if (!is_array($entry)) {
				$entry = $this->zeroEntry;
				$this->mCollated[$functionname] =& $entry;
			}
			$entry['cpu'] += $elapsedcpu;
			$entry['cpu_sq'] += $elapsedcpu*$elapsedcpu;
			$entry['real'] += $elapsedreal;
			$entry['real_sq'] += $elapsedreal*$elapsedreal;
			$entry['count']++;

		}
	}

	public function getFunctionReport() {
		/* Implement in output subclasses */
		return '';
	}

	public function logData() {
		/* Implement in subclasses */
	}

	/**
	 * Get the actual CPU time or the initial one if $ru is set.
	 *
	 * @deprecated in 1.20
	 * @return float|null
	 */
	function getCpuTime( $ru = null ) {
		wfDeprecated( __METHOD__, '1.20' );

		if ( $ru === null ) {
			return $this->getTime( 'cpu' );
		} else {
			# It theory we should use $ru here, but it always $wgRUstart that is passed here
			return $this->getInitialTime( 'cpu' );
		}
	}
}