Extension:Memcached/uk

From MediaWiki.org
Jump to navigation Jump to search
Довідка про розширення MediaWiki
OOjs UI icon advanced.svg
Memcached
Статус релізу: стабільний
Реалізація Special page
Опис Надає інтерфейс для перевірки роботи служби Memcached на сервері.
Автор(и) UA2004
Найновіша версія 1.0.1 (2014-01-04)
MediaWiki 1.19+
Зміни в БД No
Ліцензія gplv2+
Завантажити See the code section
memcached
Translate the Memcached extension if it is available at translatewiki.net
Переглянути використання

Опис[edit]

Коли я встановив memcached на своєму вікі-сервері, то довелося регулярно перевіряти, чи працює ця служба як слід, чи її треба перезапустити. Іноді вона "вилітала", і через це вікі відкривалася дуже довго, що не могло не дратувати. Я припустив, що це стається, якщо memcached працює багато днів без перерви. Тому я створив завдання cron, яке перезапускає memcached раз на добу. Це мало бути рішенням проблеми з "вилітанням". Але що, як вона "вилетить" задовго до того, як cron її перезапустить? Усі користувачі повинні чекати цілий день.

Отже, мені доводилося щодня заходити на сервер через SSH і перевіряти, чи працює memcached. Проте нудно щоразу вводити логін і пароль. Має бути простіший спосіб. Спершу я знайшов PHP-скрипт, який перевіряє статус роботи memcached. Він був хорошим, але кожен, хто знав назву файлу, міг його запустити. З метою безпеки, ми не хочемо, щоб кожен зустрічний бачив IP та порт нашого(-их) сервера(-ів) memcached. Тоді я прийшов до висновку: треба зробити цей скрипт у вигляді розширення для MediaWiki, яке буде доступно лише адміністраторам вікі.

Не знайшовши жодного розширення, пов'язаного з memcached (і це ганьба, адже, скажімо, розширення для перевірки APC існує вже давно), я вирішив створити власне. Вже довгий час я редагував готові розширення MediaWiki для своїх потреб, але ніколи не створював власні з нуля. Це моє перше розширення, тому пропозиції вітаються.

Використання[edit]

Спершу вам потрібно інсталювати memcached і вказати сервер(-и) у $wgMemCachedServers. Також не забудьте встановити розширення memcache для PHP (не плутайте з memcached, яке наразі не підтримується).

Після цього відкрийте сторінку Special:Memcached, і ви побачите список ваших серверів memcached та їхній статус (працює, не працює або memcached не знайдено на сервері).

**Примітка: Теоретично, це розширення повинно працювати на версіях MediaWiki, старіших ніж 1.19, але це не перевірялося.

Завантаження[edit]

Оскільки я зайнятий багатьма різними проектами, у мене немає часу розбиратися з git-репозиторієм MediaWiki. Це розширення наразі складається лише з двох файлів, тому мені простіше викласти їх тут.

Скопіюйте файли у розділі #Код і вставте їх у папку 'Memcached' у папці з вашими розширеннями.

Встановлення[edit]

Installation[edit]

  • Add the following code at the bottom of your LocalSettings.php:
    require_once "$IP/extensions/Memcached/Memcached.php";
    
  • Yes Готово – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.

Нові права користувачів[edit]

  • memcached - право переглядати сторінку Special:Memcached. За промовчанням, це право мають лише бюрократи. Але ви можете це змінити, якщо забажаєте.

Код[edit]

Memcached.php[edit]

<?php
/**
 * A Memcached extension for MediaWiki
 * Originally written for ZeWiki
 * Provides an interface for checking if memcached is working fine
 *
 * @link https://www.mediawiki.org/wiki/Extension:Memcached Documentation
 * @link https://www.mediawiki.org/wiki/Extension_talk:Memcached Support
 *
 * @author UA2004 <ua2004 at ukr.net> for ZeWiki.com
 * @copyright Copyright (C) 2013, UA2004
 * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
 */

if ( !defined( 'MEDIAWIKI' ) ) die();

define( 'Memcached_VERSION', '1.0.1' );

$wgExtensionCredits['specialpage'][] = array(
        'path'           => __FILE__,
	'name'           => 'Memcached',
	'author'         => 'UA2004',
	'url'            => 'https://www.mediawiki.org/wiki/Extension:Memcached',
	'version'        => Memcached_VERSION,
	'descriptionmsg' => 'memcached-desc',
);

$wgSpecialPages['Memcached'] = 'SpecialMemcached';
$wgSpecialPageGroups['Memcached'] = 'wiki';
$wgExtensionMessagesFiles['Memcached'] = dirname(__FILE__) . '/Memcached.i18n.php';

$wgAvailableRights[] = 'memcached';
$wgGroupPermissions['*']['memcached'] = false;
$wgGroupPermissions['bureaucrat']['memcached'] = true;


class SpecialMemcached extends SpecialPage {
	const MEMC_OK = 1;
	const MEMC_ERROR = 0;
	const MEMC_NOT_FOUND = -1;

	public function __construct() {
		parent::__construct('Memcached');
	}

