How to monitor hardware variables in PHP

In my previous job, we released the MoonGuard Filament Plugin, a PHP package for monitoring Laravel applications in the cloud. We had been searching for new features to enhance the experience of supporting and monitoring these applications. One of the challenges we encountered was the ability to monitor server hardware variables, such as CPU and RAM usage, as well as disk storage space. These variables provide crucial information about our servers, allowing us to optimize our applications and prevent critical failures. Therefore, we conducted research on how to monitor these variables using PHP.

Cpu Load

In PHP, there is a function called sys_getloadavg() which is used to obtain the average system load. It returns three samples that represent the average system load over the last 1, 5, and 15 minutes, respectively. This function is useful for monitoring system performance. It is important to note that this function only works on Unix systems such as Linux and MacOS. Therefore, it is not available on Windows platforms. You can refer to the official PHP documentation for more information on how to use this function.

With this function, we can create a method that retrieves the three data values in percentage and stores them in an array to use them.

<?php

public function getCpuLoadUsage(): float
{
  try {
    $result = false;

    if (function_exists('sys_getloadavg')) {
      $result = sys_getloadavg();
    }

    $result = array_map(fn ($n) => round($n * 100), $result);

    return $result;
  } catch(Throwable $e) {
      //handle exception
  }
}

Memory

To obtain the percentage of used memory, we found a method in the stethoscope package that makes use of Unix system commands, such as the free command, which displays the amount of free and used memory in the system.

To use this command in PHP, we can use the shell_exec function, which allows us to execute commands in the terminal and save their output in a PHP variable. This way, we can create a method that executes the 'free' command and use the grep Mem command to filter the output and display only the line that contains the word 'Mem', which has the amount of RAM memory in the system.

To obtain the percentage, we will use awk’{print$3/$2 * 100}’, this will give us the field that contains the amount of used RAM, we divide it by the total amount of RAM and by multiplying by 100 we will get the percentage value.

<?php

public function getMemoryUsage(): float
{
  try {
    if (function_exists('exec')) {
      $memory = shell_exec(" free | grep Mem | awk '{print $3/$2 * 100}' ");
      $result = round((float) $memory);
    }

    return $result;
  } catch(Throwable $e) {
    //handle exception
  }
}

Space Disk

To obtain the disk space, we can use the PHP functions disk_free_space and disk_total_space, which allow us to get the available and total space of the directory passed to your Linux server as a parameter. This way, we can create a method that indicates both the total space of the disk and the available space in the following way.

<?php

public function getDiskUsage(): array
{
  try {
    $freeSpace = false;
    $totalSpace = false;

    if (function_exists('disk_free_space') && function_exists('disk_total_space')) {
      $freeSpace = round((disk_free_space('/') / pow(1024, 3)), 1);
      $totalSpace = round((disk_total_space('/') / pow(1024, 3)), 1);
    }

    $result = [
      'freeSpace' => $freeSpace,
      'totalSpace' => $totalSpace,
    ];

    return $result;
  } catch (Throwable $e) {
    //handle exception
  }
}

We use the function pow(1024, 3) to obtain the value in gigabytes, which makes it more efficient.

Having these methods, you can use them in your Laravel or PHP project. I hope they are useful to you.