Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Чем забита ваша память либо анализируем содержимое кеша XCache

Anna | 31.05.2014 | нет комментариев

Вас смущает это число? Меня тоже.

В первую очередь мой пост обращен к тем, кто размещает уйма сайтов на сервере. Для остальных он тоже может быть пригоден, от того что с поддержкой его вы сумеете стремительно добавить группировку по фрагментам путей закешированных файлов.

Допустимо, вы выделили слишком много оперативной памяти под кеш. Размер его дозволено гораздо уменьшить путем отключения массивных, но редко посещаемых сайтов. Я вам помогу вычислить такие сайты.

Я думаю, что огромнее не осталось приложений и серверов, которые не применяют акселераторы PHP. Один из2-х знаменитых акселераторов — XCache. Допустимо, кто-то использует данный акселератор, но не знает, что с некоторого времени он содержит минималистическую админку.

Админка — штука дюже пригодная, разрешает подобрать наилучший размер оперативной памяти, выделяемый для хранения байткода исполняемых скриптов. Также она разрешает просматривать хранимые данные и удалять их.

Список эакешированных скриптов выглядит длинной колбасой. Админка имеет встроенное средство для сортировки данных, но трудиться со столь длинным списком немыслимо.

Добавляем статистику в штатную админку

От того что админка написана на PHP с открытым кодом, то мы её модифицируем, добавив необходимый функционал.

Добавим на страницу List PHP:
1. Статистику скриптов по хостам
2. Фильтр скриптов по хостам (если быть точным, по префиксам).

xcache.tpl.php строка 150
Позже

	foreach (array('Cached' => $cachelist['cache_list'], 'Deleted' => $cachelist['deleted_list']) as $listname => $entries) {
		$a->reset();

добавляем

		if ($listname == 'Cached')
		{		
			$hosts = array();
			$filtertrash = array('', 'usr', 'home');
			foreach ($entries as $i => $entry)
			{
				if (strpos($entry['name'], $_SERVER['DOCUMENT_ROOT']) === 0)
				{
					$host = $_SERVER['DOCUMENT_ROOT'];
					$prefix = $_SERVER['DOCUMENT_ROOT'];
				}
				else
				{
					$pos = 0;
					foreach (explode('/', $entry['name']) as $host)
					{
						if (!in_array($host, $filtertrash)) break;
						$pos  = strlen($host)   1;
					}
					$prefix = substr($entry['name'], 0, strpos($entry['name'], $host, $pos)   strlen($host));
				}
				if (isset($hosts[$host]))
				{
					$hosts[$host]['files']  ;
					$hosts[$host]['hits']  = $entry['hits'];
					$hosts[$host]['size']  = $entry['size'];
				}
				else
				{
					$hosts[$host] = array(
					'prefix' => $prefix,
					'files' => 1,
					'hits' => $entry['hits'],
					'size' => $entry['size'],
					);
				}
			}
			?>
			<table cellspacing="0" cellpadding="4">
				<tr><th>Host</th><th>Files</th><th>Hits</th><th>Size</th><th>Ratio(size/hits)</th></tr>
			<?php
			uasort($hosts, create_function('$a,$b' , 'return $b["size"] - $a["size"];'));
			foreach ($hosts as $host => $hoststats)
			{
				?><tr><td><a href="?type=0&prefix=<?=$hoststats['prefix']?>"><?=$host?></a></td><td><?=$hoststats['files']?></td><td><?=$hoststats['hits']?></td>
					<td><?= ($hoststats['size'] > 1048576 ? round($hoststats['size'] / 1048576).' M' :
						($hoststats['size'] > 1024 ? round($hoststats['size'] / 1024).' k' : $hoststats['size'])  
						) ?></td>
					<td><?=round($hoststats['size']/$hoststats['hits'])?>
				</tr>
				<?php
			}
			?>
			</table>
			<?php
		}

Тут мы вырезаем имя хоста из имени скрипта либо используем DOCUMENT_ROOT для chroot’ованных хостов.
Все скрипты моих сайтов лежат в /usr/home/HOST/
Для всякого хоста считаем статистику.

Экраном ниже изменяем предисловие цикла таким образом. Обратите внимание на измененный порядок строк.

		foreach ($entries as $i => $entry) {
			$name     = htmlspecialchars($entry['name']);
			if (!empty($_GET['prefix']) && strpos($name, $_GET['prefix']) !== 0)
			{
				continue;
			}
			echo "
			<tr ", $a->next(), ">";

Это фильтр таблицы по префиксу, переданному в $_GET['prefix']

Итог

Обновляем, и наслаждаемся статистикой по хостам

Самое увлекательное в последней колонке В ней просто посчитана результативность занятой памяти, исходя из размера и числа запросов.
Скорее каждого, вы увидите значительно больший разброс значений. Моя таблица — теснее позже проведенной работы, в итоге которой я выкинул некоторые толстые сайты без важной посещаемости.

Как отключить кеширование непотребного?

Если вы отключите кеширование, то для скриптов будет генерироваться байткод при всяком запуске. И всё равно он будет исполняться стремительней, чем если бы он работал без акселератора.

Для отключения кеширования нужно установить стандартную INI переменную

xcache.cacher = Off

Для отдельных хостов и файлов нужно применять следующие варианты
1. в php.ini вписать секцию для всякого хоста

[HOST=<host>]
xcache.cacher = Off

2. если у вас FCGI/FPM/5.3 , то в папку со скриптами положить файл .user.ini

xcache.cacher = Off

Кеширование будет отключено для всех скриптов, расположенных в этой папке и во всех ярусах ниже

3. если у вас Apache

<IfModule mod_php5.c>
  php_value xcache.cacher  Off
</IfModule>
Завершение

Верю, моя нехитрая инструкция помогла вам освободить немножко оперативной памяти. Куда сейчас её потратить? Ну, оперативы много не бывает, так что, куда-нибудь прирастет.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB