mrsuh/php-var-sizeof

提供获取任何 PHP 变量完整大小的函数

1.3.0 2024-06-13 20:14 UTC

This package is auto-updated.

Last update: 2024-09-13 20:52:10 UTC


README

Tests

获取任何 PHP 变量大小的函数(以字节为单位)。
它比 memory_get_usage() 更精确地计算 PHP 变量的总大小,但它有 限制

工作原理

var_sizeof()var_class_sizeof() 使用 FFI 访问 PHP 变量的内部结构。
它计算内部结构的大小,如 zval_zend_array_zend_object 等,以及为它们分配的额外内存。
它不包括处理器/函数等内存。

要求

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

如何安装

composer require mrsuh/php-var-sizeof

函数

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

使用方法

<?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 与 memory_get_usage 的比较

PHP 8.1.2 Linux(x86_64)

⚠️ 限制

  • 仅与用户空间对象和 SPL \ArrayIterator 正确工作
  • 不适用于复杂结构,如扩展/资源/可调用/函数
  • 要计算对象的总大小,需要使用 var_sizeof()var_class_sizeof()

对于贡献者

如何重现上面的数字表

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

如何编译库

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