ブロードバンド接続が不十分であるという一連の問題に続いて、プロバイダーから取得しているMbps速度を定期的に監視することにしました。夕方にファイルをダウンロードしようとすると、特に貧弱な数字が見られ、早朝にはるかに速い速度が達成されました。
Linux Debianサーバーが隅にあります。これはISPConfigでホストされているWebサイトのテストおよび開発マシンであり、Let's Encryptコードを試してみたいので、帯域幅テストを可能にするソフトウェアを探しました。 Linuxコマンドラインから実行可能。これは、必要な生データを生成するための自動シェルスクリプトシステムの基礎を形成する可能性があります。データをSQLデータベースに保存して、クエリを簡単にし(その後、より多くのデータを簡単に収集し、関心のある期間の小さなサブセットを抽出することができます)、簡単なグラフを作成できるWebフロントエンドを作成したいと考えました。データを視覚化し、接続の問題を浮き彫りにするのに役立ちます。
私の検索の最初の結果は、Antonio Valenciaによる本当に有用な記事でした:https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/
そこでの指示に従ってspeedtestをインストールした後、クイックプレイで、さまざまなインターネットサーバーに対してテストを実行し、CSV形式で出力を生成できることがわかりました。これは、SQLテーブルに直接インポートするのに非常に適しています。ソフトウェア開発における最小限の労力。
生成されるデータの量が比較的少ないため、バックエンドストアとしてSQLiteを使用することにしました。利用可能なオープンソースのJavaScriptベースのグラフライブラリをすばやく検索すると、シンプルでクリーンなデザインのchart.jsが見つかりました。シンプルなデータインターフェイスを備えていますが、必要に応じて高度なオプションを微調整する機能が豊富にあります。 SQLデータを変換して、JSONを介した出力でグラフ化したいデータのサブセットのみを抽出するために、いくつかの簡単なPHPコードを使用する方法がありました。
したがって、全体として、次のようなシステムを設計する必要がありました。
cronジョブとしてspeedtestを実行しているLinuxサーバー(おそらく1時間に1つ)。speedtestの出力はSQLiteデータベースに保存されています。これらはすべてbashシェルスクリプトファイルによって制御されます。 HTML、CSS、javascript、およびPHPを組み合わせてSQLiteからデータを抽出し、過去24時間(または私が決定する可能性のあるその他の期間)に達成されたMbpsの数値を示す棒グラフを生成するWebフロントエンド。
スピードテストを数十回インタラクティブに実行して少し実験したところ、私が経験した種類の速度とほぼ一致する結果が得られるように見えるサーバーがいくつかあることがわかりました。複数のサーバーに対してテストして、Mbpsの数値がターゲットサーバーの場所と異なるタイムゾーンの時刻によってどのように影響を受けるかをよりよく把握することをお勧めします。
自分で同様のシステムをフォローしてセットアップしたい場合は、スピードテストに利用できる数百台のサーバーから、自分の場所に合ったサーバーを1つ以上選択する必要があります。
1前提条件
- Linuxサーバー-私はDebian9.1を使用しています-ストレッチ
- ルートログインを使用したサーバーへのttyアクセス-WindowsラップトップからPuTTYを使用しています
- ISPConfigがインストールされ、WebサイトもFTPアカウントで構成されています-私は3.1.6を使用しており、ApacheをWebサーバーとして設定しています(次の手順にいくつかの小さな変更を加えるだけで、Webサーバーだけで管理できます)
- PHP-私は7.0を使用していますが、これはほとんどの以前のバージョンでも機能するはずです
- FTPクライアント-私はFilezillaを使用しています-サーバー上で実行されているPureFTPd
- nano-またはお気に入りのビジュアルエディター
ここでは、Linuxサーバーへのログオン、ディレクトリの移動方法、Webサーバーがファイルを期待する場所のレイアウト、およびそれらのディレクトリにファイルを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を参照します。
3SQLite3をインストール
#apt-get install sqlite3
apt-getが適切でない場合は、ディストリビューションに同等のものを使用してください。
4bandwidth.shを作成します
次のbashスクリプトコードをファイルに入力し、/ usr / local / etc / bandwidth.shとして保存します。これは少し後で編集して、特定のものにします。
#!/ bin / bash#3台のサーバーに対してspeedtestsを実行し、すべての出力結果をCSVファイルに保存してsqlitedb##にインポートします。cronjobによって1時間に1回実行されます##functiongetCSVString(){#speedtestが失敗した場合(例:サーバーにアクセスできませんでした)このタイムスロットのダミーのゼロエントリを作成する必要があります#speedtestが生成するのと同じ形式のタイムスタンプ文字列を取得します-そしてUTC時間ローカルRIGHTNOW =$(date --utc +%Y- %m-%dT%H:%M:%SZ)#どのサーバーに対してテストしていますか? if [$ 1 ="5443"] then echo "5443、Fasthosts Internet、Gloucester、$ RIGHTNOW、73.09,0.0,0.0,0.0" fi if [$ 1 ="1234"] then echo "1234、Uno、Milton Keynes、$ RIGHTNOW 、168.27,0.0,0.0,0.0 "fi if [$ 1 =" 1783 "] then echo" 1783、Comcast、\" San Francisco、CA \"、$ RIGHTNOW、8420.0,0.0,0.0,0.0 "fi#テスト/デバッグ[$ 1 ="199999999"]の場合のみ、echo "99999、Test、Test、$ RIGHTNOW、99.99,0.0,0.0,0.0" fi} function runTest(){#名前付きサーバーに対してスピードテストを実行し、csv出力をtmpファイルに保存します/ usr / local / bin / speedtest --csv --server $ 1> /usr/local/etc/speedtest.tmp if [$? -gt 0] then#speedtestが失敗したため、エラーメッセージの代わりにゼロエントリを作成しますgetCSVString $ 1> /usr/local/etc/speedtest.tmp fi#次のサーバーテストに備えて出力を保存しますcat / usr / local / etc / speedtest .tmp> > /usr/local/etc/speedtest.csv}#main ######## 3台のサーバーに対してspeedtestを実行し、すべての出力結果をcsvファイルに保存しますcd / usr / local / etc#clearcsvファイル-必要runrm-f/usr/local/etc/speedtest.csvの開始時に空になります############################### ##############テスト/デバッグの場合-スピードテストを強制的に失敗させます############################ ################## runTest "199999999"#sleep5#######テスト後にコメントアウト############## ######################################## runTest "5443" sleep 10runTest "1234" sleep 10runTest "1783" sleep 1#は、csvデータをsqliteにインポートしますdbsqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF" .separator "、"。import /usr/local/etc/speedtest.csv bandbandEOF#現在の実行csvをbackupcat/usr/local/etc/speedtest.csvに追加>>/usr/local/etc/speedtest.bak必要のないときでも、どこでもファイルにフルパスを使用するという「ベルトとブレース」のアプローチについてお詫びします。それは私がそれをするのが好きな方法です。 bashスクリプトの編集に慣れている場合は、これを自由に改善してください。
このスクリプトを実行可能にするためのファイルプロパティを設定します:
#chmod 0700bandwidth.sh5SQLiteデータベースを作成する
/ usr / local /etcにbandwidth.dbSQLiteデータベースを作成します:
#sqlite3bandwidth.db次に、sqlite>プロンプトで、次のコマンドを使用して新しいテーブルを作成します(最後のセミコロンを見逃さないでください):
sqlite> CREATE TABLE IF NOT EXISTS "bandwidth"( "serverid" INTEGER NOT NULL、 "sponsor" VARCHAR NOT NULL、 "servername" VARCHAR NOT NULL、 "times" DATETIME PRIMARY KEY NOT NULL UNIQUE、 "distance" FLOAT NOT NULL、 "ping" FLOAT NOT NULL、 "download" FLOAT NOT NULL、 "upload" FLOAT NOT NULL);sqlite> .quitこれにより、speedtestのCSV形式の出力に直接マップされるフィールドを持つbandwidthというテーブルが作成されます。
6サーバーのリストを取得する
speedtestが使用するサーバーのリストが必要になります。
#speedtest --list>servers.txt次に、servers.txtで、テストを実行するサーバーの数値IDを確認します。
#nanoservers.txtファイルは次のようになります:
speedtest.net構成の取得...5833)Hub Network Services Ltd(Newport、Wales)[57.50 km] 5938)Spectrum Internet(Cardiff、Great Britain)[65.89 km] 5443)Fasthosts Internet(Gloucester、Great Britain) [74.31 km] 6504)Secure Web Services Ltd(Shrewsbury、Great Britain)[78.64 km] 7265)Unitron Systems&Development Ltd(Telford、Great Britain)[87.11 km] 8225)Exascale Limited(Wolverhampton、Great Britain)[96.08 km ] 3110)zero.net.uk Ltd(Studley、Great Britain)[96.12 km] 12401)Dragon WiFi LTD(Haverfordwest、United Kingdom)[120.78 km] 1153)Warwicknet Ltd.(Coventry、Great Britain)[125.18 km] 1685 )Vodafone UK(ニューベリー、イギリス)[153.25 km] 4384)Iomart(レスター、イギリス)[157.40 km] 1234)Uno(ミルトン・ケインズ、イギリス)[170.71 km] 3504)TNP Ltd.(マンチェスター、イギリス) )[170.93 km] 11747)Vispa(マンチェスター、イギリス)[170.93 km]サーバーIDは左側にあります。各行の最後の数字は、スピードテストがあなたの場所とサーバーの場所との間の距離(キロメートル単位)を推定したものですが、正確すぎるかどうかはわかりませんが、実行ごとに変わる可能性があります。テストサーバーは、この距離の順に最も近いものから順にリストされます。このリストの一番上にあるサーバーに対してテストすると、理論的には、はるかに遠くにあるリストの一番下にあるサーバーと比較して、最速のpingと最高のダウンロードおよびアップロード速度が得られるはずです。
7サーバーIDを選択し、bandwidth.shを編集します。sh
今こそ、利用可能なさまざまなサーバーIDの選択に対して手動でスピードテストを実行し、どのような結果が得られるかを確認するときです。比較のために、英国とカリフォルニアにある2台のサーバーを選択しました。使用するコマンドの形式は次のとおりです。
#speedtest --server 1234表示される出力は次のようになります:
speedtest.net構成を取得しています...xxxxxxx(n.n.n.n)からテストしています...speedtest.netサーバーリストを取得しています...pingに基づいて最適なサーバーを選択しています...Uno(Milton Keynes)がホスト[187.87 km]: 33.243msダウンロード速度のテスト..............................................。 ..................................ダウンロード:1.60 Mbit/sアップロード速度のテスト.......。 .................................................。 .....................................アップロード:0.55 Mbit / s使用するサーバーを選択したら、数値のサーバーID(3台のサーバーを使用しましたが、必要に応じてこれを変更できます)をbandwidth.sh
の関連する行に入力します。runTest "5443" sleep 10runTest "1234" sleep 10runTest "1783" sleep 1また、特定の実行でspeedtestが失敗した場合に、ダミーエントリを作成するエラールーチンのコードを調整する必要があります。
#どのサーバーに対してテストしていますか? if [$ 1 ="5443"] then echo "5443、Fasthosts Internet、Gloucester、$ RIGHTNOW、73.09,0.0,0.0,0.0" fi if [$ 1 ="1234"] then echo "1234、Uno、Milton Keynes、$ RIGHTNOW 、168.27,0.0,0.0,0.0 "fi if [$ 1 =" 1783 "] then echo" 1783、Comcast、\" San Francisco、CA \"、$ RIGHTNOW、8420.0,0.0,0.0,0.0 "fiそこにある$RIGHTNOWの後の数字(例:73.09)は、現在地から問題のサーバーまでの距離(キロメートル単位)です。私はこれらをどこにも使用しないので、単なるプレースホルダーであり、任意の数値にすることができます。
その1783の例では、作成しているCSVファイルに引用符を入れるために、場所に引用符を付けてエスケープする必要があることに注意してください。この場所にはコンマが含まれているため、ここでは引用符が必要です。引用符をエスケープしないと、コンマはCSVフィールド区切り文字として扱われ、SQLiteのインポートで問題が発生します。選択したサーバーにカンマが含まれる同様の場所のテキストがある場合は、エスケープされた引用符を使用する必要があります。
8cronジョブを設定します
/usr/local/etc/bandwidth.shを実行するために、1時間に1回(または理由の範囲内で必要な頻度で)実行するようにcronジョブを設定します。 ISPConfigを実行している場合は、それを使用してcronジョブをスケジュールできます。
または、Linuxコマンドラインで次のように入力できます。
#crontab -eこれに似たものが表示されるはずです(「root」としてログインしていることを忘れないでください):
* * * * * /usr/local/ispconfig/server/server.sh 2>&1 |行を読んでいる間;エコー`/bin / date`" $ line ">> /var/log/ispconfig/cron.log;完了*** * * /usr/local/ispconfig/server/cron.sh 2>&1 |行を読んでいる間;エコー`/bin / date`" $ line ">> /var/log/ispconfig/cron.log; done1 * * * * /usr/local/etc/bandwidth.sh 2>&1ISPConfigを実行していない場合、これは最初は空である可能性があります。上記のように最後の行を正確に追加します(間隔は重要です)。シェルスクリプトを午前00:01に開始して実行し、その後、毎日1時間ごとに繰り返します。もちろん、さまざまな時間を選択できます。 (これを初めて実行するとき、crontabは使用するエディターを尋ねます-私はnanoを選択します。)
9PHPopen_basedirを設定
WebサイトのPHPopen_basedirエントリに/usr/ local/etcを追加します。 ISPConfigでは、これはWebサイトの[オプション]タブにあります。
これにより、bandwidth.phpコードは、作成したばかりのSQLiteデータベースにそのディレクトリでアクセスできるようになります。
/ var / www / clients / client1 / web1 / web /など、すでにアクセス可能に設定されているディレクトリにデータベースを作成することにした場合は、これをスキップできますが、セキュリティの観点からは不適切な選択です。 。
10bandwidth.phpを作成
このコードを、サーバーのベースWebドキュメントディレクトリにあるbandwidth.phpという名前のファイルにコピーする必要があります。 ISPConfigを使用している場合、これは/ var / www / clients / client1 / web1 / web /
のようになります。帯域幅モニター-過去24時間のダウンロード速度 ダウンロード速度-過去24時間
このファイルを編集して、レポートするサーバーIDを使用します。ここでの例ではサーバー1234を使用しています。数日間のデータを調べた後、このサーバーは、私が得ていると感じた速度に最も近いMbpsの数値を生成していることがわかりました。 serveridはSQLSELECTステートメントのWHERE句にあります:
SELECT serverid、strftime( "%H:%M"、times)|| "" || strftime( "%d /%m /%Y"、times)ASタイムスタンプ、スポンサー、サーバー名、
ダウンロード
FROM帯域幅
WHERE serverid =1234
ORDERBY回
制限24オフセット(SELECT COUNT(*)/ 3 FROMbandwidth)-24;このSQLステートメントは正確に何をしていますか? SQLに慣れていない場合は、各部分を見てみましょう。
a。 SELECTは、SQLデータベーステーブルからレコードを読み取るコマンドであり、その後に読み取るフィールドやその他のオプションが続きます。
b。 strftime( "%H:%M"、times)|| "" || strftime( "%d /%m /%Y"、times)ASタイムスタンプ
speedtestがCSV出力で作成した日時文字列をもう少しユーザーフレンドリーなものに再フォーマットすることです。英国形式の日付が欲しいので、これは「2017-08-31T12:02:51.898186Z」のような文字列を取り、「12:0231/08/2017」に変換します。この再フォーマットは、後で処理するよりも、SQLステートメントで直接行う方が簡単です。ここでの時間はUTC/GMTになりますが、これは私にとっては問題ありませんが、これを変更することをお勧めします。例えば米国形式の日付が必要な場合は、その2番目の部分をstrftime( "%m /%d /%Y"、times)に変更します。
c。 serverid、timestamp、sponsor、servername、downloadは、SQLテーブルから読み取り、JSONオブジェクトに作成するフィールドです。
d。 FROM帯域幅は、読み取り元のSQLテーブルの名前です。
e。 WHERE serverid =1234は、読み取るテーブルのサブセットを設定します。これを、使用したサーバーIDと一致するように変更します。複数のサーバーのデータを読み取る場合もありますが、グラフが複雑になります。
f。 ORDER BY回は、出力の並べ替え順序を設定します。speedtestが実行ごとに設定したタイムスタンプ順に並べ替えます。
g。 LIMIT 24は、24時間分のデータのみを表示したいため、またcronジョブが1時間に1回実行されるように設定されているため、出力を24レコードに制限します。 1時間に2回実行している場合、24時間のデータを取得するには、これを48に設定する必要があります。
h。オフセット(SELECT COUNT(*)/ 3 FROMbandwidth)-24;テーブルの最後の24レコードは、関心のある最新のエントリであるため、LIMITと一致するようにOFFSETを指定する必要があります。これがないと、テーブルの最新の24レコードではなく、常に最初の24レコードを取得することになります。正しいオフセットを取得するには、(SELECT COUNT(*))を使用してテーブル内のすべてのレコードをカウントし、これを3で除算し(3つの異なるサーバーごとに1回、1時間に3回スピードテストを実行しているため)、24を減算します。この合計から正しいOFFSET位置を取得し、LIMIT24が必要なレコードを取得できるようにします。
1時間に3つの異なるサーバーテスト以外のものを実行するようにbashスクリプトを変更した場合は、それに応じてその/3の部分を調整します。 1台のサーバーに対してのみテストする場合、分割はまったく必要ありません。
グラフの全体的なサイズを調整することもできます。ここでは、画面に適したサイズをハードコーディングする簡単な方法を採用しています。これは次の行に設定されています:
11ファイルのローカルコピーを取得する
私は、Webページで必要な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バージョンを指すようにします。この行を変更するだけです:
これに:
12ISPConfigでPHPを有効にする
まだ設定されていない場合は、Webサイトの設定でPHPを有効にすることを忘れないでください。
13ブラウザにbandwidth.phpをロード
いよいよ終了です。 bandband.shシェルスクリプトを数回実行してデータを生成したら(または最初は手動で数回実行できます)、ブラウザでLinuxサーバーのWebサイトにアクセスし、bandwidth.phpをロードすると、次のように表示されます。これ:
はい、私のブロードバンドは本当にひどいです!
最後に、ここでカバーする価値のあるいくつかの追加のポイントがあります:
14棒グラフの出力
SQLテーブルに格納されているダウンロードとアップロードの数値はMbpsではなくbpsであることに注意してください(10進数の途方もない数-1533681.5922415722のような数値とともに)。これは、CSVモードで実行したときにspeedtestがデータを生成する方法です。棒グラフのy軸出力に、bpsではなくMbpsの数値を表示するために、bandwidth.phpのJavascriptコードに変換を実行するための2本の線が含まれています。
mbps =Math.round(bandwidth_data [i] .download / 1000).toFixed(3)/ 1000; bvalue =mbps.toLocaleString(undefined、{minimumFractionDigits:3});toLocaleStringを使用すると、ブラウザのロケール設定で設定されている正しい10進基数句読点(「。」または「、」)が挿入されますが、これは実装に依存し、多少一貫性がありません。表示された場合。の代わりに、そしてそれはあなたを悩ませます、そしてGlobalizeはこれを修正する方法です。以下の「18のさらなるステップとアイデア」を参照してください。
末尾のゼロのデフォルトのホバーコード処理をオーバーライドするには、さらに数行が必要です。chart.jsは通常、「2.000」を「2」として表示するためです。これは、特に次の問題が発生した後は、私が望むものではありません。そもそもそこにあることを確認する:
//デフォルトのツールチップをオーバーライドして、末尾のゼロを既に配置している場合でもドロップします。ツールチップ:{callbacks:{label:function(tooltipItem、data){var value =data.datasets [0] .data [ tooltipItem.index]; var label ='ダウンロード:'; var retvalue =value.toLocaleString(undefined、{minimumFractionDigits:3});ラベルを返す+''+ retvalue +'Mbps'; }}}、これは、chart.jsに「ドリルダウン」して、動作方法を変更する方法の良い例です。
また、すべてのバーのx軸にタイムスタンプを印刷するようにグラフオプションを設定しました:
xAxes:[{ticks:{autoSkip:false、maxTicksLimit:24}デフォルトのオプション(autoSkipがtrueに設定されている)では、ラベルにいくつかの奇妙なギャップが生じました。 24エントリ以外を表示する場合は、maxTicksLimitを変更する必要があります。
chart.jsオプションの変更についてさらにサポートが必要な場合、または作業したいものが得られない場合は、特定のchart.jsスタックオーバーフローページを確認してください-そこには多くの有用な情報があります-https:// stackoverflow .com / questions / tagsed / chart.js-検索ボックスを使用して、探しているものを絞り込みます。残念ながら、chart.jsのドキュメントには、この素晴らしいオープンソースコードを使用してスピードを上げるのに確かに役立つ、より高度な例のいくつかが欠けています。
15エラー処理
最初のテスト実行中に、speedtestがCSVファイルで「speedtestサーバーリストを取得できません」と報告したことに何度か気づきました。おそらくこれは、ブロードバンド接続が非常に悪く、speedtestがテストサーバーにまったく接続できなかった時期を反映していると思われます。このテキストは明らかにSQLiteデータベースにインポートしたい形式ではないので、この不要なテキストをCSVファイルから削除し、特定のタイムスロットのデータベースにゼロエントリを含めるソリューションが必要でした。そうしないと、SQLテーブルに不足しているエントリが表示されなくなり、グラフを作成するときに1日あたり24個のエントリが必要だった配置が破棄されます。
帯域幅.shで、スクリプトがスクリプト変数$?を使用してspeedtestによって設定された終了コードをテストしていることがわかります。ゼロより大きい場合、これはスピードテストが失敗したことを示します。これにより、ダミーのCSVエントリを作成する関数がトリガーされます。このエントリは、その実行のCSVファイルを上書きするために使用されます。
bashスクリプトにはコメントアウトされている行がいくつかありますが、これらの行のコメントを解除した後にスクリプトを実行すると、このエラールーチンをテストしてダミーのゼロエントリを生成します。
############################################# test /デバッグケース-スピードテストを強制的に失敗させます########################################### ## runTest "199999999"#sleep5#######テスト後にコメントアウト############################## ########################これは、speedtestが好まない「ナンセンス」サーバーIDを使用するため、ゼロ以外の終了コードが返されます。次に、スクリプトは、SQLテーブルに適切に配置され、無視されるか、削除できるダミーエントリを作成する必要があります。
このテストの目的で、speedtestを強制的に失敗させる別の方法は、サーバーのネットワーク接続を削除することです。いつでもbandwidth.shスクリプトを手動で実行できることを忘れないでください。cronjobが差し迫っている場合は手動で実行しないようにする必要がありますが、cronjobが起動するのを待つ必要はありません。 2つのスクリプトを同時に実行すると、CSVファイルとSQLテーブルが混乱する可能性があります。
最悪の事態が発生した場合は、/ usr / local / etc / speedtest.bakとして保持されているバックアップCSVファイルがあります。このファイルには、bashスクリプトの最初の実行以降のspeedtestからのすべてのCSV出力が含まれている必要があります。これを編集して不要なエントリを削除し、SQLテーブルをクリアしてから、CSVエントリのセット全体をSQLiteに再インポートすることができます。
16のタイムゾーン
SpeedtestはUTCで時間を報告します(基本的にこれはグリニッジ標準時またはGMTと同じです)。 UTCを使用するということは、SQLテーブルに格納されているすべての時間が一貫していることを意味し、夏時間は望ましくない影響を与えません。
ただし、これは、bandwidth.shのエラー処理ルーチンが、これを反映するためにダミーエントリのタイムスタンプを作成する必要があることを意味します。これは非常に簡単です。--utcフラグを含めただけです:
local RIGHTNOW =$(date --utc +%Y-%m-%dT%H:%M:%SZ)グラフのx軸ラベルにUTC/GMT以外のものとして時間を表示する場合、そのような変更を行うのに最適な場所は、SQL SELECTステートメントです(例:
)。strftime( "%H:%M"、time(times、'localtime'))|| "" || strftime( "%d /%m /%Y"、times)ASタイムスタンプこれは、Linuxサーバーのタイムゾーン設定を使用して、グラフに表示される時間を調整します。または、Globalizeがフロントエンドでこれをどのように実行できるかを理解するために飛び込むことができます。
詳細については、https://www.timeanddate.com/time/gmt-utc-time.htmlおよびhttp://www.tutorialspoint.com/sqlite/sqlite_date_time.htmを参照してください。
17その他の手順とアイデア
Speedtestは、生データのソースである必要はありません。インターネットの速度だけでなく、どこからでも取得できます。原則は同じです。生データを有用な形式で取得し、必要なデータのサブセットを抽出してグラフ化するフロントエンドを備えたbashスクリプトからSQLiteにインポートできるバックエンドサーバープロセスです。
CSVとしてフォーマットするオプションがない場合、より複雑なbashスクリプトは(SQL INSERTコマンドを使用して)SQLテーブルに直接データを書き込むことができます。 SQLテーブルを設計するときは、後でデータを抽出する方法を検討してください。
変更を加えるときは、編集しているコードのコンテキストに注意してください。つまり、HTML内のJavascript内のPHPスクリプト内にSQLステートメントがあります。現在のレベルを覚えて、それに応じてコーディングしてください。道に迷い、JavascriptであるはずのPHPコードを書くことになりがちです。これが機能しないことを保証できます。
さらなる調査のためのいくつかのアイデアがあります:
- toLocaleStringは、ブラウザー間で一貫して実装されていません。 Globalizeを使用して、すべての数値、日付、タイムゾーンの形式を処理します。
- さまざまなタイプのインターネット接続データを収集できるようにするhttpstat(bashスクリプトバージョンがあります)をチェックアウトします。これを(個別の)SQLテーブルに格納し、出力をグラフ化します。
- bandwidth.phpフロントエンドを改善して、ユーザーがさまざまなオプションを選択できるようにします:24、48、72時間。特定の日付を選択し、データのアップロードとダウンロード、ping時間を含めます。
- レスポンシブブートストラップコードを使用するようにHTMLを変換して、さまざまなデバイスや画面サイズで適切に実行できるようにします。
- chart.jsの他のオプションのいくつかを調べてください。多分、折れ線グラフと棒グラフを組み合わせたものです。色とバーのサイズを変更します。
- SQLiteをMySQLに置き換え、ユーザー/パスワードを介したPHPからの読み取りアクセスでセキュリティを強化します。
- 同様のシステムを構築しますが、node.jsを使用します。
18リンク
- speedtest:https://github.com/sivel/speedtest-cli
- SQLite3:https://sqlite.org/
- chart.js:http://www.chartjs.org/
- グローバル化:https://github.com/globalizejs/globalize
- httpstat:https://github.com/b4b4r07/httpstat
- ブートストラップ:http://getbootstrap.com/
- PHP:http://www.php.net/
- ISPConfig:http://www.ispconfig.org/
- Debian:http://www.debian.org/