2012-08-25 21 views
6

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のソースで答えを見つけようとします。

+0

役立つかもしれませんか? http://www.php.net/manual/en/function.mb-strpos.php#81722 –

+0

PHPをアップグレードすることを検討しましたか?第1に、5.2はもはやサポートされなくなりました。第2に、5.3リリースと5.4リリースの両方でメモリ使用量が大幅に改善されました(特に5.3)。これらの改善に 'mb_strpos()'が含まれているかどうかは分かりませんが、いずれにしてもアップグレードする価値があります。 – Spudley

+0

あなたのアップデートは正しいと思います。多くのことが影響を受けるかもしれません... mb_detect_order、いくつか例を挙げると 'auto'または 'pass'の使用。 'iconv'を使うと、あなたの文字列が「うらやましい」ことを確認し、検出された/セットされたエンコーディングと一致することを確認するのに良い方法です。それらの1252の制御コードで何が起きているのかをプロファイルして確認したいと思います。ああ悪いmダッシュ。 – ficuscr

答えて

3

申し訳ありませんが、これらの潜在的な問題について既に考えている場合は、 http://www.serverphorums.com/read.php?7,552099

はチェックする:

マルチバイト文字列関数は、無効な文字がある場合は、mb_strpos()の場合のように(空の文字列またはfalseを返し、エラーのUTF-8エンコーディングをチェックしますあなたはfalse代わりの0を受けていないことを確認するために===演算子を使用して?

mb_strpos()関数は変換を(実行しなければならないとき、文字列のコピー(針、干し草の山)を行うmbfl_strpos()を、使用して取得している結果あなたが観察するように、メモリの増加につながるD):を通じて、すべてを聞かせてデフォルトの内部エンコーディング(ISO-8859-1)を使用している場合 https://github.com/php/php-src/blob/master/ext/mbstring/libmbfl/mbfl/mbfilter.c#L811

だから、私は思ったんだけど、とUTF-8エンコーディングが短い原因に短絡に対し、メモリの制限は、ヒットされました不正な文字と(関数は単に一致が見つからなかったことを表示させることになる、あなたは==でテストされた場合は、。)はfalseが返さ

フォートワースショット:)

+0

素敵なショット! 結果が 'false'か' 0'かをチェックするために 'assert()'と同様の関数を書いています。チェックは厳密に(===)実行されます。 しかし、私はなぜPHPが4回のstrlenメモリを必要とするのか理解していません - 実際、両方の引数をUTF-8に変換します(mb_internal_encoding()ではなく)。 あなたの研究と添付されている情報をありがとう! ;) – Dmitry

関連する問題