Zabbix-PHP-Module icon indicating copy to clipboard operation
Zabbix-PHP-Module copied to clipboard

Zabbix Loadable Module for make monitoring with PHP scripting language

Build Status License: GPL v3

Zabbix PHP Loadable Module :

This directory contains Zabbix Loadable module, which extends functionality of Zabbix Agent/Server/Proxy.

This module add the ability to load PHP interpreter inside Zabbix Server/Proxy/Agent address space.

Is based on my precedente work https://www.zabbix.com/forum/showthread.php?t=8305 to add the possibility to call script inside the zabbix engine. At this time I talked with Alexei Vladishev to add the ability to load module ... Now it's done!

With that module you can extend functionality of the Zabbix with PHP module at the infinite.

Prerequisite :

The PHP Embed SAPI - libphp[57].so (tested with v5.6 and v7.4) :

Install it on Ubuntu Trusty :

# apt-get install libphp5-embed php5-dev autoconf automake gcc make libpcre3-dev libbz2-dev libbz2-dev libxml2-dev libkrb5-dev libdb5.3-dev

Install it on Ubuntu Focal :

# apt-get install libphp-embed php-dev autoconf automake gcc make libpcre3-dev libbz2-dev libbz2-dev libxml2-dev libkrb5-dev libargon2-dev libargon2-1 libargon2-0 libsodium-dev

Install it on Centos 7 :

# yum install php-embedded php-cli php-devel 

Or compile it (the important option are "--enable-embed") from php source :

# wget https://github.com/php/php-src/archive/PHP-x.x.tar.gz
# tar xzvf php-x.x.tar.gz
# cd php*/
# ./buildconf
# ./configure --enable-embed --prefix=/path/to/php/install/dir \
		      --with-snmp=shared --with-ldap=shared --enable-shared=yes  \
		      --with-curl=shared  --with-mysqli=shared 
# make
# make install

For example to have libphp[57].so embeded library with snmp, ldap, curl and mysqli shared module.

How to Build the module

Compile the zbx_php module with php :

For have get zabbix include necessary to build the module you must download zabbix source :

# wget --content-disposition "https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.8.tar.gz"
# tar xzvf zabbix*.tar.gz
# cd zabbix*
# ./configure
# cd -

Them compile the module.

# ./bootstrap.sh
# ./configure --with-php=/path/to/php/script/php-config 
              --with-zabbix-include=./zabbix/include 
              --prefix=/path/to/zabbix/install/modules/dir
# make
# make install
```	      
It should produce **zbx_php.so** in **/path/to/zabbix/install/modules/dir**.

# Configure zbx_php with zabbix

Zabbix agent, server and proxy support two parameters to deal with modules:

- **LoadModulePath** – full path to the location of loadable modules, where to copy **zbx_php.so**
- **LoadModule** – module(s) to load at startup. The modules must be located in a directory specified by **LoadModulePath**. It is allowed to include multiple **LoadModule** parameters.

For example, to extend Zabbix agent we could add the following parameters:

LoadModulePath=/path/to/zabbix/install/modules/dir
LoadModule=zbx_php.so

Upon agent startup it will load the **zbx_php.so** modules from the **/path/to/zabbix/install/modules/dir** directory. It will fail if a module is missing, in case of bad permissions or if a shared library is not a Zabbix module.

# Zabbix Frontend configuration

Loadable modules are supported by Zabbix **agent**, **server** and **proxy**. Therefore, item type in Zabbix frontend depends on where the module is loaded. If the module is loaded into the **agent**, then the item type should be **“Zabbix agent”** or **“Zabbix agent (active)”**. If the module is loaded into **server** or **proxy**, then the item type should be **“Simple check”**.

- **zbx_php.ping** - always returns '1'
- **zbx_php.version** - returns the php version
- **php[phpscript.php, param1, param2, ...]** - execute phpscript with params

# Configure module

The module as config file in the same place of the Zabbix Agentd/Server/proxy are, named **zbx_php.conf**.

for the moment containt only one parameter **PHP_SCRIPT_PATH**, that specify where php script are searched to execute:

PHP_SCRIPT_PATH=/usr/local/lib/zabbix/phpscripts

# How to test module

To get php version with what the module are compiled :

zabbix_get -s 127.0.0.1 -k zbx_php.version

5.6.23


To ping the module:

zabbix_get -s 127.0.0.1 -k zbx_php.ping

1


# How to code script

Generale example are :
**Warning note : http://php.net/manual/en/function.sleep.php#33732** > > The **set_time_limit()** function and the configuration directive **max_execution_time** only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running. You must pay attention on this when you code your scripts because Zabbix not abort your script on timeout and they can block zabbix unlimitedly if you call PHP extension that block... The module set tree variable to the script: - **zabbix_timeout** - setted to **"Timeout"** zabbix configuration parametter, by default to 3 in zabbix configuration. - **zabbix_key** - while be **"php[param1,param2,...]"** - **zabbix_params** - array starting with php at indice 0 and followed by argument sended to the module (that are in [...]) By **default** the php ini parametter are to : - **html_errors** = 0 - **register_argc_argv** = 1 - **implicit_flush** = 1 - **output_buffering** = 0 - **max_input_time** = -1 To execute the script **"test.php"** in **"PHP_SCRIPT_PATH"** directory with arguments "mon test a moi" by the module: ``` # zabbix_get -s 127.0.0.1 -k php[test.php,mon test a moi] .... ``` # Samples With this items `php[snmpget.php,,,]` they do snmp get of the `oid` on ``, with ``. **snmpget.php** : ```php