原因
がのstartElement
として割り当てられているため、ハンドラはループ内で間接的に呼び出され続けます。start_element_handler
$xml_parser
startElement
while
xml_set_element_handler($xml_parser, "startElement", "endElement");
// code excluded for brevity
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
// code excluded for brevity
}
}
解決
XML が非常に大きく、最初の要素だけに関心があるために全体の解析にサイクルを費やしたくない場合は、to を使用してループ$count
からbreak
抜け出すことができます。while
while ($data = fread($fp, 4096)) {
if($count > 10) break;
if(!xml_parse($xml_parser, $data, feof($fp))) {
// code excluded for brevity
}
}
追加情報
$items
一度に 4096 バイトを読み取っているため、おそらく配列内に 10 個を超える項目が存在することになります。入力に応じて、その数をたとえば 2048 または 1024 バイトに減らすことができます。
可変範囲
関数に渡されない関数の外部でスコープを定義して使用する変数を使用している場合は、global
それらの変数を使用する前にキーワードを使用する必要があります。たとえば、プログラムの先頭近くで定義し、ハンドラーでそれ$count = 0
をインクリメントしたい場合、次のようになります。endElement
function endElement($parser, $name) {
global $count;
$count++;
}
array_slice
$items
次のように、配列の最初の 10 個の要素を除くすべてを取り除くことができます。
$output = array_slice($items, 0, 10);