如何在PHP中保存文件,并在可能出现故障的情况下将文件特征保存到数据库中


How to save a file in PHP and save file characteristics to a database conditional on possible failure

我将一个文件保存到服务器,并将文件名、上传该文件的个人的用户id以及有关该文件的各种其他信息保存到PostgreSQL数据库。理想情况下,我希望以一种类似于数据库事务的方式来构建它。也就是说,应该出现以下情况之一:

  1. 保存文件
  2. 如果成功,将信息保存到数据库
  3. 如果保存信息到数据库失败,删除文件

  1. 保存信息到数据库
  2. 如果成功,保存文件
  3. 如果保存文件失败,从数据库中删除信息

这个方法的唯一问题是步骤3可能会失败——也就是说,您可能保存了一个文件,但数据库中没有相应的信息,或者您可能有数据库信息,但没有保存相应的文件。

我想知道的是,是否有一种方法可以使用上述两种方法中的任何一种,同时确保步骤3总是发生,或者以足够的可靠性发生,从而我有效地不必担心失败。

请注意,我使用的是PostgreSQL数据库,并使用GD库中的imagegif, imagejpegimagepng函数保存映像文件。

编辑

为了回应下面Jack的坚实评论,我忘了提到我是通过API服务器与DB交互的,所以我不是直接与DB交互,而是向API发送REST请求,API反过来与DB交互。这实际上意味着我不能将两个数据库交互放在一个事务中。

我不确定你想要什么,但也许像这样:

if(move_uploaded_file(...)){
  if(!mysql_query(...)){
    unlink(...);
  }
}

如果我没有理解你的问题,或者我对你的问题一直很宽容,请原谅我。

我决定选择一种次优但仍然可行的路线,即运行定期检查,为每个文件名搜索数据库条目,如果无法找到数据库条目,则删除该文件。(如果有人真的对代码细节感兴趣,我很乐意在编辑中提供。)

相关文章: