【发布时间】:2020-05-09 18:52:30
【问题描述】:
我花了半天时间才明白,我不知道该怎么办。 我有一个 XML 文件,其中包含 146 565 条名称和类记录以及导入 XML
public function parse() {
$start = microtime(true);
$q = 1;
while ($this->reader->read() && $this->reader->name !== 'licenses');
while ($this->reader->localName === 'licenses') {
$node = simplexml_import_dom($this->doc->importNode($this->reader->expand(), true));
$inn = (string) $node->inn;
$name = (string) $node->name;
$this->service->create($name, $inn);
}
echo 'Time script: ' . round(microtime(true) - $start, 4) . ' sec.';
}
当我使用 echo $name 而不是 $this->service->create($name, $inn); 时,它可以正常工作。我的屏幕上有 146 565 个名字。但是当我将它与我的服务一起添加到 MySql 中时,脚本并没有停止。当我将一个 1000 行的测试文件导入到数据库中时。
MariaDB [dbbase]> SELECT COUNT(1) FROM names_table;
+----------+
| COUNT(1) |
+----------+
| 248778 |
我的服务
public function create(string $name, string $inn): bool {
try {
$this->sth->execute([
':uuid' => Uuid::uuid4(),
':name' => $name,
':inn' => $inn
]);
return true;
} catch (RuntimeException $e) {
die($e->getMessage());
}
}
如何解决?我明白服务有问题,但我不知道该怎么办。我尝试不使用 return true 并使用它 - 脚本不会停止。
附言添加了 id (primary, auto_increment) 而不是 uuid - 结果相同。
【问题讨论】:
-
为什么你有 2 个
while迭代器? -
移动到第一个
节点。当我只使用 echo 时它可以工作 -
从 XML 中删除几乎所有的名称和类。离开1-2。如果问题不存在,那么可能是 XML 中的数据存在问题 - 例如,特殊字符会破坏服务。或者可能是文件大小的问题。如果即使只有 1-2 个名称和类仍然存在问题 - 删除类部分。检查名称部分是否运行顺利,如果不是,请尝试相反的方式。使用 xdebugger 并跟踪代码或将变量及其值转储到日志文件中,并检查代码的工作方式。
-
如果代码对 1-2 个名称/类没有问题,您可以使用二进制搜索,将一半放回原处。然后再次执行脚本。如果失败,再拿一半。如果没有失败,请检查最初的另一半以防万一。重复直到找到问题 - 如果问题在 XML 中
-
如果您能识别出一个重复的示例,请尝试从 XML 中仅提取该元素,并查看它如何仅使用该记录数据运行。
标签: php xml-parsing