Як використовувати speedtest на сервері Linux, щоб графічно перевіряти, зберігати та повідомляти про швидкість інтернету

Виходячи з набору проблем бідного широкосмугового з'єднання, я відчував, що я вирішив, що хочу відстежувати швидкість Mbps, яку я регулярно отримував від свого постачальника. Я бачив особливо погані цифри, коли намагався завантажити файли увечері, при значно швидшій швидкості, досягнуті дуже рано вранці.

У мене є кутовий Linux-сервер Debian, який є моїм тестовим центром розробки веб-сайтів на базі ISPConfig, а також деякий код Let's Encrypt, який мені подобається грати, і я шукав якесь програмне забезпечення, яке б дозволило перевірити пропускну здатність, runnable з командного рядка linux, що могло б стати основою автоматизованої скриптової системи оболонки для отримання вихідних даних, які мені потрібні. Я хотів зберегти дані в базі даних SQL, щоб зробити прості запити (тоді я міг би легко зібрати більше даних і просто витягувати меншу підмножину для періодів, якими я цікавився), і мати веб-інтерфейс, який міг би створити просту діаграму візуалізувати дані та допомогти висвітлити проблеми з'єднання.

Першим результатом мого пошуку було дійсно корисну статтю Антоніо Валенсії за адресою: https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/

Виконавши вказівки там для встановлення speedtest, швидке відтворення показало, що я міг би використовувати його для запуску тестів з широкого кола інтернет-серверів, а також випускати вихід у форматі CSV, який цілком підходить для імпорту безпосередньо в таблицю SQL з мінімальна кількість зусиль у розробці програмного забезпечення.

Що стосується відносно невеликої кількості даних, які буде створено, я вирішив використовувати SQLite як серверний сервер, а швидкий пошук доступних з відкритим вихідним кодом бібліотек графіків на базі JavaScript керував мене в chart.js, який має простий, чистий дизайн з простим інтерфейсом даних, але багато можливостей налаштувати розширені параметри, якщо це необхідно. Перетворення даних SQL для вилучення лише підмножини даних, якими я хотів графікувати з виходом через JSON через деякий прямий вперед PHP-код був шлях.

Отже, загалом мені потрібно було спроектувати систему, яка виглядала так:

Сервер Linux, що працює на швидкісному тестуванні як cronjob - можливо, 1 за годину - зі швидкісним виходом, що зберігається в базі даних SQLite, - все це контролюється файлом сценарію bash shell. Веб-інтерфейс - суміш HTML, CSS, javascript та PHP для вилучення даних із SQLite і створення стрічкової діаграми, що показує досягнуті показники Mbps за попередні години 24 (або будь-який інший період, який я міг би прийняти).

Трохи експериментувавши зі швидкісними темпами в десятки і більше разів, інтерактивно показав мені, що існує декілька серверів, які, як видається, дають результати, які тісно співпадають з тими швидкостями, якими я відчуваю. Я вважав за краще пробувати тестування на декількох серверах, щоб краще зрозуміти, наскільки моїми номерами Mbps вплинуло розташування цільового сервера та час доби в іншому часовому поясі.

Якщо ви хочете стежити за собою та налаштувати аналогічну систему для себе, вам потрібно буде вибрати один або декілька серверів із сотень доступних для швидкісного тестування, щоб використовувати їх відповідно до вашого місцезнаходження.

Передумови для 1

  • Linux-сервер - я використовую Debian 9.1 - розтягнути
  • tty-доступ до сервера з кореневими іменами - я використовую PuTTY з ноутбука Windows
  • ISPConfig встановлено та веб-сайт, налаштований за допомогою FTP-облікового запису, - я використовую 3.1.6, встановлений як apache як веб-сервер (ви можете керувати лише веб-сервером, з невеликими змінами до наведених нижче інструкцій)
  • PHP - Я використовую 7.0, але це також повинно працювати з більшістю попередніх версій
  • FTP-клієнт - я використовую Filezilla - і PureFTPd працює на сервері
  • nano - або ваш улюблений візуальний редактор

Я припускаю, що вам зручно входити на сервер Linux, як обійти каталоги, макет, де ваш веб-сервер очікує, що файли будуть і як FTP-файли в цих каталогах.

