PHP 5.2.10で簡単なWebパーサを作成しています。
(ISO-8859-1)デフォルトの内部エンコーディングを使用している場合、私は同じ関数呼び出しで常にエラーが表示されます。この場合にはPHPの文字列の内部表現
$start = mb_strpos($index, '<a name=gr1>');
Fatal error: Allowed memory size of 50331648 bytes exhausted (tried to allocate 11924760 bytes)
文字列$インデックスの長さは2981190でしたバイト - PHPが割り当てようとしていたバイト数のちょうど4倍です。今
、私は
mb_internal_encoding('UTF-8')
を使用した場合、エラーが消えます。つまり、PHPはマルチバイト文字列のためのシングルバイト文字列のためにより多くのメモリを使いますか?それはどのように可能ですか?何か案は?
UPD:メモリ使用量がエンコーディングに依存していないようです。average memory_get_usage()は、UTF-8とISO-8859-1を使用するとほとんど同じです。私は問題がmb_strposにあると思う。 実際、文字列$ indexにはWindows-1251エンコード(キリル文字)が含まれているため、UTF-8には無効な記号が含まれています。これにより、mb_strposが何らかの理由で追加のメモリを変換しようとしたり、単に使用しようとする可能性があります。 mb_strposのソースで答えを見つけようとします。
役立つかもしれませんか? http://www.php.net/manual/en/function.mb-strpos.php#81722 –
PHPをアップグレードすることを検討しましたか?第1に、5.2はもはやサポートされなくなりました。第2に、5.3リリースと5.4リリースの両方でメモリ使用量が大幅に改善されました(特に5.3)。これらの改善に 'mb_strpos()'が含まれているかどうかは分かりませんが、いずれにしてもアップグレードする価値があります。 – Spudley
あなたのアップデートは正しいと思います。多くのことが影響を受けるかもしれません... mb_detect_order、いくつか例を挙げると 'auto'または 'pass'の使用。 'iconv'を使うと、あなたの文字列が「うらやましい」ことを確認し、検出された/セットされたエンコーディングと一致することを確認するのに良い方法です。それらの1252の制御コードで何が起きているのかをプロファイルして確認したいと思います。ああ悪いmダッシュ。 – ficuscr