但是这里有一个很大的问题,php许可访问的内存大小是35389440字节,而实际要分配的只有1406507字节。为什么要分配的内存比实际许可访问的内存小还会引发致命缺点呢?
查了很多这方面的资料,创造很多这样搜索结果,都是实际要分配的内存要小于许可的内存,但是没有找到对此的解释。
首先想到是不是PHP本身这个内存限定功能有bug,于是做了如下实验:
1, 天生一个10MB大小的文件 dd if=/dev/zero of=10mb bs=1M count=10
2, 天生如下php文件并访问:
<?phpini_set(\"大众memory_limit\"大众,\"大众2M\公众);echo file_get_contents(\"大众./10mb\"大众);?>
创造其报错“Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 10493952 bytes)”,这个报错和我们设置的2M的内存限定,实际要分配10M的情形是一样的。这解释内存限定本身功能是没有问题的,报错的数据和实际的数据是能对上号的。
那么,上面的问题出在哪里呢?为什么实际要分配的内存比限定的内存要小,还会导致出错?又查了一下php关于memory_limit的解释1:
This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server. Note that to have no memory limit, set this directive to -1.
这里也没有对上述问题进行解释,只是见告我们memory_limit用来限定一个脚本等分配的内存大小用来保护做事器免受poorly written scripts的影响。也便是说memory_limit是限定单个PHP运行脚本的可访问内存大小的,那会不会存在一种可能,全体线程中的多个操作加起来的内存超过了总限定大小,但单个操作的内存又只占全体限定的很小一部分,而末了那根压去世骆驼的稻草是PHP报错出来的,以是显示出试图访问内存小于限定的内存大小?为了验证这个猜想,我把上述PHP文件改成这样并访问:
<?phpini_set(\公众memory_limit\公众,\公众15M\"大众);$a = file_get_contents(\"大众./10mb\公众);$b = file_get_contents(\公众./10mb\公众);?>
创造其报错“Fatal error: Allowed memory size of 15728640 bytes exhausted (tried to allocate 10493952 bytes)”,实际要分配10M内存,小于许可访问的15M,验证了前面的猜想。也便是说,程序在运行时如果超过设置的内存,PHP报错信息只会提示当前操作试图访问的内存大小。
那么直接增加内存限定的大小就可以办理这个问题了,限定的大小可以通过在php的shutdown函数上注册memory_get_usage函数来统计网站的内存花费,取一个得当的值即可。