Нижче наведено докладні кроки, які дозволять вам встановити все це.

2 встановіть швидкість тесту

Вхід до вашого Linux-сервера як root і запустіть команду:

# pip install speedtest-cli

Побачити https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ і https://pypi.python.org/pypi/speedtest-cli для отримання додаткової інформації, якщо у вас виникли проблеми.

Примітка: speedtest та speedtest-cli ідентичні в моїй установці, тому я просто посилаюсь на speedtest в наступному.

3 встановіть SQLite3

# apt-get install sqlite3

Використовуйте еквівалент для свого дистрибутиву, якщо apt-get не для вас.

4 Створіть пропускну здатність.ш

Введіть наступний код сценарію bash у файл і збережіть його як /usr/local/etc/bandwidth.sh - ми будемо редагувати це трохи пізніше, щоб зробити його специфічним для вас.

#! / bin / bash # запускати швидкість на сервері 3 і зберігати всі вихідні результати в файлі CSV для імпорту в sqlite db # # запустити cronjob раз на годину # # function getCSVString () (# якщо speedtest failed (наприклад, це не могло доступ до сервера) нам потрібно створити фіктивний нульовий запис для цього часового інтервалу # отримати рядок timestamp у тому ж форматі, що створить speedtest - і нам потрібен час UTC локальний RIGHTNOW = $ (date --utc +% Y-% m- % dT% H:% M:% SZ) # який сервер ми тестуємо проти? якщо [$ 1 = "5443"], то відлуння "5443, Fasthosts Internet, Gloucester, $ RIGHTNOW, 73.09,0.0,0.0,0.0" fi, якщо [$ 1 = "1234"], потім ехо "1234, Uno, Milton Keynes, $ RIGHTNOW, 168.27,0.0,0.0,0.0" fi якщо [$ 1 = "1783"], то повторюйте "1783, Comcast," Сан-Франциско, CA ", $ RIGHTNOW, 8420.0,0.0,0.0,0.0", # test / debug case, тільки якщо [$ 1 = "199999999"], а потім повторите "99999, Test , Test, $ RIGHTNOW, 99.99,0.0,0.0,0.0 "fi} runTest () {# run speedtest проти імені сервера з виходом csv збережено в tmp файл / usr / local / bin / speedtest --csv --server $ 1> / usr / local / etc / speedtest.tmp якщо [$? -gt 0], а потім # speedtest не вдалося, так що створіть нульовий запис замість будь-якого повідомлення про помилку getCSVString $ 1> /usr/local/etc/speedtest.tmp fi # зберегти вихідний файл готовий до наступного тесту сервера cat / usr / local / etc / speedtest.tmp >> /usr/local/etc/speedtest.csv} # main ####### # запустити швидкість тесту проти серверів 3 і зберегти всі результати виводу в файлі CSV cd / usr / local / etc # clear csv file - повинен бути порожнім на початку запуску rm -f /usr/local/etc/speedtest.csv ############################ ################ # тест / налагоджувальна справа - сила прискорення тесту на випадок ######################## #################### # runTest "199999999" # спати 5 ####### коментувати після тестування ########## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # runTest "5443" Сніг 10 співати 1234 runTest "10" спати 1783 # тепер імпортувати дані csv до sqlite db sqlite1-batch /usr/local/etc/bandwidth.db << "EOF". Separator "," .import / usr / local /etc/speedtest.csv пропускна здатність EOF # додати поточний запуск csv для резервного копіювання cat / usr / local /etc/speedtest.csv >> /usr/local/etc/speedtest.bak

Я вибачаюся за мій "пояс і підтяжки" підходу використання повних шляхів для файлів скрізь, навіть коли це не потрібно. Це просто так, як мені це подобається. Не соромтеся покращити це, якщо вам зручно редагувати скрипти bash.

Встановіть властивості файлу, щоб зробити цей скрипт виконуваним:

# chmod пропускна спроможність 0700.sh

5 Створення бази даних SQLite

Створіть bandwidth.db SQLite в / usr / local / etc:

#sqlite3 пропускна здатність.db

а потім, у рядку sqlite> створіть нову таблицю з наступною командою (не пропустіть остаточну півколу):

