利用PHP实现对服务器性能与状态的监控
最近由于工作上的原因,需要开发一套服务器性能的监控工具,主要是一些同架构同软件配置的服务器。考虑到最近用php比较多,随即决定使用php来实现。主要需要实现的部分功能如下: 1、系统状态,如cpu / 内存 / swap等数据; 2、MySQL的性能与运行状态; 其它
最近由于工作上的原因,需要开发一套服务器性能的监控工具,主要是一些同架构同软件配置的服务器。考虑到最近用php比较多,随即决定使用php来实现。主要需要实现的部分功能如下:
- 1、系统状态,如cpu / 内存 / swap等数据;
- 2、MySQL的性能与运行状态;
其它主要是配合性的数据存储以及可视化。
1、使用SNMP实现对系统状态的抓取
SNMP的确是一个很方便的协议,用它可以获取网络设备几乎所有的信息,Linux和Win都可以很好的支持。MIB是一个纷杂的数据库,通过筛选可以获取我们所需要的信息。
PHP5对snmp协议v2有较好的支持。为了方便,可以获取一大组数据,将其存储到一个数组中,再从数组中挑选需要的数据。snmp2_real_walk便可以满足这个需求。它的用法如下:
<p class="line">1</p> Copier après la connexion Copier après la connexion Copier après la connexion Copier après la connexion |
<p class="line">$status = @snmp2_real_walk($host, $community, ".1.3.6.1.4.1.2021",10,5);</p> Copier après la connexion |
- $host是目标主机
- $community是其相应的SNMP community code
- “1.3.6.1.4.1.2021”是我们要获取的数据树
- 10是超时时间(秒)
- 5是失败后的重试次数
为了防止出错后报错,使用@强行关闭报错。
获取的结果存储在$status里,之后便可以从$status中定位我们所需要的数据了。MIB可能是用数字组织的,也有可能是一堆名字,具体可以在这里进行查询。需要注意,获取的结果中,值和结果是混合在一起的,需要对字符串进行一定的截取。下面是几个比较常用的值:
<p class="line">1</p> Copier après la connexion |
<p class="line">$host_status['uptime_1min'] = (float)@substr($status['UCD-SNMP-MIB::laLoad.1'], 9);</p><p class="line">$host_status['uptime_5min'] = (float)@substr($status['UCD-SNMP-MIB::laLoad.2'], 9);</p><p class="line">$host_status['uptime_15min'] = (float)@substr($status['UCD-SNMP-MIB::laLoad.3'], 9);</p><p class="line">$host_status['user_cpu'] = (int)@substr($status['UCD-SNMP-MIB::ssCpuUser.0'], 9);</p><p class="line">$host_status['system_cpu'] = (int)@substr($status['UCD-SNMP-MIB::ssCpuSystem.0'], 9);</p><p class="line">$host_status['idle_cpu'] = (int)@substr($status['UCD-SNMP-MIB::ssCpuIdle.0'], 9);</p><p class="line">$host_status['total_swap'] = (int)@substr($status['UCD-SNMP-MIB::memTotalSwap.0'], 9);</p><p class="line">$host_status['available_swap'] = (int)@substr($status['UCD-SNMP-MIB::memAvailSwap.0'], 9);</p><p class="line">$host_status['total_ram'] = (int)@substr($status['UCD-SNMP-MIB::memTotalReal.0'], 9);</p><p class="line">$host_status['used_ram'] = $host_status['total_ram'] - (int)@substr($status['UCD-SNMP-MIB::memAvailReal.0'], 9);</p><p class="line">$host_status['cached_memory'] = (int)@substr($status['UCD-SNMP-MIB::memCached.0'], 9);</p> Copier après la connexion |
SNMP采用的是UDP协议,因此数据获取可能会失败,可以考虑在失败之后重试几次。
<p class="line">1</p> Copier après la connexion |
<p class="line">$i = 0;</p><p class="line">$status = array();</p><p class="line">do {</p><p class="line"> $i ++;</p><p class="line"> $status = @snmp2_real_walk($host, $community, ".1.3.6.1.4.1.2021",10,5);</p><p class="line">} while(!(count($status) != 0 OR $i >= 3));</p> Copier après la connexion |
2、获取MySQL数据库的状态数据
获取MySQL的状态较简单,只需要运行下面这个查询即可:
<p class="line">1</p> Copier après la connexion Copier après la connexion Copier après la connexion Copier après la connexion |
<p class="line">SHOW GLOBAL STATUS</p> Copier après la connexion |
这个查询的结果也非常丰富,只需要从中挑选需要的即可。例如下面的例子获取了若干查询的数量:
<p class="line">1</p> Copier après la connexion Copier après la connexion |
<p class="line">$db = @new mysqli($host, $mysql_user, $mysql_pwd);</p><p class="line">$result = @$db->query("SHOW GLOBAL STATUS");</p><p class="line">$status = array();</p><p class="line">if($result) {</p><p class="line"> while($temp = $result->fetch_assoc()) {</p><p class="line"> switch($temp['Variable_name']) {</p><p class="line"> case "Com_select":</p><p class="line"> case "Com_insert":</p><p class="line"> case "Com_delete":</p><p class="line"> case "Com_update":</p><p class="line"> case "Com_change_db":</p><p class="line"> $status[$temp['Variable_name']] = $temp['Value'];</p><p class="line"> break;</p><p class="line"> default:</p><p class="line"> break;</p><p class="line"> }</p><p class="line"> }</p><p class="line"> $db->close();</p><p class="line"> return $status;</p><p class="line">} else</p><p class="line"> return false;</p> Copier après la connexion |
唯一需要注意的是,上述值是MySQL服务启动之后的累加值,所以说只要MySQL不重启,这些值是递增的。而在实际分析或者显示时,一般是需要某个时间段内的值,有如下两个思路来应对:
- 1、获取最新一次的数据时,从数据库中查询到上次获取的值,二者相减,即可得到两次查询内的数据值,这个实现时还需要保存一个额外的临时值以用于作为减数,否则会失去“坐标”;
- 2、将最新获取的值存储在数据库中,在显示或者读取时,再进行相应的减法操作;
个人比较推荐采用第二种方法,即在使用时再对数据进行处理,这至少遵循了“保存原始数据”这一原则,而且需求是有可能变化的。
3、定期执行PHP脚本获取状态值
PHP本身无法实现定时运行这一功能,因此只有借助其它手段,比如,Linux中的crontab,按设定的规则和时间在后台执行,只需要将定时执行的内容换成命令行下的PHP脚本即可。
下面的这一段PHP可以实现从命令行或URL接受参数并执行相关操作的功能
<p class="line">1</p> Copier après la connexion Copier après la connexion |
<p class="line">$action = '';</p><p class="line">if(isset($_GET['action']))</p><p class="line"> $action = $_GET['action'];</p><p class="line">if(isset($argv[1]))</p><p class="line"> $action = $argv[1];</p><p class="line">switch($action) {</p><p class="line"> case "snmp":</p><p class="line"> refresh_host_status_by_snmp();</p><p class="line"> break;</p><p class="line"> case get_option("refresh_frequency") . "min":</p><p class="line"> refresh_order_count();</p><p class="line"> refresh_service_status();</p><p class="line"> break;</p><p class="line"> case "1day":</p><p class="line"> refresh_uptime_yesterday_in_service_list();</p><p class="line"> save_all_tasks_one_day_details();</p><p class="line"> break;</p><p class="line"> default:</p><p class="line"> echo "help content here.\n";</p><p class="line"> break;</p><p class="line">}</p> Copier après la connexion |
将上述脚本保存为cli.php,则可以通过下面两种方法来运行:
- 1、http://chensd.com/cli.php?action=5min
- 2、/usr/bin/php cli.php 5min
php执行文件的位置可能会因编译或安装的情况而不一样。
在crontab中添加如下的一行可以每隔五分钟运行一次:
<p class="line">1</p> Copier après la connexion Copier après la connexion Copier après la connexion Copier après la connexion |
<p class="line">5,10,15,20,25,30,35,40,45,50,55,0 * * * * /usr/bin/php /home/xxx/cli.php 5min</p> Copier après la connexion |
或
<p class="line">1</p> Copier après la connexion Copier après la connexion Copier après la connexion Copier après la connexion |
<p class="line">*/5 * * * * /usr/bin/php /home/xxx/cli.php 5min</p> Copier après la connexion |
4、数据的可视化
无论是什么样的人,总是更容易接受图表一些——这个与智商关系不大。
现在的数据可视化技术实在是太丰富了,除了以前比较常见的flash和图片,现在的js可视化技术也进入了实用化阶段,而且将图表的生成工作量转给了客户端浏览器,也没有了插件的依赖,要命的是iOS也没问题……
Highcharts和flot都很不错,前者相对更成熟,后者是开源项目,Highcharts母公司新推出了Highstocks也很不错,但是现在还在测试阶段,净highstocks.js都有300多KB。
性能上讲,据称,flot表现1000个点时仍然轻松自如。从我实现的情况来看,highstocks一个图中同时显示3000余个点依然很流畅,单图15000个数据仍然可以灵活拉动highstocks的时间轴。
最近由于工作上的原因,需要开发一套服务器性能的监控工具,主要是一些同架构同软件配置的服务器。考虑到最近用php比较多,随即决定使用php来实现。主要需要实现的部分功能如下:
- 1、系统状态,如cpu / 内存 / swap等数据;
- 2、MySQL的性能与运行状态;
其它主要是配合性的数据存储以及可视化。原文地址:利用PHP实现对服务器性能与状态的监控, 感谢原作者分享。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Liaison statique (statique: :) implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Les dix tops sont des échanges de monnaies virtuelles libres: 1. Ces plateformes ont chacune leurs propres avantages.

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

PHP et Python ont chacun leurs propres avantages et choisissent en fonction des exigences du projet. 1.Php convient au développement Web, en particulier pour le développement rapide et la maintenance des sites Web. 2. Python convient à la science des données, à l'apprentissage automatique et à l'intelligence artificielle, avec syntaxe concise et adaptée aux débutants.

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7
