mrsuh/php-var-sizeof

Provides functions for getting full size of any PHP variable

1.3.0 2024-06-13 20:14 UTC

This package is auto-updated.

Last update: 2024-10-13 20:57:42 UTC


README

Tests

Function for getting size of any PHP variable in bytes.
It must be more accurate tool to calculate total size of PHP variable than memory_get_usage(), but it has restrictions.

How it works

var_sizeof() with var_class_sizeof() uses FFI to access internal structures of PHP variables.
It calculates the size of internal structures such as zval, _zend_array, _zend_object, etc., as well as additional allocated memory for them.
It doesn't take into calculate the memory of handlers/functions/etc.

Requirements

  • PHP >= 7.4 (with FFI)
  • Linux(x86_64/aarch64) / Darwin(x86_64/arm64)

How to install

composer require mrsuh/php-var-sizeof

Functions

int var_sizeof(mixed $var);
int var_class_sizeof(mixed $var);

Usage

<?php

require_once __DIR__ . '/vendor/autoload.php';

$int = 1;
printf("variable \$int size: %d bytes\n", var_sizeof($int));

$array = array_fill(0, 100, $a);
printf("variable \$array size: %d bytes\n", var_sizeof($array));

$object = new \stdClass();
printf("variable \$object size: %d bytes\n", var_sizeof($object));
printf("class \$object size: %d bytes\n", var_class_sizeof($object));

var_sizeof vs memory_get_usage

PHP 8.1.2 Linux(x86_64)

⚠️ Restrictions

  • works correctly only with userland objects and SPL \ArrayIterator
  • doesn't work correctly with complicated structures like extensions/resources/callables/functions
  • to calculate total size of an object you need to use var_sizeof() with var_class_sizeof()

For contributors

How to reproduce a table of numbers above

git clone --recurse-submodules git@github.com:mrsuh/php-var-sizeof.git && cd php-var-sizeof
composer install
docker build -t image-php-var-sizeof .
docker run -it --rm --name my-running-script -v "$PWD":/app image-php-var-sizeof php bin/render-table.php

How to compile library

git submodule update --init --recursive
cd php-src
./buildconf
./configure --with-ffi --with-iconv=/opt/homebrew/opt/libiconv
cd ..
make DEBUG=1
docker build -t php-var-sizeof -f Dockerfile-compile .
docker run -it -v $(pwd)/library:/code/library php-var-sizeof bash
cd /code
make DEBUG=1