sqlite> CREATE TABLE IF NOT EXISTS "пропускна здатність" ("serverid" INTEGER NOT NULL ", спонсор" VARCHAR NOT NULL ", ім'я_сервера" VARCHAR NOT NULL ", разів" DATETIME PRIMARY KEY НЕ НУЛЬ УНІКАЛЬНО ", відстань" FLOAT NOT NULL " ping "FLOAT NOT NULL", завантажити "FLOAT NOT NULL", завантажити "FLOAT NOT NULL");

sqlite> .quit

Це створює таблицю з назвою смуги пропускання з полями, які безпосередньо спрямовуються у формат CSV, що виводить швидкість тесту.

6 Отримати список серверів

Вам буде потрібно список серверів, які використовують швидкість тестування.

# speedtest-list> servers.txt

Тепер перевірте через servers.txt числові ідентифікатори серверів, з якими ви хочете провести тестування.

# nano servers.txt

Файл буде виглядати приблизно так:

Отримання конфігурації speedtest.net ... 5833) Hub Network Services Ltd (Ньюпорт, Уельс) [57.50 км] 5938) Spectrum Internet (Кардіфф, Великобританія) [65.89 км] 5443) Fasthosts Internet (Глостер, Великобританія) [74.31 км [6504 км] 78.64) [7265 км] 87.11) Exascale Limited (Вулвергемптон, Велика Британія) [8225 км] 96.08) 3110) Secure Web Services Ltd (Шрусбері, Велика Британія) [96.12 км] 12401) Unitron Systems & Development Ltd (Телфорд, Великобританія) [120.78 км] 1153) Warwicknet Ltd. (Ковентрі, Великобританія) [125.18 км] 1685) Vodafone UK (Великобританія) [153.25 км] 4384) Dragon WiFi LTD (Haverfordwest, Великобританія) (НьюБурі, Великобританія) [157.40 км] 1234) Iomart (Лестер, Великобританія) [170.71 км] 3504) Уно (Мілтон Кейнс, Велика Британія) [170.93 км] 11747) ТОВ ТНП (Манчестер, Великобританія) [170.93 км] XNUMX) Віспа (Манчестер, Великобританія) [XNUMX км]

Ідентифікатори сервера знаходяться з лівого боку. Ця цифра в кінці кожної лінії - це оцінка швидкості, яка визначається швидкістю тесту від кілометри між вашим розташуванням та сервером, хоча я не впевнений, що це занадто точне, і він може змінюватися від запуску до запуску. Тестові сервери будуть перераховані у порядку цієї відстані, починаючи з найближчого. Тестування серверів у верхній частині цього списку повинно, теоретично, надати вам найшвидкіші пінг і найкращі завантаження та завантаження швидкості в порівнянні з серверами, розташованими внизу списку, що значно далі.

7 Виберіть ідентифікатори сервера та змініть bandwidth.sh

Тепер буде час, щоб запустити speedtest вручну з вибором різних доступних ідентифікаторів сервера і подивитися, які результати ви отримаєте. Я вибрав декілька серверів, близьких до мене у Великобританії, і одного в Каліфорнії для порівняння. Формат команди для використання:

# speedtest-сервер 1234

Вихід, який ви бачите, буде схожий на:

Отримання конфігурації speedtest.net ... Тестування з xxxxxxx (nnnn) ... Отримання списку серверів speedtest.net ... Вибір найкращого сервера на основі ping ... Хостинг Uno (Мілтон Кейнс) [187.87 км]: 33.243 ms Testing швидкість завантаження................................................ ................................ Завантажити: 1.60 Мбіт / с Тест швидкості завантаження ......... .................................................. .................................... Завантажити: 0.55 Мбіт / с

Після вибору серверів, які ви хочете використати, встановіть ідентифікатори числового сервера (я використовував сервери 3, але ви можете змінити це, якщо захочете) у відповідні рядки в смузі пропускання.sh

runTest "5443" сплять 10 runTest "1234" сплять 10 runTest "1783" сплять 1

