PHPでサーバCPUを判定する

(1/1)
Core i7 965
PHPは、CGIのようにOSネイティブなプログラムを動作させる仕組みを備えている。
そこで今回は、Windowsのコマンドを使って、PHPが動作しているサーバのCPUの種類を表示させるプログラムを作ってみることにする。
(2024年11月23日)isCPU2.php プログラムを追加した

目次

サンプル・プログラム

圧縮ファイルの内容
isCPU.phpサンプル・プログラム (1)
isCPU.phpサンプル・プログラム (2)
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
processorList.xmlCPU一覧ファイル
isCPU.php 更新履歴
バージョン 更新日 内容
1.2 2021/03/06 PHP8対応,UTF-8化
1.1 2008/08/26 ヒアドキュメントに変更
1.0 2005/03/16
isCPU2.php 更新履歴
バージョン 更新日 内容
2.0.0 2024/11/23 大幅改訂
1.2 2021/03/06 PHP8対応,UTF-8化
1.1 2008/08/26 ヒアドキュメントに変更
1.0 2005/03/16 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.8.0 2024/11/12 validRegexPattern() 追加
1.7.0 2024/10/09 validURL() validEmail() 追加
1.6.0 2024/10/07 isButton() -- buttonタグに対応
1.5.0 2024/01/28 exitIfExceedVersion() 追加
1.4.2 2024/01/28 exitIfLessVersion() メッセージ修正

解説:バッククォート

PHPでOSネイティブなプログラムを走らせるのは簡単で、バッククォートでコマンドを囲むだけである。
バッククォートは演算子として作用し、戻り値は標準出力に返されるデータである。

ここでは Windows の set コマンドを使っており、環境変数の値がすべて変数 $output に格納する。そこから、 preg_match  関数を使い、Windows XPで標準設定される PROCESSOR_IDENTIFIER の値を取り出す。これが CPU の判定結果となる。

