Extension:Memcached/uk

Довідка про розширення MediaWiki
OOjs UI icon advanced.svg
Memcached
Статус релізу: закинутий
Реалізація Special page
Опис Надає інтерфейс для перевірки роботи служби Memcached на сервері.
Автор(и) UA2004
Найновіша версія 1.0.1 (2014-01-04)
MediaWiki 1.19-1.28
Зміни в БД No
Ліцензія Тип ліцензії не вказано
Завантажити See the code section
memcached
Переглянути використання

The Memcached extension provides an interface for checking if Memcached is working fine.

Опис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, але це не перевірялося.

Download instructionsEdit

Since I'm quite busy with different projects, I've got no time for MediaWiki git stuff. This extension consists of only two files so far and thus it's easier for me to just publish them here.

InstallationEdit

  • Add the following code at the bottom of your LocalSettings.php:
    require_once "$IP/extensions/Memcached/Memcached.php";
    
  •   Готово – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.
User rights
  • memcached - право переглядати сторінку Special:Memcached. За промовчанням, це право мають лише бюрократи. Але ви можете це змінити, якщо забажаєте.

КодEdit

Memcached.phpEdit

<?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',
	'license-name'   => 'GPL-2.0+',
);

$wgSpecialPages['Memcached'] = 'SpecialMemcached';
$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>'.wfMessage('memcached-servers-not-set')->text().'</h3>');
			}
			else {
				$wgOut->addHTML(Xml::openElement('table', array('border'=>1)));
				foreach($wgMemCachedServers as $server) {
					switch($this->testMemcachedServer( $server )) {
						case self::MEMC_OK:
							$message = wfMessage('memcached-works')->text();
							$color = '#84eb82';
							break;
						case self::MEMC_ERROR:
							$message = wfMessage('memcached-not-working')->text();
							$color = '#ffde46';
							break;
						case self::MEMC_NOT_FOUND:
							$message = wfMessage('memcached-not-found')->text();
							$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>'.wfMessage('memcached-pecl-not-found')->text().'</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__);
	}

	protected function getGroupName() {
		return 'wiki';
	}
}

Memcached.i18n.phpEdit

<?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 funktionieren.',
	'memcached-not-working' => 'Memcached scheint nicht problemlos zu funktionieren 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.',
);

/** French
 * @author cybernaute
 */
$messages['fr'] = array(
        'memcached' => 'Memcached',
        'memcached-desc' => 'Fournit une interface pour vérifier le fonctionnement de Memcached',
        'memcached-data-received' => 'Données tests Memcached obtenues avec succès !',
        'memcached-data-set' => 'Données de test écrites dans Memcached ! Veuillez rafraîchir la page pour voir si le résultat est correct.',
        'memcached-works' => 'Memcached semble fonctionner correctement!',
        'memcached-not-working' => 'Memcached semble NE PAS fonctionner correctement ! Veuillez le redémarrrer.',
        'memcached-not-found' => 'Memcached est indisponible sur ce serveur !',
        'memcached-pecl-not-found' => 'Memcache PECL est indisponible sur ce serveur !',
        'memcached-servers-not-set' => 'Les serveurs Memcached ne sont pas encore configureées ! Veuillez les ajouter en utilisant le paramètre <b>$wgMemCachedServers</b> dans votre fichier LocalSettings.php.',
);

Див. такожEdit