PHP 5.2.10 で簡単な Web サイト パーサーを作成しています。
デフォルトの内部エンコーディング (ISO-8859-1) を使用すると、常に同じ関数呼び出しでエラーが発生します。
$start = mb_strpos($index, '<a name=gr1>');
致命的なエラー: 50331648 バイトの許容メモリ サイズが使い果たされました (11924760 バイトを割り当てようとしました)
この場合の文字列 $index の長さは 2981190 バイトで、PHP が割り当てようとした長さのちょうど 4 分の 1 です。
今、私が使用する場合
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 のソースで答えを見つけようとします。