Oamenii se plâng de multe ori că WordPress este lent. Dacă acest lucru este adevărat sau nu, depinde de mulți factori, dar dacă putem vedea resursele serverului în interiorul tabloului de bord WordPress, atunci acesta poate da o oarecare înțelegere despre cât de bine funcționează instalarea WordPress.
În acest tutorial, vom realiza un plugin pentru a afișa starea serverului incluzând spațiul pe disc, consumul de memorie, utilizarea procesorului și utilizarea procesului.
Vom învăța, de asemenea, despre cache-ul WordPress pentru a evita interogarea acestor metrici de mai multe ori și vom acoperi și lucrările WordPress cron pentru a genera automat aceste date.
Tabloul de bord al administratorului, în mod implicit, ne prezintă câteva blocuri numite widget-uri. Acestea includ:
Widgeturile pot fi reordonate în funcție de preferință și pot fi afișate sau ascunse - în general, tabloul de bord este personalizabil.
Deoarece widgeturile sunt foarte flexibile și sunt disponibile chiar pe primul ecran al ecranului de administrator, le putem folosi pentru a afișa resursele serverului: starea discului, utilizarea RAM, utilizarea procesorului și informațiile despre sistemul de operare. Vom numi aceste metode de resurse pe scurt.
De-a lungul acestor serioase vom învăța API-urile Dashboard widgets și rolurile și capabilitățile pentru a face aceste widget-uri disponibile pentru unii utilizatori, deoarece datele ar putea fi sensibile.
Pentru a face acest lucru, vom afla, de asemenea, câteva comenzi de bază Linux pentru a extrage informații despre server și semințe în tabloul de bord widget. Vom utiliza API tranzitorii pentru a arhiva aceste date. Cronjobs va fi utilizat pentru a trage automat aceste date în loc să le primească la cerere la fiecare cerere.
Lucrul pluginului nostru este inspirat de Linux Dash.
Pluginul nostru acceptă nouă tipuri de valori. Ca rezultat, vom avea nouă widget-uri de tabloul de bord.
Să creăm un plugin simplu și să îl sunăm Tabloul de bord al serverului. Vom începe cu câteva lucruri de bază. O tradițională Salut Lume vă va ajuta să aveți un gust de adăugare a unui widget în tabloul de bord.
E ușor, de fapt.
Crearea unui apel de dosar Tabloul de bord al serverului interior wp-content / plugins
, și un fișier serverdashboard.php
. Aspectul dosarului arată astfel. Trebuie doar să se concentreze pe fișierul principal și să ignore bin, teste, widget-uri și așa mai departe.
Utilizați acest cod pentru serverdashboard.php
alerga(); ?>Am folosit spațiul de nume
AX \ StatBoard
pentru a evita coliziunea numelui cu diferite clase de pluginuri, nume de funcții ale temelor și alte pluginuri. alerga
pentru a înregistra cârligul sau filtrul cu WordPress.wp_dashboard_setup
. Aceste cârlige ne oferă acces la opțiunea de personalizare a tabloului de bord. Aceasta ne permite să adăugăm sau să eliminăm widgetul de bord din WordPress. wp_add_dashboard_widget
pentru a înregistra un widget. Aceasta necesită argumente în această ordine:De cele mai multe ori vom întâlni apeluri ca o singură funcție, o funcție anonimă, o matrice de obiect și o metodă sau o matrice de metodă de clasă și statică.Actualizați tabloul de bord. Pluginul nostru arată widget-ul său. Observați
id
din elementul div widget.Să avansăm. Vom arăta o schemă de plăcintă cu unele date fictive. Pentru a păstra ceva simplu, voi folosi API-ul Google Chart. Vom utiliza în mod extensiv mai târziu pentru măsurători pentru server, deoarece este mai bine să vizualizați acest tip de date.
Dacă nu vă place Google Chart, puteți să vă scapați de ea și să puneți biblioteca dvs. preferată. Amintiți-vă că acesta este un tutorial, așa că nu te limita - folosește orice ai face să te simți confortabil cu utilizarea!
Trebuie să încărăm scriptul Google Chart. Schimba-ti alerga()
metoda de a înregistra încă un cârlig.
funcția publică () add_action ('wp_dashboard_setup', array ($ this, 'add_dashboard_widgets')); add_action ('admin_enqueue_scripts', array ($ this, 'add_asset'));
admin_enqueue_scripts
este acțiunea de care trebuie să vă conectați pentru adăugarea propriului dvs. script în tabloul de bord al administratorului. Vom adăuga încă un apel de metodă add_asset
în clasa noastră să se ocupe de încărcarea de script-uri. Aplicația din add_asset
.
/ ** * Adăugați javascript * / funcția add_asset () wp_enqueue_script ('google-chart', 'https://www.google.com/jsapi');Avem biblioteca diagramelor. Acum trebuie să o facem în interiorul tabloului de bord. Puteți juca cu Google Chart. Vom folosi doar exemplul lor acum.
funcția add_dashboard_widgets () syslog (LOG_DEBUG, "Run"); wp_add_dashboard_widget ('hello_world_dashboard_widget', // A Slug pentru a identifica acest widget 'Hello World', // funcția widget title () echo <<<'EOD' Hey, I'm the body of widget. Thanks for bring me to the life.Pur și simplu adăugăm încă un element div cu id hello_piechart și redați diagrama în acel element. Să vedem ce avem acum:Observați ID-ul elementului widget.EOD; // funcția de a redacta conținutul widget-ului, folosesc o închidere aici);
Acum, că știm cum să adăugăm propriul bloc widget la tabloul de bord, iar acum că știm cum să obținem informațiile Google Chart, putem combina cele două pentru a afișa mai multe informații.
În secțiunea următoare, vom învăța cum să luăm metricile serverului și să redăm conținut pentru fiecare tip de metric al serverului pe care l-am discutat anterior.
Atunci când tragem metricile serverului, vom folosi comanda Linux pentru a obține aceste informații. În PHP, putem folosi backtick "sau shell_exec pentru a invoca o comandă shell și a prelua ieșirea.
Putem analiza rezultatul pentru a obține date server. De exemplu, pentru a obține starea de utilizare a discului, putem folosi comanda df -h
. Cunoaștem formatul de ieșire, astfel încât să putem parsa pentru a obține ceea ce vrem.
$ df = 'df -h'; $ df = explode ("\ n", $ df); dacă is_array ($ df) && count ($ df)> = 2) array_shift ($ df); // Descărcați prima linie $ df = array_map (funcția ($ line) if (gol ($ line)) return NULL; $ segment = preg_split ('/ \ s + /' 'file system' => $ segment [0], 'size' => $ segment [1], 'used' => $ segment [2], 'available' => $ segment [3], 'use_percent' => $ segmentul [4],);, $ df); var_dump ($ df);
[command_we_run] | awk 'print $ 1, $ 3, ...'
. ☁ Server Tabloul de bord [master] ls -lh total 32 -rw-r-r-- 1 kureikain personal 2.6K Apr 11 00:46 Server Dashboard.php drwxr-xr-x 3 staff kureikain 102B Mar 29 01:27 bin - rw-r-r-- 1 kureikain personal 98B 5 apr 5 18:53 loader.js -rw-r-r-- 1 kureikain personal 321B Mar 29 01:27 phpunit.xml drwxr-xr-x 4 personal kureikain 136B Mar 29 01:27 teste drwxr-xr-x 12 kureikain staff 408B 13 apr 17 17:37 widget -rw-r-r-- 1 kureikain personal 1.1K Apr 6 01:04 widget.php ☁ Server Dashboard [master] ls -lh | awk 'print $ 3, $ 4, $ 5, $ 9' personal kureikain 2.6K Server kureikain personal 102B bin kureikain personal 98B loader.js staff kureikain 321B phpunit.xml staff kureikain 136B teste personal kureikain 408B widget kureikain staff 1.1K widget.phpDupă cum puteți vedea fiecare linie de
Este -la
conține nouă câmpuri:drwxr-xr-x 4 personalul kureikain 136B Mar 29 01:27 testeSeparând prin spații, aceste 9 câmpuri sunt:
awk 'tipăriți $ 3, $ 4, $ 5, $ 9'
și voi vedea:kureikain 136B teste de personal
Prin urmare, folosind awk putem curata rezultatul putin mai mult inainte de a ne alimenta functia de procesare PHP.
Unele comenzi extrag date suplimentare de care nu avem nevoie; prin urmare, aceasta necesită un pic de efort suplimentar cu PHP pentru ao curăța.
De exemplu:
[vagrant @ vagrant-centos64 ~] $ gratuit -m total folosiți tampoane partajate gratuite cache Mem: 589 537 51 0 8 271 - / + tampoane / cache: 258 330 Schimb: 255 0 255
free -m
ne arată utilizarea RAM cu memorie și fișier swap; cu toate acestea, acesta include alte două linii cu total / used / free și - / + buffere / cache pe care probabil că nu le avem nevoie. -E
intrerupator. Acest comutator permite folosirea expresiei regulate pentru căutare. Pentru că vrem să găsim linia cu cuvintele Mem și Swap, să combinăm grep -E "Mem Swap"
. [vagrant @ vagrant-centos64 ~] $ liber -m | grep -E "Mem Swap" Mem: 589 536 52 0 8 271 Schimb: 255 0 255Deci este mult mai curat. Combinați ambele
grep
și awk
putem să curățăm datele și să obținem doar ceea ce avem nevoie.[vagrant @ vagrant-centos64 ~] $ liber -m | grep -E "Mem Swap" awk 'print $ 1, $ 2, $ 3, $ 4' Mem: 589 537 52 Schimbați: 255 0 255
Trebuie să învățăm câteva comenzi pentru a extrage valorile serverului, deci deschideți shell-ul serverului și încercați să tastați comanda de mai jos pentru a avea un gust rapid.
$ netstat -in Kernel Interface table Iface MTU Met RX - OK RX - ERR RX - DRP RX - OVR TX - OK TX - ERR TX - DRP TX - OVR Fl0 eth0 1500 0 5538339494 0 0 0 6216082004 0 0 0 BMRU eth0: 1 1500 0 - nu există statistici disponibile - BMRU eth1 1500 0 96707328840 0 0 0 102776317608 0 0 0 BMRU eth2 1500 0 33 0 0 0 7 0 0 0 BMRU lo 16436 0 29461422 0 0 0 29461422 0 0 0 LRU
df -h Dimensiune sistem de fișiere folosit Disponibil Utilizați% montat pe / dev / sda7 2.0G 660M 1.3G 35% / / dev / sda8 1.0T 632G 340G 66% / home / dev / sda6 2.0G 68M 1.9G 4% / tmp / dev / sda5 20G 1.5G 18G 8% / var / dev / sda2 20G 2.1G 17G 12% / usr / dev / sda1 194M 25M 160M 14% / boot / dev / hdb1 459G 277G 159G 64% / backup tmpfs 16G 0 16G 0% / dev / shm
free -m total folosită gratuit tampoane partajate cache Mem: 32189 32129 59 0 419 9052 - / + buffere / cache: 22656 9532 Schimb: 32767 4 3276Vom folosi mai mult comanda mai târziu, dar deasupra vă vom da o comandă fundamentală pentru a vedea ce putem obține de la serverul de pe linia de comandă.
Vom refactoriza clasa noastră originală în secțiunea anterioară un pic. Rețineți că, dacă nu afirmăm altfel în mod clar, vom crea toate fișierele și folderele în directorul nostru de plugin-uri.
În primul rând, nu vom dori să includeți fișiere manual. Vom scrie un încărcător de clasă auto în acest scop. Când o clasă lipsă este inițializată, vom verifica numele clasei și vom încerca să includem fișierul sursă care deține definiția clasei.
Vom folosi spațiile de nume ca și calea și numele clasei ca numele fișierului. De exemplu, o clasă foo
în spațiul de nume AX \ StatBoard
ar trebui să fie în rădăcina dosarului plugin. O clasa bâzâit
în spațiul de nume AX \ StatBoard \ Bar
ar trebui să fie în Bar \ buzz.php
Având în vedere acest lucru, să mergem mai departe și să începem să realizăm metoda noastră de încărcare automată:
_plugin_dir. strtolower (str_replace ('\\', '/', $ classname). '.php'); dacă (! file_exists ($ filepath)) return false; include $ filepath;Deci, ce se întâmplă aici? Pluginul nostru utilizează spațiul de nume
/ **
* Setare variabilă și intializarea widget furnizor
* /
funcția __construct ()
$ this -> _ plugin_dir = plugin_dir_path (__FILE__);
spl_autoload_register (array ($ this, 'load_class'));
// ...
AX \ StatBoard
. Așadar, asigurați-vă că clasa cerută sub acest spațiu de nume trebuie să fie gestionată de plugin-ul nostru, altfel încărcătorul nostru auto nu este capabil să-l încarce. Apoi, dezbracăm AX \ StatBoard în numele clasei și înlocuiți-l cu calea dosarului plugin. Marșul spate \ în spațiul de nume este înlocuit cu / cale separator, și adăugați php
extensie. Aceasta înseamnă că spațiul de nume va fi folosit ca calea către dosar conține fișier de clasă, iar numele clasei este numele fișierului. Includerea apare numai dacă fișierul există. Acum, am primit încărcătorul auto, trebuie să-i lăsăm pe PHP să știe că avem un încărcător auto și dorim să-l folosim. PHP include spl_autoload_register în acest scop. Am pus-o în constructorul nostru de clasă.wp_add_dashboard_widget
, trebuie să îi oferim titlul și conținutul. În funcție de fiecare widget, vom avea o clasă pentru a face titlul și conținutul pentru el. Noi numim aceste clase sunt widget-uri Furnizor de
. Toți furnizorii de widgeturi trebuie să definească get_title ()
și get_content ()
pentru a face conținut.Furnizor de
interfață, iar clasa furnizorului nostru de widget-uri să implementeze această interfață. De asemenea, trebuie să creați încă un apel de metodă get_metric ()
pentru a extrage datele serverului.widget / provider.php
cu acest conținut:Aceasta este o interfață. Ne-am cerut ca fiecare furnizor de widget-uri să implementeze această interfață și, prin urmare, asigurăm că clasa furnizorilor de dispozitive tat are întotdeauna aceste trei metode.
Vom crea o clasă mai multWidget
pentru a gestiona acești furnizori. Creați clase de furnizori, apoi le trimiteți acestoraWidget
clasă și vizualizareWidget
clasa ca punct unic pentru a cere unui furnizor atunci când avem nevoie. Putem pune pur și simplu totul în fișierul nostru principal de plugin, și doar creăm instanță de clasă cunou
operator atunci când avem nevoie, dar este greu să ne menținem mai târziu.
Când spargem lucrurile în mai multe straturi, este mai ușor să le testezi și să le extindem. Odată ce facem ca toți furnizorii să fie gestionați de o singură clasă, putem folosi acea clasă unică pentru a face același lucru asupra setului de furnizori. Putem adăuga cu ușurință mai mulți furnizori în orice moment, doar prin crearea unui obiect care implementează clasa furnizorilor și le alimenteazăWidget
clasă
Compuneți un fișierwidget.php
în directorul rădăcină al dosarului plugin.Din nou, folosim Modelul Singleton pentru clasa Widget. Un scurt rezumat al metodei noastre aici.
namespace AX \ StatBoard;
utilizați AX \ StatBoard \ Widget \ Provider;
clasa Widget
const WIDGET_SLUG_PREFIX = 'AX';
protejate $ _providers = array ();
protecția statică $ _instance;
funcția statică ()
returneaza eu :: $ _ instanta = auto :: :: _ instanta?: new self ();
funcția __construct ()
/ **
* Adăugați un furnizor de widget-uri
* @ widget șir de paragraf
* Obiect furnizor @ param pentru a gestiona randarea conținutului widget
* /
funcția publică add_provider ($ name, Provider $ handler)
$ this -> _ furnizori [$ name] = $ handler;
returnați $ this;
/ **
* Obțineți toți furnizorii sau un anumit furnizor
* /
funcția publică get_provider ($ name = NULL)
dacă (! $ name)
returnați $ this -> _ providers;
returneaza $ this -> _ furnizori [$ name];
/ **
* Înregistrați un widget pentru al face.
* /
registrul funcțiilor publice ($ name)
$ slugid = auto :: WIDGET_SLUG_PREFIX. $ nume;
$ widget_provider = $ acest-> get_provider ($ nume);
dacă (gol ($ widget_provider))
return false;
wp_add_dashboard_widget (
$ slugid,
$ Widget_provider-> get_title (),
array ($ widget_provider, 'get_content'));
return true;
add_provider
metoda va adăuga un obiect furnizor de obiecte widget la lista de furnizori widget. De asemenea, folosim sugestia de tip pentru a ne asigura că obiectul trece la add_provider trebuie să fie a Furnizor de prin implementarea noastrăFurnizor de
interfață.get_provider
metoda poate returna o listă a tuturor furnizorilor sau a unui anumit furnizor.Inregistreaza-te
metoda va înregistra de fapt obiectul furnizorului nostru cu WordPress pentru a reda un widget de bord cuwp_add_dashboard_widget
. ID-ul widget-ului este generat pe baza prefixului, a unei constante predefinite și a clasei de widget. Titlul va fi și conținutul va fi tras pringet_title
și get_content
de furnizor. Ne-am asigurat că pun în aplicare interfața Furnizorului nostru. Cu această metodă de înregistrare, am rezumat implementarea adăugării widget-ului în tabloul de bord. Tot ce trebuie să facem acum este să sunămInregistreaza-te
cu numele furnizorului pe care îl adăugăm mai înainteadd_provider
. Cu acest lucru în minte, când WordPress API se schimbă, nu trebuie să mergem în fiecare locwp_add_dashboard_widget
, noi doar actualizăm într-un singur loc.
Vom reveni la fișierul nostru original principal de pluginserverdashboard.php
, vom inițializa toți furnizorii și le vom adăuga la lista de furnizori a obiectului Widget._plugin_dir = plugin_dir_path (__FILE__); spl_autoload_register (array ($ this, 'load_class')); $ this -> _ dashboard_widget = array ('server', 'cpu_load', 'ram', 'disk', 'diskio', 'software', 'ethernet', 'internetspeed', 'networkio', 'process'); ($ this -> _ dashboard_widget ca element $) if (! file_exists ($ this -> _ plugin_dir. '/ widget /'. $ item. '.php')) continuați; $ classname = 'AX \\ StatBoard \\ Widget \\'. ucwords (element $); Widget :: instanță () -> add_provider ($ item, new $ classname ());Vom pune toate clasele furnizorilor de widgeturi sub spațiul de numeAX \ StatBoard \ Widget
și prin urmare ei vor sta în interiorul dosaruluiwidget
. Suportăm nouă tipuri de metric și numim clasa corespunzătoare matricei_dashboard_widgets
de mai sus.
Pentru fiecare widget, creăm o nouă instanță a furnizorului său și adăugăm înWidget
clasă. Iată ce vom obține ulterior cu această structură:
Ține minte că ne-am cuplatwp_dashboard_setup
, iar în interiorul acestuia numim funcțiawp_add_dashboard_widget
pentru a adăuga un widget nou în tabloul de bord. Apoi, avem pe noiInregistreaza-te
în acest scop. Vom bifa toți furnizorii adăugați și le vom înregistra. Actualizați conținutuladd_dashboard_widgets
deserverdashboard.php
deveni:
/ ** * Inregistreaza proiectorul widget-ului de bord pentru a se arata pe tabloul de bord * / function add_dashboard_widgets () $ widget = Widget :: instanta (); foreach ($ widget-> get_provider () ca $ name => $ furnizor) $ widget-> register ($ name);
Apoi, vom cârti în admin_footer pentru a afișa JavaScript inline în partea inferioară a paginii admin pentru inițializarea pachetului de clasă Google Chart. Al nostrualerga()
metoda este de asemenea actualizată pentru noul cârlig./ ** * Începeți să configurați cârligul * / funcția publică executați () add_action ('wp_dashboard_setup', array ($ this, 'add_dashboard_widgets')); add_action ('admin_enqueue_scripts', array ($ this, 'add_asset')); add_action ('admin_footer', array ($ this, 'footer')); / ** * JavaScript inline pentru grafic * / function footer () echo ' „;
În acest moment, am completat fișierul de bază, iar fișierul plugin principal ar trebui să arate așa._plugin_dir. strtolower (str_replace ('\\', '/', $ classname). '.php'); dacă (! file_exists ($ filepath)) return false; include $ filepath; / ** * Variabila de instalare și intializarea furnizorului de widget * / funcția __construct () $ this -> _ plugin_dir = plugin_dir_path (__FILE__); spl_autoload_register (array ($ this, 'load_class')); $ this -> _ dashboard_widget = array ('server', 'cpuload', 'ram', 'disk', 'software', 'process', 'ethernet', 'networkio', 'iostat'); ($ this -> _ dashboard_widget ca element $) if (! file_exists ($ this -> _ plugin_dir. '/ widget /'. $ item. '.php')) continuați; $ classname = 'AX \\ StatBoard \\ Widget \\'. ucwords (element $); Widget :: instanță () -> add_provider ($ item, new $ classname ()); / ** * Creează o instanță unică prin intermediul aplicației * / public static function () returnați eu :: $ _ instanță = auto :: $ _ instanță?: New self (); / ** * Începeți să configurați cârligul * / funcția publică executați () add_action ('wp_dashboard_setup', array ($ this, 'add_dashboard_widgets')); add_action ('admin_enqueue_scripts', array ($ this, 'add_asset')); add_action ('admin_footer', array ($ this, 'footer')); / ** * Inregistreaza proiectorul widget-ului de bord pentru a se arata pe tabloul de bord * / function add_dashboard_widgets () $ widget = Widget :: instanta (); foreach ($ widget-> get_provider () ca $ name => $ furnizor) $ widget-> register ($ name); / ** * Încărcarea activelor: foaie de stil, JS. * / funcția add_asset () syslog (LOG_DEBUG, "Loaded"); wp_enqueue_script ("diagrama google", "https://www.google.com/jsapi"); / / wp_enqueue_script ('plugin_dir_url', plugin_dir_url (__FILE__) ./loader.js '); / ** * JavaScript inline pentru grafic * / function footer () echo ' „; Tablou de bord :: instanță () -> executați ();În principiu, creați o instanță a clasei plugin-ului principal și apelați metoda de rulare. Care, la rândul său, a stabilit o listă de cârlig. Fiecare cârlig este o altă metodă în interiorul clasei. De asemenea, creăm și înregistrăm obiectul furnizorului nostruWidget
obiect.Ce urmeaza?
În acest moment, încă nu afișăm nimic; cu toate acestea, am stabilit o structură pentru anunțul plugin-ul nostru care a început să se găsească în Google Charts.
Puteți descărca scriptul complet din linkurile de descărcare din partea de sus a acestui articol. Vom intra în detaliile implementării fiecărui furnizor de widget în articolul următor, deci asigurați-vă că urmați următoarea parte.
Sper că ți-a plăcut acest articol. Lăsați comentarii cu oricare dintre gândurile dvs. și voi fi sigur că le răspundeți.