Вам також доведеться налаштувати код у процедурі помилки, яка створює фіктивний запис, якщо швидкість тесту повинна вийти з ладу при будь-якому конкретному запуску.

	# який сервер ми тестуємо проти? якщо [$ 1 = "5443"], то відлуння "5443, Fasthosts Internet, Gloucester, $ RIGHTNOW, 73.09,0.0,0.0,0.0" fi, якщо [$ 1 = "1234"], потім ехо "1234, Uno, Milton Keynes, $ RIGHTNOW, 168.27,0.0,0.0,0.0" fi якщо [$ 1 = "1783"], то ехо "1783, Comcast," Сан-Франциско, CA ", $ RIGHTNOW, 8420.0,0.0,0.0,0.0" fi

Номери після $ RIGHTNOW (наприклад, 73.09) - це відстані у кілометрах від вашого місцезнаходження до відповідного сервера. Я не використовую їх ніде, тому вони просто містять заповнювач і можуть мати будь-яке значення.

Зверніть увагу на такий приклад 1783, що ми повинні поставити позначки для котирувань у місці розташування та вийти з них, щоб отримати їх у створеному нами файлі CSV. Потрібні котирування тут, тому що в цьому місці розташовується кома. Без втечених котирувань кома буде розглядатися як роздільник поля CSV, що може призвести до проблеми з імпортом SQLite. Якщо вибраний вами сервер має аналогічне місце розташування тексту з комою, тоді вам доведеться використовувати втечі котирування.

8 Налаштуйте cronjob

Налаштуйте cronjob для запуску один раз на годину (або так часто, як ви хочете в рамках причини) виконати /usr/local/etc/bandwidth.sh. Якщо ви використовуєте ISPConfig, то ви можете використовувати його для запланованої роботи cronjob.

Створіть cronjob

Крім того, в командному рядку linux можна ввести:

# crontab-e

Ви повинні побачити щось подібне до цього (пам'ятайте, ви ввійшли як "root"):

* * * * * /usr/local/ispconfig/server/server.sh 2> & 1 | а читає рядок; зробити echo `/ bin / date`" $ line ">> >> /var/log/ispconfig/cron.log; зроблено * * * * * /usr/local/ispconfig/server/cron.sh 2> & 1 | а читає рядок; зробити echo `/ bin / date`" $ line ">> >> /var/log/ispconfig/cron.log; зроблено 1 * * * * /usr/local/etc/bandwidth.sh 2> & 1

Якщо ви не запустили ISPConfig, то спочатку це може бути порожнім. Додайте цей останній рядок точно так, як показано вище - відстань важливо - запустити сценарій оболонки, починаючи з 00: 01 AM, а потім повторити кожну годину, кожен день. Ви, звичайно, можете вибрати різні часи. (У перший раз, коли ви запускаєте це, crontab запитає вас, який редактор ви хочете використовувати - я вибираю nano.)

9 Встановити PHP open_basedir

Додайте / usr / local / etc до файла open_basedir для PHP для веб-сайту. У ISPConfig це знаходиться на вкладці Параметри веб-сайту.

Встановити open_basedir

Це дозволяє коду bandwidth.php мати доступ до бази даних SQLite, яку ми щойно створили, в цьому каталозі.

Ми могли б пропустити це, якби ми вирішили створити базу даних в каталозі, який вже встановлений як доступний, наприклад / var / www / clients / client1 / web1 / web /, але це буде поганим вибором з точки зору безпеки .

10 Створіть пропускну здатність.php

Вам потрібно скопіювати цей код у файл з назвою bandwidth.php на своєму сервері в каталозі базових веб-документів. Якщо ви використовуєте ISPConfig, це буде щось на зразок / var / www / clients / client1 / web1 / web /

<html lang="en"> 
<head> 
<meta charset="utf-8" /> 
<title>Bandwidth Monitor - download speeds in last 24 hours</title>
<script src="scripts/Chart.bundle.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
</head>
<body>
<h3 style="font-family: 'Roboto', sans-serif; text-align: center">
Download speeds - last 24 hours
</h3>
<canvas id="myChart" width="1100px" height="500px"></canvas>
<script>
	var bandwidth_data = <?php
	// generate json formatted data from sqlite db
	// Specify sqlite database name and path
	// apache server has setting for PHP open_basedir to include /usr/local/etc
	class MyDB extends SQLite3 {
		function __construct() {
			$this->open('/usr/local/etc/bandwidth.db');
		}
	}
	$db = new MyDB();
	if(!$db) {
		echo $db->lastErrorMsg();
	} else {
		echo "";
	}
	// select the most recent 24 entries to display the last 24 hours of test results (3 servers are tested per hour)
	$sql =<<<EOF
	SELECT serverid, strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", times) AS timestamp, sponsor, servername, download
	FROM bandwidth WHERE serverid = 1234 ORDER BY times LIMIT 24 OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24;
	EOF;
	$ret = $db->query($sql);
	if(!$ret){
		echo $db->lastErrorMsg();
	} else {
		while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
			$results[] = $row;
		}
	$ukdata = json_encode($results);
	}
	echo $ukdata;
	$db->close();
	?>
	;
	// extract the fields we want to chart from the JSON data
	var bwlabels = [], bwdata = [];
	var mbps, bvalue;
	for (var i = 0; i < bandwidth_data.length ; i++){
		bwlabels.push(bandwidth_data[i].timestamp);
		// convert bps to Mbps rounded with 3 decimal places in local format
		mbps = Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000;
		bvalue = mbps.toLocaleString(undefined, { minimumFractionDigits: 3 });
		bwdata.push(bvalue);
	}
	var bar_color = 'rgba(0, 128, 255, 0.9)';
	var ctx = document.getElementById("myChart").getContext('2d');
	var myChart = new Chart(ctx, {
		type: 'bar',
		data: {
			labels: bwlabels,
			datasets: [{
				label: 'Mbps download',
				data: bwdata,
				backgroundColor: bar_color,
				borderColor: bar_color,
				borderWidth: 1
			}]
		},
		options: {
			// we override the default tooltip which drops trailing zeros even though we already put them there
			tooltips: {
				callbacks: {
					label: function(tooltipItem, data) {
						var value = data.datasets[0].data[tooltipItem.index];
						var label = 'download: ';
						var retvalue = value.toLocaleString(undefined, { minimumFractionDigits: 3 });
						return label + ' ' + retvalue + ' Mbps';
					}
				}
			},
			responsive: false,
			scales: {
				xAxes: [{
					ticks: {
						autoSkip: false,
						maxTicksLimit: 24
					}
				}],
				yAxes: [{
					ticks: {
						beginAtZero:true
					}
				}]
			}
		}
	});
