php - 字符串数组中奇怪的 PHP 内存使用

标签 php

使用包 ramsey/uuid我尝试生成大量 uuids v4。

<?php

require __DIR__ . '/vendor/autoload.php';
use Ramsey\Uuid\Uuid;

$initialMemoryUsage = memory_get_usage(true) / 1024 / 1024;
$test = [];

for ($i = 0; $i < 100000; $i++) {
    $test[] = Uuid::uuid4()->toString();
}

var_dump(sprintf('Memory used: %d MB', (memory_get_usage(true) / 1024 / 1024) - $initialMemoryUsage));

输出:string(18) "已用内存:10 MB"

<?php

$initialMemoryUsage = memory_get_usage(true) / 1024 / 1024;
$test = [];

for ($i = 0; $i < 100000; $i++) {
    $test[] = '97c2ca84-bcfe-4618-b8a3-4d404eead37a';
}

var_dump(sprintf('Memory used: %d MB', (memory_get_usage(true) / 1024 / 1024) - $initialMemoryUsage));

输出 string(17) "已用内存:4 MB"

仅仅调用uuid生成不会导致任何内存增加

for ($i = 0; $i < 100000; $i++) {
    Uuid::uuid4()->toString();
}

为什么在这两种情况下结果都是包含 100000 个元素的 string(36) 数组,但使用的内存量不同?有什么想法吗?

php -v

PHP 7.3.2-3+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Feb  8 2019 15:43:26) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.2, Copyright (c) 1998-2018 Zend Technologies

最佳答案

PHP 中的字符串是不可变的,这意味着它们无法更改。这也意味着它们可以很容易地共享。在第一种情况下,您有一个包含 100k 元素的数组,每个元素引用不同的字符串。在第二种情况下,您有一个包含 100k 元素的数组,每个元素都引用相同的字符串。

如需进一步引用,请查看 www.phpinternalsbook.com .

关于php - 字符串数组中奇怪的 PHP 内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64446071/

相关文章:

php - 如何使用php下载pdf文件

php - WordPress 安装 404 错误(无法在浏览器中查看登录信息)

php - 使用curl 和访问 token 发布JSON。出现 : Illegally formatted input field! 错误。广告API

php - 使用 Laravel 和 MSSQL 将 nvarchar 转换为 datetime 数据类型时出错

php - 如何防止用户访问其他用户的记录?

PHP MYSQL 查询中的 Javascript

php - 如何在 PHP 中对请求数据进行数字签名

php - 当其他无缓冲查询处于事件状态时无法执行查询

PHP 将所有图像文件夹从一个文件夹复制到另一个文件夹

php - 在 php 交互式 shell 中使用 composer 添加的依赖项