【问题标题】:Good way to handle temporary file situation in PHP在 PHP 中处理临时文件情况的好方法
【发布时间】:2012-10-04 16:34:25
【问题描述】:

我有一个 PHP 脚本,用户可以在其中上传图片。该图像存储在临时目录中并返回给用户。然后,用户可以使用 javascript 界面来裁剪图像。 (x1,y2)(x2,y2) 被发送到用于裁剪图像的脚本。然后将其返回给用户进行另一次预览和/或裁剪。一旦用户足够满意,他将单击“保存”。临时文件被复制到原始文件并删除临时文件。这些不是每个用户的图像,而是设备的图像。组织中的任何用户都可以替换任何设备图像。这种方法很好,但存在一些问题:

1) 假设用户上传了一张图片进行预览,但随后关闭了浏览器窗口。我将留下一个临时文件。这可能会成为一个问题。当然我可以让 CRON 清理它们,但理论上我可以拥有大量临时文件(这很难看)。 cron 还可以在编辑期间删除用户的临时文件。

2) 为了处理数字 1,我总是可以为每件设备创建一个临时文件,例如equip1.temp 和equip1.jpg。所有上传都存储在equip1.temp 中,所有提交都转移到equip1.jpg。如果两个用户同时尝试上传同一设备的图片,这可能会搞砸他们(极不可能 + 不是问题,但仍然很难看)

3) 我总是可以来回传递图像(用户“上传”图像,它被回显为<img src="base64....." />。生成的编辑 + 原始 base64 字符串被发送回 PHP 进行处理)。此解决方案缓解了临时文件问题,但我注意到来回发送高分辨率图像需要几秒钟。

你会如何处理这种情况?

【问题讨论】:

  • 使用选项#2,但也要在文件名中包含user id,如equip1-user123.temp
  • 如果 user123 离开计算机后再也没有回来怎么办?临时文件将永远存在。有 N 个用户,有 N*#ofequip 文件
  • 如果用户一次只允许编辑一张图片,您可以将文件名保存在用户表中。然后定期运行一个 cron 来删除用户表中不存在的任何文件。
  • 好主意。我将如何处理编辑图像并离开的用户?该文件将无限期地存在于用户表中。如果所有 N 个用户都这样做,我仍然有同样的问题。相反,我有一个 cron 只是每隔 X 秒删除一次临时文件,用户可以在编辑中间并擦除他的编辑。
  • 您还需要在表中添加一个last login 时间戳。在用户没有登录的一两个月后,删除他的临时文件。

标签: php image upload temporary-files


【解决方案1】:

我也遇到过类似的问题。如果我没记错的话(已经有一段时间了),我最终在数据库中创建了一个表来存储文件名和会话密钥/时间。每次加载脚本时,如果数据库中存在死会话,则删除相应的会话和图像/文件。

我不知道这是否是一个好的解决方案,但它为我解决了多用户访问问题。

【讨论】:

    【解决方案2】:

    由于你提到的原因,我不推荐#3。

    我建议你这样做:

    1. 用户将文件上传到一个随机的临时名称。 equip1.jpg 存储为 equip1_fc8293ae82f72cf7.jpg。确保您的脚本将同时处理两个文件名。它将允许两个用户上传相同的设备,最后一个上传的为获胜者,但不会发生冲突。
    2. 每次您的裁剪器使用临时图像时,您都应该“触摸”它以更新修改的时间。
    3. 让用户完成编辑,移动临时文件以代替最终图像名称。
    4. 有一个 cron 或上传脚本的一部分,用于删除 mtime 超过一小时左右的废弃临时文件。您认为这很混乱,因为可能存在大量临时文件,但是您是否希望放弃很多图像?垃圾回收是解决这个问题的一种非常标准的方法。

    【讨论】:

    • 如果用户上传、裁剪、预览并且直到 > 一个小时才提交(他必须去开会),那么他的工作将会丢失。
    • 我说了一个小时,因为我认为您最关心的是空间问题。您可以将其设置为 24 小时以上。在某些时候,如果用户在周末后回来,您将不得不处理该错误,但它会很好地处理大多数情况。
    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2014-08-24
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2020-12-01
    • 2012-02-22
    相关资源
    最近更新 更多