</script>
</body>
</html>

Відредагуйте цей файл, щоб використати сервера, на який ви хочете повідомити. Я використовую сервер 1234 у своєму прикладі тут, як я виявив, що після вивчення декількох днів даних цей сервер випускав цифри Mbps, найбільш точно пов'язані з швидкістю, яку я відчував, що отримую. Серверідед знаходиться в операторі WHERE оператора SQL SELECT:

SELECT serverid, strftime ("% H:% M", раз), || "" || strftime ("% d /% m /% Y", раз) AS мітка часу, спонсор, ім'я_сервера, завантаження FROM bandwidth WHERE serverid = 1234 ORDER BY times LIMIT 24 OFFSET (SELECT COUNT (*) / 3 FROM bandwidth) -24;

Що саме це робить SQL-висловлювання? Якщо ви не знайомі з SQL, то давайте розглянемо кожну частину.

a. SELECT - це команда для читання записів з таблиці бази даних SQL, а потім поля, які слід читати, та інші параметри.

б strftime ("% H:% M", раз) || "" || strftime ("% d /% m /% Y", раз) AS мітка часу

це переформатувати рядок datetime, який speedtest створив у своєму CSV-виході для чогось трохи більш зручного для користувача. Я хочу відформатований формат Великобританії, тому це займе таку рядок як "2017-08-31T12: 02: 51.898186Z" і перетворить його в "12: 02 31 / 08 / 2017". Простіше зробити це переформатування безпосередньо в операторі SQL, ніж потім обробляти його. Час буде тут UTC / GMT, що для мене є в порядку, але ви можете захотіти змінити це; наприклад, якщо ви хочете відформатувати дати США, змініть цю другу частину на strftime ("% m /% d /% Y", раз).

