我正在 PHP 5.2.10 上编写一个简单的网站解析器。
当使用默认的内部编码(即 ISO-8859-1)时,我总是在同一个函数调用中得到一个错误:
$start = mb_strpos($index, '<a name=gr1>');
致命错误:允许的内存大小为 50331648 字节已用尽(尝试分配 11924760 字节)
在这种情况下,字符串 $index 的长度是 2981190 字节——正好是 PHP 尝试分配的 4 倍。
现在,如果我使用
mb_internal_encoding('UTF-8')
错误消失。这是否意味着 PHP 为单字节字符串使用更多内存而不是多字节字符串?这怎么可能?有任何想法吗?
UPD:内存使用似乎不依赖于编码:平均 memory_get_usage() 使用 UTF-8 和 ISO-8859-1 几乎相同。我认为问题可能出在 mb_strpos 中。事实上,字符串 $index 具有 Windows-1251 编码(西里尔文),因此它包含对 UTF-8 无效的符号。这可能会导致 mb_strpos 以某种方式尝试转换或仅将额外的内存用于某些需要。将尝试在 mb_strpos 的来源中找到答案。