【发布时间】:2025-12-08 10:40:01
【问题描述】:
好的,这是我的问题。我有一个包含近 180,000 个链接的 HTML。我正在创建一个 dom 以提取这些链接,然后将它们添加到数组中以供以后处理。
我遇到的问题是,我已经对此进行了一些研究,每次迭代时 foreach 都会逐渐变慢。我已经查看了 for 与 foreach 的比较,并且从我正在阅读的内容来看,这是最快的方法。就我而言,它仍然非常缓慢。
这是前 30,000 个链接的进度日志。前 5,000 个在大约一秒钟内完成。最后一千,10秒。当它达到 80,000 时,它需要 30 秒才能完成 1,000。
2021-07-12 17:07:01 : 30000 links
2021-07-12 17:06:51 : 29000 links
2021-07-12 17:06:42 : 28000 links
2021-07-12 17:06:34 : 27000 links
2021-07-12 17:06:26 : 26000 links
2021-07-12 17:06:18 : 25000 links
2021-07-12 17:06:11 : 24000 links
2021-07-12 17:06:02 : 23000 links
2021-07-12 17:05:48 : 22000 links
2021-07-12 17:05:35 : 21000 links
2021-07-12 17:05:26 : 20000 links
2021-07-12 17:05:18 : 19000 links
2021-07-12 17:05:12 : 18000 links
2021-07-12 17:05:05 : 17000 links
2021-07-12 17:04:59 : 16000 links
2021-07-12 17:04:55 : 15000 links
2021-07-12 17:04:52 : 14000 links
2021-07-12 17:04:50 : 13000 links
2021-07-12 17:04:47 : 12000 links
2021-07-12 17:04:45 : 11000 links
2021-07-12 17:04:43 : 10000 links
2021-07-12 17:04:41 : 9000 links
2021-07-12 17:04:40 : 8000 links
2021-07-12 17:04:38 : 7000 links
2021-07-12 17:04:38 : 6000 links
2021-07-12 17:04:37 : 5000 links
2021-07-12 17:04:36 : 4000 links
2021-07-12 17:04:36 : 3000 links
2021-07-12 17:04:36 : 2000 links
2021-07-12 17:04:36 : 1000 links
我已经完成了 set_time_limit(1000) 并且在计时器用完之前还没有完成所有这些。
这是我拥有的似乎运行速度最快的代码。我还尝试过执行 do/while 循环并取消设置对象的第一个元素。那是个坏主意。
请告诉我有一种方法可以让 PHP 完成后 1000 次的速度与前 1000 次速度一样快。
$content = $dom->getElementsByTagname('a');
$count = 0;
$this->write_log(count($content) . " total links");
foreach ($content as $item) {
$count++;
if ($count % 1000 == 0) {
$this->write_log($count . " links");
}
$item = rtrim($item->getAttribute('href'), '/');
if (filter_var($item, FILTER_SANITIZE_URL)) {
$this->DocInfo->links[] = $item;
}
}
谢谢
*使用 cOle2 的代码编辑日志:
2021-07-12 18:35:14 : 26000 links
2021-07-12 18:35:03 : 25000 links
2021-07-12 18:34:53 : 24000 links
2021-07-12 18:34:41 : 23000 links
2021-07-12 18:34:29 : 22000 links
2021-07-12 18:34:21 : 21000 links
2021-07-12 18:34:14 : 20000 links
2021-07-12 18:34:05 : 19000 links
2021-07-12 18:33:56 : 18000 links
2021-07-12 18:33:47 : 17000 links
2021-07-12 18:33:39 : 16000 links
2021-07-12 18:33:34 : 15000 links
2021-07-12 18:33:31 : 14000 links
2021-07-12 18:33:25 : 13000 links
2021-07-12 18:33:22 : 12000 links
2021-07-12 18:33:18 : 11000 links
2021-07-12 18:33:16 : 10000 links
2021-07-12 18:33:14 : 9000 links
2021-07-12 18:33:12 : 8000 links
2021-07-12 18:33:11 : 7000 links
2021-07-12 18:33:11 : 6000 links
2021-07-12 18:33:10 : 5000 links
2021-07-12 18:33:10 : 4000 links
2021-07-12 18:33:10 : 3000 links
2021-07-12 18:33:10 : 2000 links
2021-07-12 18:33:09 : 1000 links
【问题讨论】:
-
去掉日志部分会不会更快?
-
我已经玩了一点,因为它确实将日志写入 MySQL 表。但即使我将模数设置为 10,000,它仍然会越来越慢。我在每次运行之前清空表,日志功能只是一个简单的插入。
-
尝试只是迭代,不要做任何工作,虽然你仍然可以登录,看看是否更快
-
是的,现在我很困惑。我按照建议禁用了这项工作。逐渐变慢。我禁用了日志记录,而只是回显了日期和计数。还是越来越慢。这是 wp 插件的一部分,所以我不确定 wp 是否会减慢此输出。我正在使用 JS 来显示日志。把它剪掉,看看有没有效果。谢谢!
-
禁用了我的 js,只是回显了时间和日期,仍然越来越慢。