с serverid, timestamp, sponsor, name server, download - це поля, які ми хочемо прочитати в таблиці SQL і створити в нашому об'єкті JSON.

д. Від смуги пропускання - це назва таблиці SQL, яку ми читаємо.

е WHERE serverid = 1234 встановлює підмножину таблиці для читання - змініть це відповідно до використовуваного сервера, і ви, можливо, захочете прочитати дані для декількох серверів, але це ускладнює діаграму.

ф ORDER BY вказує порядок сортування виводу - ми хочемо, щоб це було замовлено за тимчасовим значком, який встановлював швидкість для кожного запуску.

г LIMIT 24 обмежує висновок до записів 24, оскільки ми хочемо лише показати 24 години вартістю даних, тому що наш cronjob встановлений для запуску один раз на годину. Якщо ви працювали двічі на годину, вам потрібно буде встановити це значення на 48, щоб отримати 24 години даних.

ч OFFSET (SELECT COUNT (*) / 3 FROM пропускної здатності) -24; ми хочемо, щоб останні записи 24 були таблицею, оскільки вони являють собою найновіші записи, які нас цікавлять, тому ми повинні вказати OFFSET, щоб відповідати LIMIT. Без цього ми завжди отримаємо перші записи 24 у таблиці, а не найновіші 24. Щоб отримати правильне зміщення, ми підраховуємо всі записи у таблиці за допомогою (SELECT COUNT (*)), потім розділяємо це на 3 (оскільки ми використовуємо speedtest 3 раз на годину, один раз для кожного з різних серверів 3), а потім віднімаєте 24 з цієї суми, щоб отримати правильну позицію OFFSET, щоб LIMIT 24 отримав потрібні записи.

Якщо ви змінили скрипт bash, щоб запустити щось інше, ніж 3 різні тестери сервера на годину, то відповідно відрегулюйте цю частину / 3. Якщо ви тільки тестуєте на одному сервері, тоді поділ взагалі не потрібний.

Ви також можете налаштувати загальний розмір діаграми, де я взяв легкий шлях твердого кодування розміром, придатним для мого екрана - це встановлено в цьому рядку:

<canvas id = "myChart" width = "1100px" height = "500px"> </ canvas>

11 Отримати локальну копію файлів

Я віддаю перевагу мати локальні версії будь-яких файлів бібліотеки css та js (але не шрифтів Google), які потрібні на веб-сторінці, і якщо ви однакові, то вам потрібно буде отримати копію на своєму сервері Chart.bundle.min. JS та помістіть його в каталог / var / www / clients / client1 / web1 / web / scripts на вашому сервері (або який база даних правильний для вас).

Ви можете завантажити файл з: https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js

Якщо ви не хочете використовувати локальну копію, то змініть bandwidth.php, щоб вказати на загальнодоступну версію CDN. Просто змініть цю лінію:

<script src = "scripts / Chart.bundle.min.js"> </ script>

до цього:

<script src = "https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js"> </ script>

12 Увімкніть PHP у ISPConfig

Не забудьте ввімкнути PHP на налаштуваннях вашого веб-сайту, якщо це ще не встановлено.

Увімкнути PHP на веб-сайті

Завантажте bandwidth.php в браузері 13

Ми нарешті закінчили. Як тільки скрипт смуги пропускання bandwidth.sh мав час, щоб запустити декілька разів, щоб створити деякі дані (або ви можете запустити його вручну кілька разів спочатку), вкажіть ваш браузер на вашому веб-сайті сервера linux, завантажте bandwidth.php, і ви повинні побачити щось подібне це:

Графік пропускної здатності

І так, мій широкосмуговий зв'язок дійсно так поганий!

Нарешті, тут є кілька додаткових окулярів:

Вихід із діаграми на панелі 14

Слід зазначити, що показники завантаження та завантаження, що зберігаються в таблиці SQL, вказують в секунду, а не на Mbps (поряд з незмінною кількістю десяткових цифр - цифрами, такими як 1533681.5922415722). Це лише спосіб швидкості, який виробляє дані при запуску в режимі CSV. Щоб показати фігуру Mbps, а не bps, на виході з осі Y стрічкової діаграми є кілька рядків, включених у код Javascript у смузі пропускання.php для виконання перетворення:

	mbps = Math.round (bandwidth_data [i] .download / 1000) .toFixed (3) / 1000; bvalue = mbps.toLocaleString (undefined, (minimumFractionDigits: 3));

