PHP字符串占用内存测试


背景

有人说“经验数据,60MB字符串会占用360MB内存”。感觉不靠谱,所以做了个测试。

测试环境

操作系统: win7 64位

PHP版本: 5.4.12

Apache版本:2.4.4

测试方式

分CLI,CGI两种方式测试

测试代码

 

<?php
ini_set('memory_limit','2G');
echo 'mem:', convert(memory_get_usage()), ' real:', convert(memory_get_usage(true)), PHP_EOL;

$str = str_repeat('a', 1);
echo 'string length:', convert(strlen($str)), PHP_EOL;
echo 'mem:', convert(memory_get_usage()), ' real:', convert(memory_get_usage(true)), PHP_EOL;
echo 'peak mem:', convert(memory_get_peak_usage()), ' real:', convert(memory_get_peak_usage(true)), PHP_EOL;
sleep(10);
echo 'done';
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

 

测试过程及结果

CLI方式

命令行下执行 php script.php

得到如下结果

mem:234.55 kb real:256 kb

string length:60 mb

mem:60.23 mb real:60.5 mb

peak mem:60.23 mb real:60.5 mb

done[Finished in 10.1s]

相关截图

2

(图1简单的PHP程序所占用的内存)

3

(图2申请60MB字符串的PHP内存占用)

说明60MB的字符串实际占用内存也就62MB。

CGI方式

开启web服务,打开http://localhost/script.php

得到如下结果

mem:252.91 kb real:512 kb

string length:60 mb

mem:60.25 mb real:60.75 mb

peak mem:60.25 mb real:60.75 mb

done

相关截图

4

(图3正常服务时httpd占用的内存)

5

(图4申请60MB字符串后,httpd占用的内存)

说明60MB字符串实际占用内存也为61MB左右(大概比字符串内存+正常服务内存之和多了1MB)

6

(图5申请1GB字符串的时候,httpd的内存使用情况。 大概比字符串内存+正常服务内存之和多了25MB)

总结

PHP在管理超长的字符串上不会浪费多余的内存。可以放心使用。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注