【发布时间】:2011-02-10 06:32:05
【问题描述】:
我有一个图片托管服务,人们离线上传(他们上传到另一台计算机,比如没有互联网接入的电台),然后我们同步图片(在这个阶段它们没有水印),此时它们没有被批准.
有一个管理区域,用户可以去那里批准图像,我们将在这个阶段应用水印。
我想知道使用 PHP(一次)为 2000ish 图像加水印的最佳方法是什么。创建一个系统守护进程并等待响应是个好主意吗?
【问题讨论】:
标签: php
我有一个图片托管服务,人们离线上传(他们上传到另一台计算机,比如没有互联网接入的电台),然后我们同步图片(在这个阶段它们没有水印),此时它们没有被批准.
有一个管理区域,用户可以去那里批准图像,我们将在这个阶段应用水印。
我想知道使用 PHP(一次)为 2000ish 图像加水印的最佳方法是什么。创建一个系统守护进程并等待响应是个好主意吗?
【问题讨论】:
标签: php
在如此多的文件上执行这样的任务对于 php 来说并不是一个好主意,至少当您计划通过 HTTP 执行该脚本时是这样。原因是php脚本的超时时间,一般为30s(不宜设置太高)。
解决此类问题的最佳选择是创建直接在服务器上运行并自动转换任何新图像(或在被告知之后)的脚本或守护程序。因此,即使当前 php 脚本完成,它也会继续运行。例如,后台进程可以将统计信息更新到数据库中,php 脚本可以获取该数据库以获取有关该进程的信息。
另一种方法,我个人用于私人画廊的缩略图生成,是将大量任务拆分为更小的工作,这些工作可以在 30 秒的限制内轻松完成。就我而言,我将其限制为每次执行 50 张图片(它可能可以处理更多,但我想保证安全)。所以基本上我调用我的脚本,它从数据库中获取前 50 个尚未完成的文件名,对每个文件执行它的操作并返回。然后我只需单击 F5 让脚本执行接下来的 50 个文件。对于大约 2000 张图像,自动化 F5 命中可能是明智之举,例如,只需在页面上放置一个 javascript,在完全加载后刷新它。
如果您有可能使用第一个选项,请这样做,但我发现我的第二个选项对于共享主机非常有用(这是我目前使用的地方)。
【讨论】:
max_execution_time 仅适用于通过 Web 服务器(从浏览器)调用 PHP 时。如果有服务器端的PHP脚本直接运行(命令行),默认没有限制。
在 cron 中设置脚本,并在后台执行。
【讨论】:
最好的办法是在后台运行 Cron 作业/守护进程。但是,不要使用 PHP 脚本,只需使用带有 ImageMagick 的简单 bash 脚本。也就是说,如果您不必访问数据库或其他任何东西来获取图像。
如果您确实需要访问数据库,请使用 PHP,但调用 shell_exec() 以在正确的图像上运行 bash 脚本。如果你在 Windows 服务器上,你显然会改用批处理脚本。
【讨论】: