【问题标题】:PHP - Using Cron Jobs and GD togetherPHP - 一起使用 Cron Jobs 和 GD
【发布时间】:2014-09-29 13:47:52
【问题描述】:

我有一个基于客户的网站,需要他们上传图像,这样做时,我的脚本将使用 GD 库将图像的大约 25-30 个变体保存到服务器上。由于图像数量众多,目前客户在网站上继续等待的时间很长,直到所有图像都已创建和保存。在此之前他们无法继续进行,因此我们有大量客户离开网站。

是否可以在上传后将图像 url 存储在数据库表记录中,然后有一个 php 脚本创建 25-30 个图像,将数据库中的每条记录拉出并使用 cronjob 每天每 5 分钟运行一次。这样,它允许客户继续浏览网站并在“后台”自动创建图像

所有这些都在后台进行会不会对我的网站的速度造成任何问题?如果有 10 到 100 名客户同时使用它,它会减慢人们浏览网站的速度吗?

【问题讨论】:

  • 是的,您可以执行此操作,具体取决于您对运行jpegtran 时可能想要查看的图像所做的实际操作,这将产生比 GD 更好的优化图像。
  • 打开文件/etc/cron.d/image_processing并输入0-55/5 * * * * www-data /path/to/usr/bin/php /path/to/script,假设您的网络服务器用户是www-data。

标签: php performance cron gd


【解决方案1】:

我建议开始查看queues,更具体的是Gearman

这将减少您的客户的加载时间,因为您可以将图像的生成卸载到单独的服务器上。如果您需要更多处理能力,它可以轻松跨多个服务器扩展。

【讨论】:

  • 很遗憾,当前的共享服务器不允许使用 gearman,客户端也不会升级或更改。有其他选择吗?
  • 您可以使用外部队列,例如 IronMQ 或 Amazon Simple Queue Service。但话又说回来,如果您的客户不想升级,我认为他也不想为这些外部服务付费......
【解决方案2】:

与客户上传图像并实时等待处理完成时相比,使用 PHP 脚本处理图像不会导致 cron 作业出现更多延迟。所以简而言之,这种方法没有其他影响。

问题是,您需要确保您的 cron 作业具有自我意识并且不会产生重叠。例如,如果 cron 运行并花费超过 5 分钟来完成其当前任务,那么当第二个 cron 启动并开始处理另一个图像(或者如果您没有正确实施队列,则相同的图像)时会发生什么?那么现在你有两个 crons 正在运行,争夺资源。这意味着第二个也可能需要超过 5 分钟。最终,您可以同时运行 3、4 等 crons。因此,请确保您的 crons 仅在没有运行时才“启动”。

说了这么多,您最好让另一台服务器处理图像处理,具体取决于您客户网站的大小以及他们的流量有多大。您可以将云服务器与您的生产站点服务器放在一个集群中,该服务器可以通过本地网络连接以访问图像、处理图像并将 25-30 个副本返回到适当位置的服务器。这样,您的处理队列占用了面向公众的 Web 服务器的 0 资源,并且不会影响站点本身的速度。

【讨论】:

  • 你有关于我如何设置的文章/教程吗?我没有听说过或见过一个站点有多台服务器,所以不知道从哪里开始!
  • 实现多服务器设置将是这两个选项中更高级的一个,因为它需要将两个文件系统联网在一起,以便处理服务器可以读取/写入面向 Web 的服务器。我将从构建 cron 作业的简单系统开始,这样它就不允许重叠运行等,并让它在后台处理。从那里您可以在以后轻松扩展。
  • 谢谢布赖恩,我现在沿着这条路线走,并使用flock() 来确保没有重叠
【解决方案3】:

当然,您可以将图像的 PATH 存储在您的服务器上并稍后处理它。 创建 php 脚本,在运行时创建一个 LOCK 文件,即“/tmp/imgprocessor.lock”并在最后删除它,如果 cron 启动一个新进程,您首先检查该文件不存在。 我会将上传的图像存储在 pathtoimages/toprocess/ 中,并在处理后删除每个图像或将其移动到其他位置。在 ie /processed/ 中有新图像

这样你不需要查询数据库的图像路径,只需处理'toprocess'文件夹中的内容,你就可以在表中拥有UNIQ_NAME_OF_IMAGE。在加载 oage 之前在您的 Web 脚本中检查 UNIQ_NAME_OF_IMAGE 是否存在于“已处理”文件夹中,如果存在则显示它...

在服务器负载上,这取决于您最初拥有多少图像以及尺寸,图像处理在服务器上可能很繁重,但处理 1000 个用户 *30 个图像不会是一项繁重的任务,正如我所说的取决于图像的大小。

注意:如果你这样做,你需要确保在启动 cron 时,错误日志也输出到某个日志文件。 Cron 脚本必须是防弹的,即如果由于某种原因失败,LOCK 文件将保留,因此不会发生更多处理,您需要手动删除它(或创建自定义错误处理程序来删除它并可能发送一些邮件),您应该定期检查日志文件,以便了解发生了什么。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多