zabbixでPHPの警告が出る場合の対処

投稿日:2017-02-14

■環境
zabbix 3.2
PHP 7.1

PHP7.1でzabbixを動かすと、以下の警告が出ました。

A non well formed numeric value encountered [zabbix.php:21 → require_once() → ZBase->run() → ZBase->processRequest() → CView->getOutput() → include() → make_status_of_zbx() → CFrontendSetup->checkRequirements() → CFrontendSetup->checkPhpMemoryLimit() → str2mem() in include/func.inc.php:410]  
A non well formed numeric value encountered [zabbix.php:21 → require_once() → ZBase->run() → ZBase->processRequest() → CView->getOutput() → include() → make_status_of_zbx() → CFrontendSetup->checkRequirements() → CFrontendSetup->checkPhpPostMaxSize() → str2mem() in include/func.inc.php:410]  
A non well formed numeric value encountered [zabbix.php:21 → require_once() → ZBase->run() → ZBase->processRequest() → CView->getOutput() → include() → make_status_of_zbx() → CFrontendSetup->checkRequirements() → CFrontendSetup->checkPhpUploadMaxFilesize() → str2mem() in include/func.inc.php:410]

警告が出ている箇所は以下のようになっています。
[/usr/share/zabbix/include/func.inc.php]

 394 /**  
 395  * Converts strings like 2M or 5k to bytes  
 396  *  
 397  * @param string $val  
 398  *  
 399  * @return int  
 400  */  
 401 function str2mem($val) {  
 402         $val = trim($val);  
 403         $last = strtolower(substr($val, -1));  
 404  
 405         switch ($last) {  
 406                 case 'g':  
 407                         $val *= 1024;  
 408                         /* falls through */  
 409                 case 'm':  
 410                         $val *= 1024;  
 411                         /* falls through */  
 412                 case 'k':  
 413                         $val *= 1024;  
 414         }  
 415  
 416         return $val;  
 417 }

この引数の「$val」には『256M』のように単位付きの数字が入ってくるようで、
それを『$val *= 1024』と数字のように扱っているので警告が出ているようです。
(警告は出ているが、処理自体は正常に行なわれている)

解決策は色々あると思いますが、とりあえず以下のように修正したら
警告は表示されなくなりました。(404行目を追加しています)

 401 function str2mem($val) {  
 402         $val = trim($val);  
 403         $last = strtolower(substr($val, -1));  
 404         $val = intval($val);  
 405         switch ($last) {  
 406                 case 'g':  
 407                         $val *= 1024;  
 408                         /* falls through */  
 409                 case 'm':  
 410                         $val *= 1024;  
 411                         /* falls through */  
 412                 case 'k':  
 413                         $val *= 1024;  
 414         }  
 415  
 416         return $val;  
 417 }

関連する記事