Використовуючи toLocaleString слід вставити правильну десяткову розрядкову пунктуацію (a "." Або ","), як це встановлено в налаштуваннях вашого браузера, але це залежить від реалізації та дещо суперечить. Якщо ви бачите. замість того, і це дратує вас, то глобалізація це спосіб це виправити. Нижче дивіться розділ "18 Додаткові кроки та ідеї".

Ще декілька рядків потрібні для переходу за стандартною обробкою коду hover для нуль, що залишилися, оскільки chart.js зазвичай покаже "2.000" як просто "2", що я не хочу, особливо після того, як вирушає в неприємність переконайтеся, що вони там передусім:

    // ми перекриваємо підказку за промовчанням, яка знижує кінцеві нулі, хоча ми вже поміщаємо їх підказки: {callbacks: {label: function (tooltipItem, data) {var value = data.datasets [0]. data [tooltipItem.index ]; var label = 'download:'; var retvalue = value.toLocaleString (undefined, (minimumFractionDigits: 3)); return label + '' + retvalue + 'Mbps'; }}}

Це хороший приклад того, як ви можете "свердлити" в chart.js і змінювати, як це робить речі.

Також я встановив параметри діаграми для друку мітки часу на осі x для кожного рядка:

	xAxes: [{ticks: {autoSkip: false, maxTicksLimit: 24}

Параметр за умовчанням (при встановленому автоскіпом значення "true") призвело до появи кількох дивних прогалин у мітках. Вам потрібно буде змінити maxTicksLimit, якщо ви хочете показати щось інше, ніж записи 24.

Якщо вам потрібна додаткова допомога у зміні будь-яких параметрів chart.js або ви не можете отримати те, що ви хочете працювати, будь ласка, перегляньте конкретні сторінки chart.js Stack Overflow - там є багато корисної інформації там - https://stackoverflow.com/questions/tagged/chart.js - Просто використовуйте поле пошуку, щоб звузити те, що ви шукаєте. На жаль, документація chart.js відсутня в деяких більш просунутих прикладах, які, безсумнівно, допоможуть вам швидше скористатися цим жахливою частиною відкритого коду.

Обробка помилок 15

Під час мого початкового тестування я помітив пару разів, що швидкість тесту повідомляє "Не вдається отримати список серверів speedtest" у файлі CSV. Ймовірно, це відображало час, коли моє широкосмугове з'єднання було настільки поганим, що speedtest не змогло взагалі підключитися до сервера тестування. Цей текст, очевидно, відсутній у форматі, який ми хочемо імпортувати в базу даних SQLite, тому мені потрібно було вирішити це питання, що може призвести до відмови від цього небажаного тексту з файлу CSV, а також включати нульовий запис у базу даних для певного часового інтервалу, як інакше будь-яка відсутня запис у таблиці SQL просто була невидимою, а також викинув вирівнювання, яким хотілося мати записи 24 на день при створенні діаграми.

Ви побачите в смузі пропускання band.sh, що сценарій перевіряє код виходу, встановлений speedtest за допомогою змінної скрипту $? і якщо воно перевищує нуль, це означає, що швидкість тесту не вдалася. Це спричинить функцію для створення фіктивного запису CSV, який потім використовується для перезапису файлу CSV для цього режиму.

У сценарії bash є кілька рядків, які перевіряють цю помилку, щоб створити нульову вставку, якщо запустити скрипт після того, як ви залишили коментування цих рядків.

############################################ # тест / налагоджувальна справа - сили швидкості, щоби вийти з ладу ############################################ # runTest "199999999" # sleep 5 ####### коментувати після перевірки ########## ####################### #####################

Це використовує ідентифікатор сервера "nonsense", який не сприймає speedtest, змушуючи його повертати ненульовий код виходу. Потім сценарій повинен створити фіктивний запис, який може бути щасливим у таблиці SQL і проігнорований, або ви можете його видалити.

Іншим способом примусити швидкість випробовувати невдачу, для цього завдання тестування буде видалення мережевого з'єднання сервера. Не забувайте, що ви можете запустити скрипт bandwidth.sh вручну в будь-який час, вам не доведеться чекати, поки cronjob запустити його, хоча ви повинні уникати його вручну, якщо cronjob неминуче. Маючи два сценарії, що працюють одночасно, ймовірно, будуть збиті файли CSV, а потім таблиця SQL.

Якщо трапляється найгірша ситуація, то резервний файл CSV зберігається як /usr/local/etc/speedtest.bak, який повинен містити весь вихід CSV з speedtest від першого запуску скрипту bash. Це можна редагувати, щоб видалити будь-які з небажаних записів, очистити таблицю SQL, а потім весь набір записів CSV, які буде імпортуватися в SQLite.

Часові пояси 16

Частота повідомлень Speedtest у UTC (в основному це таке ж, як середнє значення Гринвіча або GMT). Використання UTC означає, що всі ті часи, що зберігаються в таблиці SQL, є послідовними, а час літнього спалаху не матиме ніякого небажаного впливу.

Але це означає, що процедура обробки помилок у смузі пропускання bandwidth.sh має створити мітку часу для вставки dummy, щоб відобразити це. Це досить просто - ми просто включили прапор -utc:

місцевий RIGHTNOW = $ (дата --utc +% Y-% m-% dT% H:% M:% SZ)

Якщо ви хочете, щоб графіки міток з осі X показали час як щось інше, ніж UTC / GMT, найкраще місце для такої зміни буде в операторі SQL SELECT, наприклад:

strftime ("% H:% M", час (times, "localtime")) || "" || strftime ("% d /% m /% Y", раз) AS мітка часу

Це дозволить використовувати налаштування часового поясу вашого сервера Linux для налаштування часу, показаного на графіку. Або ви можете піти, щоб з'ясувати, як глобалізація може зробити це на передній панелі.

Побачити https://www.timeanddate.com/time/gmt-utc-time.html і http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm для отримання додаткової інформації.

17 Подальші кроки та ідеї

Speedtest не повинно бути джерелом ваших необоротних даних - це може прийти з будь-якої точки світу і бути будь-яким, а не просто швидкістю Інтернету. Принцип той самий - процес серверного сервера, який може отримати вихідні дані у корисному форматі, а потім імпортувати його в SQLite з скрипту bash з інтерфейсом, який витягує підмножину даних, який ви хочете, а потім показує його.

Більш складний бас-скрипт може записувати дані безпосередньо до таблиці SQL (використовуючи команду SQL INSERT), якщо форматування як CSV не є варіантом. При розробці таблиці SQL подумайте про те, як ви хочете отримати дані пізніше.

При внесенні будь-яких змін майте на увазі контекст коду, який ви редагуєте; тобто у нас є SQL-заяви всередині скрипта PHP всередині Javascript усередині HTML. Запам'ятайте рівень, на якому ви знаходитесь, і код відповідно. Це може бути легко втратити трек і в кінцевому підсумку написання PHP-код у якому повинно бути Javascript! Я можу гарантувати, що це не спрацює.

Ось деякі ідеї для подальшого вивчення:

  • toLocaleString не послідовно реалізується через браузери. Використовуйте глобалізацію та обробляйте з ним всі номери, дати та часові пояси.
  • Checkout httpstat (існує версія сценарію bash), яка дозволяє збирати різні типи даних підключення до Інтернету. Зберігайте це в (окремому) таблиці SQL і виведіть графік.
  • Покращити інтерфейс bandwidth.php, щоб надати користувачеві можливість вибору різних варіантів: 24, 48, 72 годин; вибрати конкретну дату, включати завантаження та завантаження даних, час ping.
  • Перетворіть HTML, щоб використовувати адаптивний код завантажувального коду, щоб він добре працював на різних пристроях або розмірах екрана.
  • Дослідіть деякі інші параметри chart.js; може бути комбінована лінійно-штангова діаграма; змінити розмір кольорів та панелі.
  • замінити SQLite на MySQL і додати додаткову безпеку з доступом до читання з PHP за допомогою користувача / пароля.
  • Побудуйте подібну систему, але використовуючи node.js.

Посилання 18

джерело

Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.