【问题标题】:Watermark 2000+ images at once?一次水印 2000 多张图像?
【发布时间】:2011-02-10 06:32:05
【问题描述】:

我有一个图片托管服务,人们离线上传(他们上传到另一台计算机,比如没有互联网接入的电台),然后我们同步图片(在这个阶段它们没有水印),此时它们没有被批准.

有一个管理区域,用户可以去那里批准图像,我们将在这个阶段应用水印。

我想知道使用 PHP(一次)为 2000ish 图像加水印的最佳方法是什么。创建一个系统守护进程并等待响应是个好主意吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    在如此多的文件上执行这样的任务对于 php 来说并不是一个好主意,至少当您计划通过 HTTP 执行该脚本时是这样。原因是php脚本的超时时间,一般为30s(不宜设置太高)。

    解决此类问题的最佳选择是创建直接在服务器上运行并自动转换任何新图像(或在被告知之后)的脚本或守护程序。因此,即使当前 php 脚本完成,它也会继续运行。例如,后台进程可以将统计信息更新到数据库中,php 脚本可以获取该数据库以获取有关该进程的信息。

    另一种方法,我个人用于私人画廊的缩略图生成,是将大量任务拆分为更小的工作,这些工作可以在 30 秒的限制内轻松完成。就我而言,我将其限制为每次执行 50 张图片(它可能可以处理更多,但我想保证安全)。所以基本上我调用我的脚本,它从数据库中获取前 50 个尚未完成的文件名,对每个文件执行它的操作并返回。然后我只需单击 F5 让脚本执行接下来的 50 个文件。对于大约 2000 张图像,自动化 F5 命中可能是明智之举,例如,只需在页面上放置一个 javascript,在完全加载后刷新它。

    如果您有可能使用第一个选项,请这样做,但我发现我的第二个选项对于共享主机非常有用(这是我目前使用的地方)。

    【讨论】:

    • 什么是更好的语言?我有 PHP、Perl、RoR?
    • @Steven:嗯,它是什么语言并不重要。当您通过 HTTP 执行任何脚本并且该脚本开始按顺序处理 2k 图像时,这将需要很长时间,并且网络服务器很可能会在脚本完成之前中断响应。如果您打算使用后台进程,那么您使用什么语言并不重要,您可以使用完成这项工作的本机程序或使用许多小工具来完成这项工作的 bash 脚本。
    • 30 秒 max_execution_time 仅适用于通过 Web 服务器(从浏览器)调用 PHP 时。如果有服务器端的PHP脚本直接运行(命令行),默认没有限制。
    • @Wiseguy:这就是为什么我将其称为“通过 HTTP 调用”,即通过网络服务器。当然,脚本可以按照自己喜欢的方式在单独的进程上运行,但两者(超时和 CLI 调用)都适用于任何其他语言..
    • 同意。我只是为了其他人的缘故澄清一下,PHP 并不总是受到执行时间限制,尤其是因为其他人建议使用 cronjobs(PHP 可以在没有此限制的情况下运行)。
    【解决方案2】:

    在 cron 中设置脚本,并在后台执行。

    【讨论】:

    • 小增量(不是一次全部)。您要确保您的 cron 不重叠,即您没有同时运行 2 个或更多单独的实例。您要么需要设置某种标志来指示您的处理(即,创建一个文本文件,检查它是否存在以确定它是否被锁定,然后在您停止处理时将其删除) - 或使用数据库。但实际上,PHP 并不是批量图像处理的理想语言。
    • // offtopic 嘿@John,我不知道你在 SO
    • 什么是更好的语言?我有 PHP、Perl、RoR?
    • @Jonah 几周前刚上任 :D 小世界!
    • @Steven ROR,因为它支持多线程(这就是我在选择更好的语言时所指的)
    【解决方案3】:

    最好的办法是在后台运行 Cron 作业/守护进程。但是,不要使用 PHP 脚本,只需使用带有 ImageMagick 的简单 bash 脚本。也就是说,如果您不必访问数据库或其他任何东西来获取图像。

    如果您确实需要访问数据库,请使用 PHP,但调用 shell_exec() 以在正确的图像上运行 bash 脚本。如果你在 Windows 服务器上,你显然会改用批处理脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      相关资源
      最近更新 更多