File System Layout

It is important that files are well placed and named within Cacti's directory structure. The naming structure may contain a category token and/or an action.


Under each category directory, functions should be broken out into multiple files where applicable. All files must begin with the name of category (ie. its parent directory name). Valid token names are


This part should reflect what type of actions the file contains. Specific examples are listed below.

Function Verbs

Functions in those PHP modules shall name their token and shall contain a verb to explain the purpose. Specific examples are listed below.

Directory Structure





Code that must be accessed globally but is not contained inside of a function should be stored in the include/ directory. The most common examples are to store globally accessible constants and arrays.

Directly under the include/ directory, the files beginning with global are used to store information that is accessible everywhere in the code. Only store information in these files that are meaningful to the entire program. Also under the include/ directory is a directory for each category (graph, device, etc), where information specific to that category is to be stored.

Constants that are made available everyone in the program


Arrays that are only used with graphs

  fa/                                   # FontAwesome files
  js/                                   # javascript files
  themes/[theme]/                       # Visual theme files
    csrf/                               # CSRF Magic
    flag-icon-css/                      # Flag Icons
    phpgettext/                         # PHP GetText Library
    phpmailer/                          # PHP Mailer Library
    phpseclib/                          # PHP Security Library
    phpsnmp/                            # PHP Snmp Library
  auth.php                              # Ensures user authenticate and
                                        # includes global.php
  cli_check.php                         # Default Command Line Include also
                                        # includes global.php
  global_constants.php                  # Constants only
  global_form.php                       # Form field definitions
  global_languages.php                  # Language selector
  global_session.php                    # Session variable management
  global_settings.php                   # Setting definitions
  session.php                           # Session management

  plugins.php                           # Global plugin variables

  bottom_footer.php                     # Standard Footer

  layout.js                             # Main layout javascript
  realtime.js                           # Realtime javascript functions


Functions that must be accessed globally should be stored in the ''lib/'' directory. This is where most of the heavy lifting in Cacti occurs.

Directly under the lib/ directory, the files beginning with the api prefix are core Cacti API's that are only to be used by third party developers and should NEVER include a call to a $_REQUEST, $_POST, or $_GET variable.

Files that have the html prefix, generally invole the rendering of page content, for example the html_form.php library draws forms and html_validate.php includes functions to validate page variables there are other various files in the current cacti lib/ directory that will over time be changing with the migration to the next major version of Cacti. So, these rules may change over time.

Here is the core API for the Cacti graphs.php page, and that deals with the manipulation of Graphs.



Language-related files are stored here to handle the multi-lingual natural of Cacti. These can be updated by running the script. It is advised to do this whenever you are submitting a change to the Cacti via Pull Request. Otherwise, language translations can be missed.


Directly under the plugins/ directory are sub directories that contain plugins for Cacti. Since Cacti 1.0.0, all plugins must have an accompanying INFO file that details the plugin.

Including and Requiring Files

To reduce bloat, each file and/or function should include any and all files which it relies on.

The following function directly relies the libraries related to sequences and reading graph information. The require_once directive is used instead of require to prevent PHP re-declaration errors.

function api_graph_item_save($graph_item_id, &$_fields_graph_item) {
    require_once(CACTI_BASE_PATH . '/lib/sys/sequence.php');
    require_once(CACTI_BASE_PATH . '/lib/graph/graph_info.php');

Copyright (c) 2004-2022 The Cacti Group