4

我目前正在调整我们为网站存储图像的方式。对于每个用户,我都想查看他们是否有个人资料图像,我正在通过检查文件是否存在于他们的文件夹结构中来做到这一点。这比在数据库表中存储/检索图像的名称更快吗?

我当前的 file_exists 代码如下所示:

$gender = ($gender == 1) ? 'female' : 'male';

$filename = SITE_ROOT . $this->img_url . $user_id . 'medium_thumb.jpg';

if (file_exists($filename)) {
    $filename = $this->img_url . $user_id . 'medium_thumb.jpg?v=' . time();
}
else {
    $filename = '/images/'.$gender.'.jpg';
}       

return $filename
4

6 回答 6

8

file_exists()即使文件名完全存储在数据库中,我也建议您使用——当错误导致您的数据库与文件系统不同步时,这将为您提供合理的回退。对这类事情进行多级错误处理是件好事。

鉴于此,这个问题是不必要的,因为你会file_exists()在任何一种情况下使用。

此外,我建议抵制对代码进行微优化的诱惑。除非您进行大量调用file_exists(),否则它不会对您的程序速度产生巨大影响。在这个级别上尝试微调你的表现通常是不必要的。

如果您担心代码的性能,请使用 XDebug 等分析工具来向您展示真正的性能瓶颈在哪里。你会有一些,但我保证它们不会出现在你在这里查看的代码中,除非它是循环的。

于 2012-07-27T12:37:40.653 回答
1

我认为 file_exists 更快。在使用 sql 时,您必须访问驱动程序等,file_exists 是一个系统操作。

于 2012-07-27T12:33:08.587 回答
1

不要将所有图像存储在一个文件夹中;使用子文件夹 - 否则 I/O 会导致巨大的性能损失(当你有 10k+ 个文件时会很明显;有 100k+ 个文件会很大)

确保图像由轻量级 Web 服务器提供服务,例如 nginx,而不是来自 apache,因为 apache 占用太多资源。

现在谈谈这个问题。通常文件系统会更快。但是,文件系统很难跨不同的服务器扩展。例如,如果您有 2 个 Web 服务器,您将从哪一个服务器中为头像提供服务?您需要复制所有服务器上的所有文件,或者使用共享磁盘,或者使用分布式文件系统。因此,您不仅要牢记性能,还要牢记水平可扩展性。

此外,您可以对文件使用缓存,例如Varnish

于 2012-07-27T12:34:11.930 回答
0

在我看来,从短期来看,你的方法会更快。但是,如果您从数据库中获取图像名称并存储在会话中,那么从长远来看,它会更快,因为您可以每次从会话中检索该页面访问的值,而不是检查服务器上是否存在文件或不是。

于 2012-07-27T12:29:47.163 回答
0

由于答案取决于很多变量,我建议运行一个简单的测试来回答您的问题“哪个更好?” 以及相关的问题“好多少?”:

使用 curl(或您最喜欢的自动 HTTP 客户端)访问您的基于文件的代码 1000 次,并测量客户端经过的时间和服务器端消耗的资源,然后对您的基于数据库的代码执行相同的操作。

如果值很小,请多次运行测试(或者可能将测试大小增加到 10000)。

于 2012-07-27T12:32:22.583 回答
0

我认为,查询数据库将花费更多时间,因为最终它也会进入磁盘。

我的意思是,如果你检查磁盘,你有一个操作,但是对于数据库,你连接到数据库,然后它进入磁盘(存储 db 文件的地方)。所以,文件系统应该更快(虽然我还没有对它进行基准测试!)。

于 2012-07-27T12:34:32.073 回答