	public function execute() {
		global $wgOut, $wgRequest, $wgUser, $wgMemc, $wgMemCachedServers;

		wfProfileIn(__METHOD__);

		$this->setHeaders();
		$this->mTitle = SpecialPage::getTitleFor('Memcached');

		if (!$wgUser->isAllowed( 'memcached' )) {
			$this->displayRestrictionError();
			wfProfileOut(__METHOD__);
			return;
		}
		
		if (class_exists('Memcache')) {
			if(empty($wgMemCachedServers)) {
				$wgOut->addHTML('<h3>'.wfMsg('memcached-servers-not-set').'</h3>');
			}
			else {
				$wgOut->addHTML(Xml::openElement('table', array('border'=>1)));
				foreach($wgMemCachedServers as $server) {
					switch($this->testMemcachedServer( $server )) {
						case self::MEMC_OK:
							$message = wfMsg('memcached-works');
							$color = '#84eb82';
							break;
						case self::MEMC_ERROR:
							$message = wfMsg('memcached-not-working');
							$color = '#ffde46';
							break;
						case self::MEMC_NOT_FOUND:
							$message = wfMsg('memcached-not-found');
							$color = '#fe7f7a';
							break;
					}
					$wgOut->addHTML(Xml::openElement('tr', array('style'=>'background-color:'.$color)));
					$wgOut->addHTML(Xml::openElement('td'));
					$wgOut->addHTML($server);
					$wgOut->addHTML(Xml::closeElement('td'));
					$wgOut->addHTML(Xml::openElement('td'));
					$wgOut->addHTML($message);
					$wgOut->addHTML(Xml::closeElement('td'));
					$wgOut->addHTML(Xml::closeElement('tr'));
				}
				$wgOut->addHTML(Xml::closeElement('table'));
			}
		}
		else {
			$wgOut->addHTML('<h3>'.wfMsg('memcached-pecl-not-found').'</h3>');
		}

		wfProfileOut(__METHOD__);
	}
	
	public function testMemcachedServer( $server ) {
		wfProfileIn(__METHOD__);
		
		$memcache = new Memcache;
		$isMemcacheAvailable = @$memcache->connect($server);

		if ($isMemcacheAvailable) {
			$key = wfMemcKey( 'zewiki', 'special', 'memcached', 'test' );
			$aData = $memcache->get($key);
			if ($aData) {
				return self::MEMC_OK;
			} else {
				$aData = array(
					'me' => 'you',
					'us' => 'them',
				);
				$memcache->set($key, $aData, 0, 300);
				$aData = $memcache->get($key);
				if ($aData) {
					return self::MEMC_OK;
				} else {
					return self::MEMC_ERROR;
				}
			}
		}
		else {
			return self::MEMC_NOT_FOUND;
		}
		
		wfProfileOut(__METHOD__);
	}
}

Memcached.i18n.php[edit]

<?php
/**
 * Internationalization file for Memcached extension
 */

$messages = array();

/** English
 * @author UA2004
 */
$messages['en'] = array(
	'memcached' => 'Memcached',
	'memcached-desc' => 'Provides an interface for checking if Memcached is working fine',
	'memcached-data-received' => 'Test data got from Memcached successfully!',
	'memcached-data-set' => 'Test data written in Memcached! Please refresh the page to see if it is working properly.',
	'memcached-works' => 'Memcached seems to be working fine!',
	'memcached-not-working' => 'Memcached DOES NOT seem to be working! Please restart it.',
	'memcached-not-found' => 'Memcached is not available on this server!',
	'memcached-pecl-not-found' => 'Memcache PECL is not available on this server!',
	'memcached-servers-not-set' => 'Memcached servers not set! Please add them into <b>$wgMemCachedServers</b> setting in your LocalSettings.php file.',
);

/** German (Deutsch)
 * @author Kghbln
 */
$messages['de'] = array(
	'memcached' => 'Memcached',
	'memcached-desc' => 'Stellt ein Interface zur Überprüfung des Status von Memcached bereit',
	'memcached-data-received' => 'Die Testdaten wurden erfolgreich von Memcached abgerufen.',
	'memcached-data-set' => 'Die Testdaten wurden an Memcached übermittelt. Bitte den Seitencache leeren, um zu prüfen, ob Memcached problemlos funktioniert.',
	'memcached-works' => 'Memcached scheint problemlos zu funktioieren.',
	'memcached-not-working' => 'Memcached scheint nicht problemlos zu funktioieren und sollte neu gestartet werden.',
	'memcached-not-found' => 'Memcached ist nicht auf dem Server verfügbar.',
	'memcached-pecl-not-found' => 'Memcache PECL ist nicht auf dem Server verfügbar.',
	'memcached-servers-not-set' => 'Die Memcached-Sever wurden nicht für MediaWiki konfiguriert. Der Parameter <code>$wgMemCachedServers</code> muß noch zur Datei „LocalSettings.php“ hinzugefügt werden.',
);

/** Ukrainian (українська)
 * @author UA2004
 */
$messages['uk'] = array(
	'memcached' => 'Memcached',
	'memcached-desc' => 'Надає інтерфейс для перевірки роботи служби Memcached на сервері',
	'memcached-data-received' => 'Тестові дані успішно зчитано з Memcached!',
	'memcached-data-set' => 'Тестові дані записано у Memcached! Будь ласка, оновіть сторінку, щоб побачити чи служба працює належним чином.',
	'memcached-works' => 'Служба Memcached працює!',
	'memcached-not-working' => 'Служба Memcached НЕ працює! Перезапустіть її, будь ласка.',
	'memcached-not-found' => 'Службу Memcached не знайдено на цьому сервері!',
	'memcached-pecl-not-found' => 'Розширення PECL memcache не знайдено на цьому сервері!',
	'memcached-servers-not-set' => 'Сервери Memcached не вказано! Будь ласка, додайте їх у змінну <b>$wgMemCachedServers</b> у файлі LocalSettings.php.',
);

Див. також[edit]

Інші мови: English  • українська