isCPU.php

  55: $output = `set`;        //DOSコマンドを実行する
  56: 
  57: $flag = preg_match('/PROCESSOR_IDENTIFIER=(.*)\n/ui', $output, $arr);
  58: 
  59: $body = ($flag == TRUE? ('CPUは ' . $arr[1]) : '判断できませんでした';

解説:類似の関数

バッククォート演算子と等価な関数は  shell_exec  である。
また、類似する関数として、  exec  と  system  がある。

解説:セキュリティとセーフモード

OSネイティブなコマンドを実行できるということは、使い方によってはサーバにダメージを与えかねない。たとえば del コマンドを実行するようにすれば、サーバに必要なファイルまで削除できてしまう。
そこで、PHPには「セーフモード」という概念があり、OSを守ることができるようになっている。(セーフモードはPHP 5.3.0で非推奨となり、PHP 5.4.0 で削除になった。)

セーフモードが ON の場合、バッククォート演算子などは働かない。したがって、厳密を期すなら、プログラムの冒頭で、PHPがセーフモードになっているかどうかを調べるロジックを追加すべきである。

解説:サンプル・プログラム(2)

サンプル・プログラム(2) "isCPU2.php" は、PROCESSOR_IDENTIFIER の値から、予め用意したCPU一覧ファイル FILENAME_CPU を参照し、CPU名(開発コード名)を表示する。プログラムにXMLや正規表現処理をともない、中級者向けの内容となっている。
まず、定数 FILENAME_CPU にCPU一覧ファイルを設定する。

isCPU2.php

  53: // 初期値(START) =============================================================
  54: // CPU一覧ファイル
  55: define('FILENAME_CPU', './processorList.xml');
  56: 
  57: // 初期値(END) ===============================================================

ユーザー定義関数 getCPUname では、コマンドを実行し得られた PROCESSOR_IDENTIFIER を正規表現で分解し、ベンダ名、ファミリー名、モデル名、ステッピングに分解する。

isCPU2.php

 110: /**
 111:  * CPU名(開発コード名)を取得する
 112:  * @return  string CPU名/FALSE:取得失敗
 113: */
 114: function getCPUname() {
 115:     $maker = '';
 116:     $family = $model = $stepping = 0;
 117: 
 118:     // setコマンドを実行する
 119:     $output = `set`;
 120: 
 121:     // 環境変数PROCESSOR_IDENTIFIERの内容を取得する
 122:     if (preg_match('/PROCESSOR_IDENTIFIER=(.*)\n/ui', $output, $arr<0)   return FALSE;
 123:     $ids = $arr[1];
 124: 
 125:     // CPUベンダ
 126:     $vendor = preg_match('/Intel/ui', $ids? 'Intel' : 'AMD';
 127: 
 128:     if (preg_match('/Family\s*([0-9A-F]+)\s*Model\s*([0-9A-F]+)\s*(Stepping\s*([0-9A-F]+))*/ui', $ids, $arr<0)       return FALSE;
 129:     if (isset($arr[1]))     $family = sprintf('%02X', (int)$arr[1]);
 130:     if (isset($arr[2]))     $model  = sprintf('%02X', (int)$arr[2]);
 131:     if (isset($arr[3]))     $stepping = (int)$arr[4];
 132:     $result =searchCPUname($vendor, $family, $model);
 133:     $name = ($result == NULL? 'unknown' : $result;
 134:     $name .sprintf(' (%s, Family %s, Model %s, Stepping %02X)', $vendor, $family, $model, $stepping);
 135: 
 136:     return $name;
 137: }

ベンダ名、ファミリー名、モデル名をユーザー関数 searchCPUname に渡し、CPU一覧ファイル FILENAME_CPU の内容とマッチングさせて、CPU名(開発コード名)である architecture ノードの値を返す。

isCPU2.php

  92: /**
  93:  * 一覧表からCPU名(開発コード名)を検索して返す.
  94:  * @param   string $vendor ベンダ名 Intel|AMD
  95:  * @param   string $family ファミリー番号
  96:  * @param   string $model  モデル番号
  97:  * @return  string CPU名/NULL:見つからない
  98: */
  99: function searchCPUname($vendor, $family, $model) {
 100:     $xml = simplexml_load_file(FILENAME_CPU);
 101:     if ($xml == FALSE)      return FALSE;
 102:     foreach ($xml as $processor) {
 103:         if (($processor->vendor == $vendor&& ($processor->family == $family&& ($processor->model == $model)) {
 104:             return (string)$processor->architecture;
 105:         }
 106:     }
 107:     return NULL;
 108: }

関連サイト

CPUの歴史

発表年 メーカー CPU名 ビット数 最大クロック
1971年インテル40044bit750KHz
1974年インテル80808bit3.125MHz
1975年モステクノロジーMOS 65028bit3MHz
1976年ザイログZ808bit20MHz
1978年インテル808616bit10MHz
1979年モトローラMC68098bit2MHz
1979年ザイログZ800016bit10MHz
1980年モトローラMC6800016bit20MHz
1984年インテル8028616bit12MHz
1985年インテル8038632bit40MHz
1985年サン・マイクロシステムズSPARC32bit150MHz
1986年MIPSR200032bit15MHz
1987年ザイログZ28016bit12MHz
1987年モトローラMC6803032bit50MHz
1989年インテル8048632bit100MHz
1991年MIPSR400064bit200MHz
1990年モトローラMC6804032bit40MHz
1993年インテルPentium32bit300MHz
1994年IBM, モトローラPowerPC 60332bit300MHz
1995年サイリックスCyrix Cx5x8632bit133MHz
1995年AMDAm5x8632bit160MHz
1995年サン・マイクロシステムズUltraSPARC64bit200MHz
1999年IBM, モトローラPowerPC G432bit1.67GHz
1999年AMDAthlon32bit2.33GHz
2000年インテルPentium 432bit3.8GHz
2001年インテルItanium64bit800MHz
2003年AMDOpteron64bit3.5GHz
2003年インテルPentium M32bit2.26GHz
2006年SCE,ソニー,IBM,東芝Cell64bit3.2GHz
2006年インテルCore Duo32bit2.33GHz
2006年インテルCore 2 Duo64bit3.33GHz
2008年インテルCore i9/i7/i5/i364bit5.8GHz
2017年AMDRyzen64bit5.7GHz
2020年AppleM1/M2/M3/M464bit3.49GHz
2023年インテルCore Ultra 9 / 7 / 564bit5.1GHz
(この項おわり)
header