背景
有人说“经验数据,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]
相关截图
(图1简单的PHP程序所占用的内存)
(图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
相关截图
(图3正常服务时httpd占用的内存)
(图4申请60MB字符串后,httpd占用的内存)
说明60MB字符串实际占用内存也为61MB左右(大概比字符串内存+正常服务内存之和多了1MB)
(图5申请1GB字符串的时候,httpd的内存使用情况。 大概比字符串内存+正常服务内存之和多了25MB)
总结
PHP在管理超长的字符串上不会浪费多余的内存。可以放心使用。