首页 > 解决方案 > PHP 使用的内存比所需的文件多

问题描述

以给定的示例代码为例:

<?php

if (! function_exists('human_filesize')) {
    function human_filesize($size, $precision = 2, $step = 1000)
    {
        $i = 0;
        $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

        while (($size / $step) > 0.9) {
            $size = $size / $step;

            $i++;
        }

        return round($size, $precision) . ' ' . $units[$i];
    }
}

if (! function_exists('dd')) {
    function dd($vars)
    {
        foreach (func_get_args() as $var) {
            var_dump($var);
        }

        die();
    }
}

$start = microtime(true);
$usage = memory_get_usage(true);

require "brown_corpus.php"; // It's 1.6 MB

$dump[] = round(microtime(true) - $start, 3);
$dump[] = human_filesize(memory_get_usage(true) - $usage);

dd(...$dump); // 0.063ms to run | 38.01 MB memory used

brown_corpus.php是 1.6 MB,但是当需要时,脚本告诉我它正在使用 38.01 MB 的内存。我一直在阅读,我想知道这是否是因为 PHP 将所需的文件编译成操作码,以便更快地执行?有人可以开导这方面的利弊吗...即,如果我继续在该要求的数组中搜索键,现在是否更快-因为 PHP 编译文件的方式?

标签: phpmemorymemory-management

解决方案


文件的大小与它消耗的内存量无关。没有看到 brown_corpus.php,就不可能知道它是如何消耗内存的,但请记住,代码(通常)是描述它实际创建的结构的一种浓缩方式。考虑以下:

$arr = array();
for ($i = 0; $i < 100000; $i++) {
    $arr[$i] = $i;
}

将其保存到一个 php 文件中,它占用大约 70 个字节。运行它,它将创建一个包含 100,000 个元素的数组结构,每个元素都是一个 8 字节的整数。繁荣,使用了 800 KB。

实际上,它比这更糟糕,因为 PHP 是如何在您的系统上配置的,更不用说 PHP 强加的各种开销(例如,它存储数组的方式令人难以置信——请参阅https://nikic .github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html)。


推荐阅读