[PHP-users 20055]Re: PHPからCPULoadAverageの値を得る方法
NAKAMURA Takeshi
1yen @ sh.rim.or.jp
2004年 1月 26日 (月) 19:38:39 JST
仲村です
On Mon, 26 Jan 2004 01:15:23 +0900,
yahiroml @ fbbs.ftokai-u.ac.jp (八尋剛規(ML専用)) wrote:
> PHPからWebサーバの負荷の状態(load average)を得るには、どうされていますか?
> Linuxだと、/proc/loadavg を読めばいいのでしょうが、FreeBSDの場合はどうすれば
> いいのか?です。
>
> load averageを出力する外部コマンドを system関数で呼び出して、その出力を
> 処理して値を得る方法はわかるのですが、もっとエレガントな方法をご存知でした
> ら、教えてください。
案1. /compat/linux/proc/uptime を読む (linux エミュレーション)
案2. rwhod, rpc.rstatd を起動して置いて /var/rwho/whod.<ホスト名> から読む
(ファイルがバイナリの上、最大3分ほど古い可能性がある)
案3. rpc.rstatd を起動して socket でお話しする (参考:rup)
案4. /etc/inetd.conf へ
uptime stream tcp nowait nobody /usr/libexec/tcpd uptime
/etc/services へ
uptime 33637/tcp #uptime
を追加し、socket で読む。(telnet ::1 uptime)
案5. cron で 'uptime > file' して、PHP からは file を読む
案6. 自分で php 関数を書く。例えばこんな風に
==============================
diff -Nur php4-STABLE-200401260630/ext/standard/basic_functions.c PHP-patched/ext/standard/basic_functions.c
--- php4-STABLE-200401260630/ext/standard/basic_functions.c Tue Jan 20 04:10:54 2004
+++ PHP-patched/ext/standard/basic_functions.c Mon Jan 26 19:26:29 2004
@@ -421,6 +421,7 @@
PHP_FE(mt_rand, NULL)
PHP_FE(mt_srand, NULL)
PHP_FE(mt_getrandmax, NULL)
+ PHP_FE(getloadavg, NULL)
#if HAVE_GETSERVBYNAME
PHP_FE(getservbyname, NULL)
diff -Nur php4-STABLE-200401260630/ext/standard/php_math.h PHP-patched/ext/standard/php_math.h
--- php4-STABLE-200401260630/ext/standard/php_math.h Wed Jan 1 02:15:21 2003
+++ PHP-patched/ext/standard/php_math.h Mon Jan 26 19:16:15 2004
@@ -61,6 +61,7 @@
PHP_FUNCTION(fmod);
PHP_FUNCTION(deg2rad);
PHP_FUNCTION(rad2deg);
+PHP_FUNCTION(getloadavg);
/*
WARNING: these functions are expermental: they could change their names or
diff -Nur php4-STABLE-200401260630/ext/standard/rand.c PHP-patched/ext/standard/rand.c
--- php4-STABLE-200401260630/ext/standard/rand.c Mon Jan 19 13:07:15 2004
+++ PHP-patched/ext/standard/rand.c Mon Jan 26 19:16:32 2004
@@ -39,6 +39,7 @@
#include "php_math.h"
#include "php_rand.h"
#include "php_lcg.h"
+#include "php_var.h"
#include "basic_functions.h"
@@ -412,3 +413,25 @@
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
*/
+
+/* {{{ proto array getloadavg(void)
+ Returns the number of processes in the system run queue
+ averaged over various periods of time. */
+PHP_FUNCTION(getloadavg)
+{
+ double loadavg[3];
+ char load[11];
+ int i;
+
+ if (getloadavg(loadavg, 3) == -1){
+ RETURN_FALSE;
+ } else {
+ array_init(return_value);
+ for (i = 0; i < 3 ; i++) {
+ snprintf(&load[0], 10,"%f", loadavg[i]);
+ add_next_index_stringl(return_value, load, strlen(load), 1);
+ }
+ }
+ return;
+}
+/* }}} */
==============================
関数を追加した箇所が rand なのはご愛敬。
使い方は array (1min,5min,15min) = getloadavg(); です。
多分こんなので動くと思います...
<?php
$a = getloadavg();
echo " 1min: " , $a[0] , "\n" ,
" 5min: " , $a[1] , "\n" ,
"15min: " , $a[2] , "\n" ;
?>
この関数がどういう場合(Windows上でとか)でも動くかどうかは分かりません。
以上、exec を使わずに済む 思いついた方法でした。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+
関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
仲村 武 <1yen @ sh.rim.or.jp>
PHP-users メーリングリストの案内