我正在
PHP 5.2.10上编写一个简单的网站解析器.
使用默认内部编码(ISO-8859-1)时,我总是在同一个函数调用中得到一个错误:
$start = mb_strpos($index, '');
Fatal error: Allowed memory size of 50331648 bytes exhausted (tried to allocate 11924760 bytes)
在这种情况下,字符串$index的长度为2981190字节 – 恰好是PHP尝试分配的4倍.
现在,如果我使用
mb_internal_encoding('UTF-8')
错误消失了.这是否意味着PHP为多字节字符串使用更多内存用于单字节字符串?怎么可能?有任何想法吗?
UPD:内存使用似乎不依赖于编码:使用UTF-8和ISO-8859-1,平均memory_get_usage()几乎相同.我认为问题可能在于mb_strpos.
实际上,字符串$index具有Windows-1251编码(西里尔文),因此它包含对UTF-8无效的符号.这可能导致mb_strpos以某种方式尝试转换或仅使用额外的内存来满足某些需求.
将尝试在mb_strpos的源代码中找到答案.