保持数据库与文件系统上的图片同步[PHP/Postgresql/Linux]

Sta*_*use 5 php filesystems postgresql transactions data-storage

背景故事

我维护并且正在重新设计几个基于PHP的Web应用程序,有一个主题我还没有找到一个优雅的解决方案,所以我正在寻找一些可能导致我更好的方法做到这一点.

当前状态

我的一些应用程序允许用户存储除大量数据之外的图像.所有数据最终都在PostgreSQL集群中,但是为了性能和可维护性,我选择不将图像本身存储在数据库中.图像将其元数据存储在数据库中(例如原始文件名,宽度/高度等),一旦数据库事务成功,我将文件系统上的图像移动到图像目录(存储为.jpg).

问题

所有这些功能都很好,但是由于应用程序被大量使用,并且由多个人同时使用,并且在互联网上,并且PHP的错误/异常处理在所有情况下都不是最可靠的,我偶尔担心不会能够包装存储数据库事务中的图像(在文件系统上)(因为它发生在文件系统上).我也很担心,因为如果图像文件在文件系统上被破坏/更改/删除,数据库的记录将无法正确更新(没有参照完整性).

解决方案

到目前为止我想出的是:

选项A)将实际图像(不仅仅是元数据,而是整个二进制文件)存储在数据库中. - 我不喜欢这个,因为目前数据库虽然非常复杂,但仍然很小(不超过60MB).相关的图像总共有很多GB,所以它会大量增加我的PostgreSQL安装的占用空间.此外,它将使我的数据库备份和复制方案复杂化.

选项B)保持当前设计(文件系统上的图像,postgres中的数据),并尝试在应用程序级别使用它的每个点处计算损坏的数据. - 它使应用程序更加复杂和错误.

选项C)我找到了一个名为Flourishlib的PHP ORM框架,它包含一个模拟文件系统事务的文件系统类(基本上,如果你调用$ file-> rename(),它会检查是否可以,但实际上没有重命名直到你提交事务) - 这是我到目前为止找到的最好的解决方案,但是我已经使用了另一个ORM框架(Propel),我更喜欢这个大小的项目,所以我需要2个框架,功能大不相同.

SOOO

所以,我认为这里的许多其他人之前会遇到同样的"问题",我肯定有些人提出了一些我还没有想到的解决方案.感谢任何指针,建议或批评.

小智 1

在我看来,这是两个不同的问题。

第一个:如何保证完整性,您已经以某种方式解决了这个问题。我唯一要考虑的是在数据库事务期间执行文件系统操作,并在出现问题时回滚。这里的权衡是性能,因为文件系统操作相当慢,但也不是那么慢;)你可以尝试一下......

第二个:外部文件操作后如何保持完整性。在这里我建议使用 php PHPInotify看一下 inotofy 。它允许您实现观察者模式,以便在文件系统发生更改时收到通知。