我正在寻找查询"id"是否有与文件系统中名称相同的ID的文件夹,我做到了,但它会减慢驱动器的速度,
将来有很多文件$query = Model::all();
if(Input::get('field') == 'true'){
$filenames = scandir('img/folders');
$query->whereIn('id', $filenames);
}
如您所见,这将扫描并获取"文件夹"目录中所有文件夹的名称并使用它创建一个数组,现在我的应用程序将来将拥有数十万个文件夹,我想在它发生之前解决它,感谢您的进一步帮助
PS:欢迎其他不同做法的提议
您是否有充分的理由相信具有大量文件夹的目录上的 scandir 实际上会减慢您的速度?
您可以像这样执行查询:
if(Input::has('field')){
$filenames = scandir('img/folders');
$query = Model::whereIn('id', $filenames)->get();
}
编辑 1
您可能会发现这些链接很有用:
PHP: scandir() 太慢了
获取目录中的文件
编辑 2
链接中有一些非常好的建议,您应该能够使用这些建议作为指导来进行自己的实现。在我看来,根据我所做的第一次编辑中包含的链接,您的选项是使用 DirectoryIterator
、readdir
或带有 scandir
的分块。
这是一种非常基本的方法,但我想你可以像这样用 readdir 做一些事情:
$ids = Model::lists('id');
$matches = [];
if($handle = opendir('path/to/folders'))
{
while (($entry = readdir($handle)) !== false)
{
if(count($ids) === 0)
{
break;
}
if ($entry != "." && $entry != "..")
{
foreach ($ids as $key => $value)
{
if($value === $entry)
{
$matches[] = $entry;
unset($ids[$key]);
}
}
}
}
closedir($handle);
}
return $matches;