PHP将大量文件写入一个目录

问题描述:

我使用PHP来创建一个简单的缓存系统,但是我将在脚本的一次运行中缓存多达10,000个文件。目前我使用的是PHP将大量文件写入一个目录

$file = "../cache/".$id.".htm"; 
$handle = fopen($file, 'w'); 
fwrite($handle, $temp); 
fclose($handle); 

($ ID是被分配到排在数据库中随机字符串)

但似乎有点慢一个简单的循环,有没有更好的方法来做到这一点?此外,我还在某处读到某些操作系统上无法将数千和数千个文件存储在一个目录中,这与CentOS或Debian有关吗?请记住,该文件夹最终可能会有超过一百万个小文件。

简单的问题,我想,但我不想让这个代码缩放,然后发现我做错了,我现在只在一次测试10-30页。

请记住,在UNIX中,一切都是文件。

当你把许多文件放到一个目录中时,有些东西需要跟踪这些文件。如果你这样做: -

ls -la 

你可能会注意到'。'已经发展到一定的规模。这是存储10000个文件的所有信息的地方。

每次查找,每写入该目录将涉及解析该大型目录项。

你应该实现某种目录哈希系统。这将涉及在目标目录下创建子目录。

例如。

/somedir/a/b/c/yourfile.txt /somedir/d/e/f/yourfile.txt

这会保持每个目录条目非常小的规模,加快IO操作。

+0

好吧,这实际上很容易做到,因为我的系统会这样,谢谢,这是我正在寻找的信息。 – zuk1 2009-07-29 14:54:25

文件I/O一般来说比较慢。如果您循环使用超过1000个文件,将它们写入磁盘,则缓慢可能是正常的。

如果这是一个可行的选择,我会把它转移到夜间工作。

+0

嗯,我还可以拥有它,使其只在页面请求缓存,我在这种情况下,这将是一个更好的选择是不是? – zuk1 2009-07-29 14:51:50

您可以在一个目录中有效使用的文件数量不是操作。系统,但依赖于文件系统。

您可以通过获取文件名的md5散列来有效地拆分缓存dir,取其第一个1,2或3个字符并将其用作目录。当然,如果不是exsists,并且在从缓存中检索文件时使用相同的方法,您必须创建dir。

对于几万个,2个字符(从00到ff的256个子集)就足够了。

你可能想看看memcached作为文件系统的替代。使用内存将带来巨大的性能提升。

http://php.net/memcache/