原因
由于startElement 被分配为$xml_parser 的start_element_handler,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 非常大,并且您不想花费循环解析整个内容,因为您只对开头的元素感兴趣,您可以使用 $count 到 break 的 @987654329 @循环:
while ($data = fread($fp, 4096)) {
if($count > 10) break;
if(!xml_parse($xml_parser, $data, feof($fp))) {
// code excluded for brevity
}
}
其他信息
因为您一次读取 4096 个字节,所以您的 $items 数组中可能会包含 10 多个项目。您可以根据您的输入将该数字减少到 2048 或 1024 个字节。
变量范围
如果您使用定义的变量并使用未传递给它的函数之外的范围,则必须在使用这些变量之前使用global 关键字。例如,如果您在程序开头附近定义了 $count = 0 并希望在您的 endElement 处理程序中增加它,它应该看起来像这样:
function endElement($parser, $name) {
global $count;
$count++;
}
array_slice
您可以像这样删除 $items 数组的前 10 个元素以外的所有元素:
$output = array_slice($items, 0, 10);