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

时间:2009-07-29 14:41:33

标签: php caching

我正在使用PHP创建一个简单的缓存系统,但是我将在一次运行脚本中缓存多达10,000个文件。目前我正在使用一个简单的循环

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

($ id是一个随机字符串,分配给数据库中的一行)

但似乎有点慢,有没有更好的方法呢?另外我在某处读到某些操作系统上你无法在一个目录中存储成千上万的文件,这与CentOS或Debian有关吗?请记住,这个文件夹最终可能会有超过一百万个小文件。

我想的简单问题但是我不想扩展这些代码,然后发现我做错了,我现在只测试一次10-30页。

4 个答案:

答案 0 :(得分:3)

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

当您将这么多文件放入目录时,必须要跟踪这些文件。如果您这样做: -

ls -la

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

每次搜索,每次写入该目录都将涉及解析该大目录条目。

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

例如

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

这将使每个目录条目的大小保持很小,并加快IO操作。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

文件I / O通常比较慢。如果要循环超过1000个文件,将它们写入磁盘,则缓慢可能是正常的。

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

答案 3 :(得分:0)

您可能希望将memcached视为文件系统的替代方案。使用内存将大大提升性能。

http://php.net/memcache/