我有一个大的文本文件,它被检查是否有“错误的urls”。当针对这个列表处理一堆url时,每个url大约需要1秒来验证它不在该列表中。
下面是我当前的代码:
$badDomainsFile = file_get_contents(base_path().'/resources/txt/bad-domains.txt');
$badDomains = explode("\n",$badDomainsFile);
foreach ($badDomains as $badDomain){
if($badDomain===$domain){
$isBadDomain = true;
break;
}
}我想也许我可以用一些exec('grep -n $path')风格的代码来加快速度,但我在我的本地机器(windows)上遇到了问题,我相信文件路径在服务器(linux)上会有所不同?我本地机器上的laravel中的所有东西都是通过Homestead运行的,但我也很困惑,如果php脚本是针对该文件路径运行的,还是针对我自己的网站本地系统位置运行的?
还有没有其他的想法来加速这个脚本?(我尝试运行一个逐行fgets()样式的脚本,但每个url需要11秒。)
发布于 2020-01-21 16:11:04
一种可伸缩的解决方案是将列表保存在数据库中(MySQL或应用程序的其他部分),并让引擎负责优化。任何像样的DB引擎都允许索引和缓存开箱即用的列表。从而减少了加载时间并加快了搜索速度。
读取文件时,每次从磁盘加载整个文件并执行完全扫描时。此操作的复杂度为O(n)
从包含唯一项的索引列表中读取数据时,复杂性为O(1)
即使列表增长到数十亿个项目,对搜索速度的影响也是微不足道的。
发布于 2020-01-21 15:44:49
您正在从文件中读取。您可以尝试读取它一次并将其存储在某种缓存中,而不是像memcached或redis那样。它应该会给你带来更好的性能。
https://stackoverflow.com/questions/59836099
复制相似问题